汇编复习2
串处理指令
1. MOVS:传送字节,字,双字,从SI所指的串中,复制到DI所指的串,传递以后,SI,DI的值都会被修改,向前或向后取决于DF的值。2. MOVSB,MOVSW,MOVSD则直接指定了一次传输的大小(他们已经默认了使用SI,DI),MOVS需要自己设定,他们与REP配合使用,可以将整个串都复制,REP的循环次数,取决于CX。
3. CLD 使DF为0,STD使DF为1
4. STOS :传入串指令,将AL,AX,EAX中的内容传入由DI指向的地方,传入后DI将会改变
5. LODS:取串指令,将SI所指的内容放到AL,AX,EAX中,同样,传入后,SI的值将改变
6. INS DST,DX:将端口号在DX中的I/O空间的字节,字,双字传入DI所指地方。
7. OUTS DX,SRC;
8. REPE,REPZ相等/为0时重复(CX=0或 CF=0(不相等)使退出)
9. CMPS 串比较指令,SI,DI所指的相减,不保存结果,只改变标志位。
10. SCAS :串扫描指令,将DI所指的内容与AL,AX,EAX进行比较,只保留标志位 比较原理还是相减,最后看ZF
11. 当使用REP这些重复语句时,需要注意,及时匹配成功以后,DI,SI的值还是会跳向下一个位置。
12. 串处理指令使用的注意事项:他们在不同的段直接传送数据或比较数据,如果需要在同一段内处理数据,可以在DS和ES中设置同样的地址,或者在源操作数中使用段跨越前缀来实现。
控制转移指令
1. 无条件跳转JMP:段内转移:指在同一段的转移,此时只要改变IP的值就行。段间转移,则还需要改变CS寄存器的内容。易错点
1. 有效地址和物理地址,有效地址是指没有加上段地址偏移的地址,物理地址是确定的地址。2. ASSUME伪操作只是指定某个段分配给哪一个段寄存器。它并不能把段地址装入寄存器中,所在段地址中,还需要把段地址给寄存器。如果有堆栈段,也需要把段地址装入SS中,但是代码段CS却不需要这样,因为它在程序初始化时完成。
3. EQU 表达式赋值,将变量或表达式的结果赋给它。
4. $ 在指令中,它表示本条指令的第一个字节的地址,用在伪操作中,它表示地址计数器的当前值。
5. ORG用来设置当前地址计数器的值
6. 数值送回操作:type 返回该变量的字节数,length 返回多少个 dup,size返回 length*type,offset 返回变量的首地址。seg 返回段地址。
7. MOV [BX],[SI] 是错误的,因为他们等价于两个存储器操作数(使用偏移,段地址的都属于存储器操作数)
8. MOV AX,[SI][DI],[SI],[DI]不能同时使用,AX不能使用段超越,
9. CS不能做目的寄存器
10. 立即数不能做目的操作数 ,cmp 15,ax
11. bp:是基址指针,段地址默认在SS中, bp 是一个字大小16位
12. DX不能用于存储器寻址,寄存器相对寻址时,只能用 bx、si、di、bp,不能使用其它的寄存器。
13. JMP 的跳转, 可以short OPR,near ptr OPR, word ptr OPR,far ptr....