一、and和or指令
1、and指令是按位与操作:通过指令可以将操作对象相应位设置成0,其他位不变。
mov al 11111110b
and al 11011110b
上述代码将第五位设置成0,其他位不变
2、or指令是按位或操作:通过指令可以将操作对象相应位设置成1,其他位不变。
mov al 00000001b
or al 00100001b
上述代码将第五位设置成1,其他位不变
3、and和or指令不可以对[bx]和段寄存器直接操作,要通过通用寄存器ax等中转。
二、字符形式数据
1、在汇编中,用 ‘abc’ 的形式指明的数据是以字符形式给出的,编译器会将它们转换成对应的ASICII码。
assume cs:code,ds:data
data segment
#db是define byte,与dw对应
db 'unIX' #等价于 db 75H,6EH,49H,58H
db 'foRK' #等价于 db 66H,6FH,52H,4BH
data ends
code segment
start: mov al,'a' #等价于mov al,61H
mov bl,'b' #等价于mov bl,62H
code ends
end start
注意: 编译器并不会把data段的地址放入ds中,若需要用到预设data段的数据,还是需要在code中写入:
mov ax,data
mov ds,ax
2、大小写字母转换:
①大写字母转小写字母,把第5位数据置0。
②小写字母转大写字母,把第5位数据置1。
三、[bx+idata]
1、[bx+idata]表示:(ds)x16+(bx)+idata 地址的数据
2、有三种写法:
mov ax,[bx+5]
mov ax,5[bx]
mov ax,[bx].5
3、idata必须是立即数,不能是寄存器,比如:
mov ax,[bx].cx 这种就是错的!!
四、SI和DI寄存器
1、SI和DI寄存器和BX的功能相近,但是都不可以分成两个8位的寄存器使用。
2、用法:
mov bx,0
mov ax,[bx+123]
mov si,0
mov ax,[si].123
mov di,0
mov ax,123[di]
3、SI和DI都可以和BX搭配使用,但是这两个不能互相搭配使用:
mov ax,[si+bi] #等价 [si].bi 、 bi[si]
mov ax,[di+bi]
#以上两条都是正确的,但是
mov ax,[si+di] #是错误的
4、两个内存地址之间不能直接mov数据
mov [0],[1]
mov [si],[di]
#以上操作都是错误的,必须由一个通用寄存器做中转:
mov ax,[di]
mov [si],ax
5、SI/DI与BX搭配使用时,还可以再加上一个立即数: [bx+si+idata]
[bx+si+idata]
[bx][si].idata
[bx].[si].idata
idata[bx][si]
idata[bx].[si]
#以上写法都正确
五、BP寄存器
1、BP寄存器和BX相似,也是直接访问内存地址用的,但是在默认不写段地址的情况下,BP的段地址是SS,BX/SI/DI的段地址是DS。
2、BP和BX寄存器、SI和DI寄存器不能相互组合,如
合法:
mov ax,[bx+si+idata]
mov ax,[bx+di+idata]
mov ax,[bp+si+idata]
mov ax,[bp+di+idata]
非法:
mov ax,[bp+bx]
mov ax,[si+di]
六、指令处理的数据长度
8086CPU可以处理8位和16位两种数据长度,在机器指令中要说明,是字操作还是字节操作。
1、通过寄存器名来制定数据长度
mov ax,1
mov ax,ds:[0]
mov ds,ax
mov al,1
2、没有寄存器名的情况下,通过 word ptr、byte ptr来指明内存单元的长度
mov word ptr ds:[0],1
mov byte ptr ds:[0],1
inc word ptr [bx]
inc byte ptr [bx]
七、div除法指令
1、除数若是8位,则被除数必须16位;若除数是16位,则被除数必须32位。 反之,被除数16位,除数必须8位;被除数32位,除数必须16位。
2、除数8位、被除数16位情况: 被除数默认放在AX中。除得的结果,AL存放商,AH存放余数。
3、除数16位、被除数32位情况: 被除数的高16位放在DX中,低16位放在AX中。除得的结果,AX存放商,DX存放余数。
4、上面两种情况最后的结果,都是被除数高位存放余数,低位存放商。
div byte ptr ds:[0]
al = (ax)/[0]
ah = (ax)%[0]
div word ptr ds:[0]
ax = (dx*10000H + ax)/[0]
dx = (dx*10000H + ax)%[0]
八、dd/dup伪指令
伪指令是CPU不识别、编译器识别的指令
1、db/dw/dd
db:define byte 定义一个字节(1字节)
dw: define word 定义一个字(2字节)
dd: define double word 定义两个字(4字节)
2、dup的使用格式:
db/dw/dd 重复的字数 dup (重复的数据)
db 3 dup (0) #db 0,0,0, 3字节
dw 3 dup (0,1,2) #db 0,1,2,0,1,2,0,1,2 9字节
dw 3 dup ('abc','ABC') #db 'abcABCabcABCabcABC' 18字节