4.更灵活的定位内存地址的方法(and/or指令、字符形式数据、[bx+idata]、si/di/bp寄存器、数据处理长度、div指令、dd/dup伪指令)

一、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字节
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值