欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

汇编-串操作指令

最编程 2024-08-13 16:51:15
...

串传输指令基础知识简介

1. 系统标志寄存器EFLAGS

DF: 方向标志位。在串处理指令中,控制每次操作后si, di的增减

DF=0  每次操作后si,di递增

DF=1  每次操作后si,di递减

 

2. std指令功能

将系统标志寄存器EFLAGS中的DF(方向标志)置为1, 即 DF=1

3. cld指令功能

将系统标志寄存器EFLAGS中的DF(方向标志)置为0, 即 DF=0

4. movs:串传送指令

语法格式:movsb、movsw

说明:

(1)将DS:[SI]的内容传送到ES:[DI]

(2)若DF=0,则DI增加1,2、4。否则DI减少1,2、4

5. stos:串存储指令

语法格式:stosb、stosw、stosd

说明:

(1)将AL\AX\EAX寄存器的值复制到ES:DI所指的内存单元

(2)若DF=0,则DI增加1,2、4。否则DI减少1,2、4

6. scas:串扫描指令

语法格式:scasb、scasw

说明:

(1)将ES:[DI]所指向的内容与AL/AX/EAX(字节/字/双字)进行比较,并依据所得到的差值来设置相关标志位。受影响的标志位: AF,CF,OF,PF,SF,ZF

(2)若DF=0,则DI增加1,2、4。否则DI减少1,2、4

7. rep:重复前缀指令

    rep指令重复其后指定的字符串操作指令,重复的次数由计数寄存器cx来决定

8. 使用串相关指令的方法:

(1)传送的原始位置:ds:si

(2)传送的目的位置:es:di

(3)传送的方向:DF

(4)传送长度:cx

9. 算数和逻辑操作地址

10. 示例如下:

(1)#define copy_page(from,to) \

__asm__("cld ; rep ; movsl"::"S" (from),"D" (to),"c" (1024))      // 从from处复制1页内存到to处(4K字节)

(2)unsigned long get_free_page(void)

{
register unsigned long __res asm("ax");

__asm__("std ; repne ; scasb\n\t" // 置方向位,al(0)与对应每个页面的(di)内容比较
"jne 1f\n\t" // 如果没有等于0的字节,则跳转结束(返回0).
"movb $1,1(%%edi)\n\t" // 1 => [1+edi],将对应页面内存映像bit位置1.
"sall $12,%%ecx\n\t" // 页面数*4k = 相对页面其实地址
"addl %2,%%ecx\n\t" // 再加上低端内存地址,得页面实际物理起始地址
"movl %%ecx,%%edx\n\t" // 将页面实际其实地址->edx寄存器。
"movl $1024,%%ecx\n\t" // 寄存器ecx置计数值1024
"leal 4092(%%edx),%%edi\n\t" // 将4092+edx的位置->dei(该页面的末端地址)
"rep ; stosl\n\t" // 将edi所指内存清零(反方向,即将该页面清零)
"movl %%edx,%%eax\n" // 将页面起始地址->eax(返回值)
"1:"
:"=a" (__res)
:"0" (0),"i" (LOW_MEM),"c" (PAGING_PAGES),
"D" (mem_map+PAGING_PAGES-1)
);
return __res; // 返回空闲物理页面地址(若无空闲页面则返回0).
}