汇编-第8课移位指令和串操作指令
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
目的数据串如图 16 实现:如图 17
图 15 图 16
执行以后:如图 18
图 17 图 18
数据串已经成功拷贝.
串存储 STOS 指令模拟 memset 的功能
如图 19 目的数据串默认有内容
实现:如图 20 执行后,如图 21
图 19 图 20
目标数据串已经被清零了.
图 21
串比较 CMPS 指令模拟 memcmp
mov reg,[si] mov [di],reg add si,2 或者 sub si,2 add di,2 或者 sub di,2 char *pi,*pd *pd = *ps; ps+=2;或者 ps-=2; pd+=2;或者 pd-=2;
MOVSD(32 位指令)
汇编解释该指令: 等价于 C 语言中的
串存储指令
STOSB
汇编解释该指令: 等价于 C 语言中的
mov [di],al inc di;或者 dec di char *pdi *pdi = al; pdi++;或者 pdi--;
STOSW
汇编解释该指令: 等价于 C 语言中的
mov reg,[si] mov [di],reg add si,2 或者 sub si,2 add di,2 或者 sub di,2 word *pdi *pdi = ax; pdi++;或者 pdi--;
串扫描指令
SCASB
汇编解释该指令: 等价于 C 语言中的
cmp al,es:[di] inc di 或者 dec di byte *pdi = "……"; if(al - *pdi) psi--;或者 psi--;
SCASW
汇编解释该指令: cmp ax,es:[di] add di,2 或者 dec di,2
循环移位指令
不带进位循环左移
ROL reg/mem,1/CL 如图 7 图7
11110000,不带进位的循环左移一位,得到 11100001,则 BL=E1,CF=1,如图 8
图8
不带进位循环右移
ROR reg/mem,1/CL 如图 9 图9
11110000,不带进位的循环右移一位,得到 01111000,则 AL = 78,CF=0,如图 10
cmp byte ptr ds:[si],es:[di] inc si;或者 dec si inc di 或者 dec di byte *psi = "……"; byte *pdi = "……"; if(*psi - *pdi) psi++;或者 psi--; pdi--;或者 pdi--;
CMPSW
offset(伪指令,写给编译器看的)
例如:mov si,offset source 取偏移地址
编译器取地址,编辑器看成是一个常量,立即数寻址
seg(伪指令,写给编译器看的)
例如:mov si,seg source 取段地址,编译器取地址,编辑器看成是一个常量,立即数寻址
取模公式:
正数: A%B (B=2^n) 等价于 AND A,(B-1)
等价于 C 语言中的 word *pdi = "……"; if(ax - *pdi) pdi--;或者 pdi--;
相当于 C 语言中的 memchr 找一个特定的字符
重复前缀指令
无条件重复Βιβλιοθήκη Baidu令
REP 配合不影响标志的串指令 CX 位重复次数, 当 CX=0 退出重复.
有条件重复指令
REPZ 和 REPNZ 配合影响标志的串指令
LODSD(32 位)
汇编解释该指令: 等价于 C 语言中的
mov eax,[esi] add esi,4;或者 sub esi,4 DWORD *psi = "……";
eax = *psi; psi++;或者 psi--; 相当于 C 语言中遍历数组的功能.
串比较指令
CMPSB
汇编解释该指令: 等价于 C 语言中的
mov reg,[esi] mov [edi],reg add esi,4 或者 sub esi,4 add edi,4 或者 sub edi,4 char *pi,*pd *pd = *ps; ps+=4;或者 ps-=4; pd+=4;或者 pd-=4;
相当于 C 语言中的 memcpy 的功能.
CMPSD
汇编解释该指令
cmp eds:[esi],ees:[edi] add esi,4;或者 sub esi,4 add esi,4 或者 sub edi,4
等价于 C 语言中的 相当于 C 语言中的
DWORD *psi = "……"; DWORD *pdi = "……"; if(*psi - *pdi) psi++;或者 psi--; pdi--;或者 pdi--; memcmp 的功能.
串操作指令(相当于 C 语言中针对于数组的操作)
源操作数默认 DS:[SI] 允许段超越. 目的操作数 ES:[DI] 不允许段超越. 每执行一次,si,di 自动修改。 使用 CLD ,DF=0 地址自增 使用 STD,DF=1 地址自减
串传送
B 结尾表示字节操作,W 结尾表示字操作,D 结尾表示双字操作.
串读取指令
LODSB
汇编解释该指令: 等价于 C 语言中的
mov al,[si] inc si;或者 dec si byte *psi = "……"; al = *psi; psi++;或者 psi--;
LODSW
汇编解释该指令: 等价于 C 语言中的
mov ax,[si] add si,2;或者 sub si,2 word *psi = "……"; ax = *psi; psi++;或者 psi--;
图 13 CF=0, 11110000 相当于 0 11110000 循环右移一位,得到 CF = 0 AL = 01111000, 则 AL=78,如图 14
图 14
循环移位指令对标志的影响
按照指令功能设置进位标志 CF 不影响 SF、ZF、PF、AF 如果进行一位移动,则按照操作数的最高符号位是否改变,相应设置溢出标志 OF:如果移 位前的操作数最高位与移位后操作数的最高位不同(有变化),则 OF = 1;否则 OF = 0。 当移位次数大于 1 时,OF 不确定
MOVSB
汇编解释该指令:
等价于 C 语言中的
mov reg,[si] mov [di],reg inc si;或者 dec si inc di 或者 dec di char *ps,*pd *pd = *ps; ps++;或者 ps--; pd++;或者 pd--;
MOVSW
汇编解释该指令: 等价于 C 语言中的
汇编-第 8 课移位指令和串操作指令
2012 年 11 月 21 日 星期三 18:28
移位指令 逻辑移位:
逻辑左移
SHL reg/mem,1/CL 如图 1:
图1 11110000 左移一位,得到 11100000,CF=1 所以 AL = E0 .如图 2
图2
逻辑右移
SHR reg/mem,1/CL 如图 3
图3 11110000 逻辑左移一位,得到 11100000,CF=1 所以 AL = E0 . 然后 11100000 逻辑右移一位,得到 01110000,CF=0,所以 AL= 70.如图 4
图4
算术左移
SAL 和 SHL 一样 算术右移(最高位补符号位)
SAR reg/mem,1/CL 如图 5
如图 22 源数据串
如图 23 目的数据串
图 22
实现 如图 24
图 23
执行后,如图 25
图 24
AL=0 表示两数据串相同.
图 25
串扫描 SCAS 指令模拟 memchr
目标数据串 如图 26
实现如图 27
图 26
执行后,如图 28 找到了空格.
图 27
图 10
带进位的循环左移(CF 参与了移位,可以看做是 17 位) RCL reg/mem,1/CL 如图 11
图 11 11110000, CF = 0,相当于 0 11110000 循环左移一位 ,得到 CF = 1, 11100000, 则 AL=E0,如图 12
图 12
带进位的循环右移 RCR reg/mem,1/CL 如图 13
图5 11110000 算术右移一位,得到 11111000,AL=F8 CF = 0,如图 6
图6
等价关系
SHL A,n SHR A,n SAL 同 SHL
等价于 等价于
A * 2^n └A/2^n┘
(└ ┘:向下取整)例如└1.5┘=1
SAR A,n 等价于 └A/2^n┘ (当 A>=0 时, 等价于 A/2^n) C 语言是向 0 取整 向下取整是向负无穷找最接近本身的整数. 对于除法结果为负数的情况,不能直接用移位来替代. 调整方法: 定理: x/y 当 x<0,y=2^n,可以用 (x+y-1) >>n 来替代
STOSD(32 位指令) 汇编解释该指令:
mov reg,[esi] mov [edi],reg add esi,4 或者 sub esi,4 add edi,4 或者 sub edi,4 等价于 C 语言中的 DWORD *pdi *pdi = eax; pdi+=1;或者 pdi-=1; 相当于 C 语言中 memset 的功能.
8086 对于逻辑移位和算术移位的限制
SHL,SHR,SAL ,SAR 当移位不止一次的时候,CL 用来保存移位的次数 对于标志的影响: 按照移入的位设置进位标志 CF,根据移位后的结果影响 SF、ZF、PF,对 AF 没有定义, 如果进行一位移动,则按照操作数的最高符号位是否改变,相应设置溢出标志 OF:如果移 位前的操作数最高位与移位后操作数的最高位不同(有变化),则 OF = 1;否则 OF = 0。 当移位次数大于 1 时,OF 不确定.
REPZ/REPE 每执行一次,cx--;并判断 ZF 是否等于 0,只要 CX=0 或者 ZF=0,重复执行结束 REPNZ/REPNE 每执行一次,cx--;并判断 ZF 是否等于 1,只要 CX=0 或者 ZF=1,重复执行结束
串传送 MOVS 实现指令模拟 memcpy 的功能
源数据串如图 15
汇编解释该指令 等价于 C 语言中的
cmp word ptr ds:[si],es:[di] add si,2;或者 sub si,2 add si,2 或者 sub di,2 word *psi = "……"; word *pdi = "……"; if(*psi - *pdi) psi++;或者 psi--; pdi--;或者 pdi--;