字符
字符是以ASCII码的形式存储的,一个字符对应着8为二进制数,2位16进制数。
所以可以得到对应的字符地址。
assume ds:data
data segmentdb 'hello'db 'world'
data ends
and or指令
根据ASCII码,字符的大写和小写相差一个0010 0000,比如a对应的ASCII码是0110 0001,那么A则对应的是0100 0001,对比可以发现他们只是第5位不同,第5位为1,则是小写,否则是大写。
现在通过改变字符的大小写来熟悉and和or的用法,下面将HeLLo全变成小写,WorlD全变成大写。
and 是置0
or是置1
assume cs:code, ds:data
data segmentdb 'HeLLo'db 'WorlD'
data endscode segment
start:mov ax, datamov ds, axmov bx, 0mov cx, 5s:mov ax, [bx]and ax, 11011111b;如果第5位为1的话,那么将其置为0,即将其变为大写mov [bx], ax;将ax存到[bx]对应的内存单元中,注意这里不是将其存到bx寄存器中mov ax, [5+bx]or ax, 00100000;如果第5位为0的话,那么将其置为1,即将其变为小写mov [5+bx], axinc bxjmp scode ends
end start
mov ax, [bx]放入ax中的是字节型数据。
mov ax, [bx+200]放入ax中的是字型数据。
寄存器SI和DI
SI和DI的功能和bx的功能类似,但这两个寄存器不能分为两个8位的寄存器来使用。
mov ax, [bx+di]或者mov ax, [bx+si]放入ax的是字型数据。
该指令也可以写成mov ax, [bx][di]
BX、SI、DI和BP寄存器
- 这四个寄存器都可以用[]这样的形式寻址。其余的ax、cx、dx以及ds都不能用来寻址。
- BX和BP只能选择一个和SI和DI搭配或者四个自己单独出现,并且SI和DI不能搭配。
- 使用BP时,默认的段地址在SS中。
特别补充
如图可见,其内存的物理地址为10000-10003H,地址信息也可以表示为1000: 0-1000: 3
assume cs:codeseg, ds:dataseg
dataseg segmentdb 23h, 11h, 22h, 66h
dataseg endscodeseg segmentmov ax, 1000hmov ds, axmov bx, 0mov cx, 4mov ax, [bx]mov ax, [bx+1]mov ax, [bx+2]mov ax, [bx+3]codeseg endsend
执行下面四条语句时,对应的ax的值为0023h, 1123(字型数字,地址高位在前,低位在后), 2211, 6622
mov ax, [bx]
mov ax, [bx+1]
mov ax, [bx+2]
mov ax, [bx+3]
指令mov ax, [bx+si]以及mov ax, [bx,+si+10]和mov ax, [bx]都是类似的,特别注意的是这个字型数据,始终记住内存地址是以8位二进制数为刻度的,即偏移+1,内存中的数据的位数走8位