目录
1.lea 和 offset比较
例题:假设myword是一个字变量,指出下列语句的错误原因:
mov bx,offset myword[si]
原因:寄存器的值只有程序执行时才能确定,而offset是汇编过程计算的偏移地址,故无法确定,应该改为:
lea bx,myword[si]
lea vs offset
lea 是机器指令,offset 是伪指令。
lea bx,myword[si] ; 在实际执行时才会将myword[si]的地址放入bx
mov bx,offset myword[si] ;在编译时就需要计算出myword[si]的偏移地址,但是寄存器si的值只有在执行时才能确定,所以不可以!
2.cmp正确使用
(1) 目标操作数不能为立即数
(2) 不能同时为存储器
例:假设x,y是已经定义的变量,下列哪些指令是非法的?
(1)CMP 15,BX
(2)CMP X,25
(3)CMP X,Y
(4)CMP AX,X
答:
(1)CMP 15,BX
立即数只能用作源操作数,这里用作目的操作数
(2)CMP X,25
正确
(3)CMP X,Y
两个操作数不能都是内存单元
(4)CMP AX,X
若X定义为字类型,正确;否则,错误,类型不匹配。
3.db,dw,dd的区别
db定义字节类型变量,一个字节数据占1个字节单元,读完一个,偏移量加1
dw定义字类型变量,一个字数据占2个字节单元,读完一个,偏移量加2
dd定义双字类型变量,一个双字数据占4个字节单元,读完一个,偏移量加4
4.SHL、SHR、SAL、SAR的区别
SHL(Shift Left): 逻辑左移
SHR(Shift Right): 逻辑右移
SAL(Shift Arithmetic Left): 算术左移
SAR(Shift Arithmetic Right): 算术右移
其中的 SHL 和 SAL 相同, 但 SHR 和 SAR 不同.
SHL、SAL: 每位左移, 低位补 0, 高位进 CF
SHR : 每位右移, 低位进 CF, 高位补 0
SAR : 每位右移, 低位进 CF, 高位不变
5.xlat
XLAT作用:将((BX)+(AL))送给(AL)
即:将BX为首地址的,偏移地址为AL的内容送给AL.
6.org
org是Origin的缩写:起始地址,源。
在汇编语言源程序的开始通常都用一条ORG伪指令来实现规定程序的起始地址。
7.align
ALIGN 伪指令将一个变量对齐到字节边界、字边界、双字边界或段落边界。
8.startup
源程序用 startup 伪指令指明执行的起始点
9.DOS调用
源程序采用DOS功能调用的4CH子功能实现程序返回DOS
10.INC,DEC
inc 加1指令
dec 减1指令
11.ds
不能直接把值赋给ds
应该
mov ax,2
mov ds,ax
12.rep movsb
movsb指令用于把字节从ds:si 搬到es:di;rep是repeat的意思,rep movsb 就是多次搬运。搬运前先把字符串的长度存在cx寄存器中,然后重复的次数就是cx寄存器所存数据的值。
13.cld和std
CLD与STD是用来操作方向标志位DF
CLD使DF复位,即DF=0,STD使DF置位,即DF=1.用于串操作指令中。
配合使用
movs( MOVe String) ;串传送指令
movsb ;字节串传送
movsw ;字串传送
执行操作:[DI] = [SI] ,将位于DS段的由SI所指出的存储单元的字节或字传送到位于ES段的由DI 所指出的存储单元,再修改SI和DI, 从而指向下一个元素.
在执行该指令之前,必须预置SI和DI的初值,用STD或CLD设置DF值.
1.目的串必须在附加段中,即必须是ES:[DI]
2.源串允许使用段跨越前缀来修饰,但偏移地址必须是[SI])
14.div
(1) 除数: 有 8 位和 16 位两种, 在一个寄存器或内存单元中.
(2) 被除数: 默认放在 ax 或 dx 和ax 中,
如果除数为 8 位, 被除数则为 16 位, 默认在 ax 中存放;
如果除数为 16 位, 被除数则为 32 位, 在 dx 和 ax 中存放, dx 存放高 16 位, ax 存放低 16 位.
3.结果
如果除数为8位,则被除数为16位,则结果的商存放与al中,余数存放于ah中。
如果除数为16位,则被除数为32位,则结果的商存放与ax中,余数存放于dx中。
如果除数为32位,则被除数为64位,则结果的商存放与eax中,余数存放于edx中。
15.neg
neg指令
即用0减操作数,并将求得的结果存入指定的寄存器或内存单元(把操作数按位取反,末位加1)