不通过寄存器确定数据的长度
在8086CPU指令中,可以处理byte和word两种尺寸的数据。所以要在机器指令指明,指令进行的是字操作还是字节操作。
(1)通过寄存器名指明操作对象
指明进行字操作:
mov ax,1
mov bx,ds:[0] ;取一个字型数据
mov ds,ax
mov ds:[0],ax ;把一个字型数据放进去
inc ax
add ax,1000
指明进行字节操作:
mov al,1
mov al,bl ;位数一致
mov al,ds:[0] ;取一个字节型数据
mov ds:[0],al
inc al
add al,100
(2)在没有寄存器名存在的情况下,用操作符X ptr指明内存数据的长度
用 word ptr指明指令访问的内存单元是一个字单元
用byte ptr指明指令访问的内存单元是一个字节单元
mov ds:[0],1并不能判断操作的是字型数据还是字节型数据
mov word prt ds:[0],1 ;这里的1会被翻译为字数据的1,占16位
mov byte ptr ds:[0],1 ; 这里的1会被翻译为字型数据,占8位
在没有寄存器参与的内存单元访问指令中 ,用word ptr或者byte ptr显性地指明所要访问的内存单元的长度是很有必要的!
寻址方式的综合利用(案例):
关于DEC公司的一条记录(1982年)如下:
公司名称: DEC
总裁姓名:Ken Olsen
排名: 137
收入:40(40亿美元)
著名产品:PDP(小型机)
到了1988年DEC公司的信息有了如下变化。
(1)Ken Olsen在富翁榜上的排名已升至38位;
(2) DEC的收入增加了70亿美元;
(3)该公司的著名产品已变为VAX系列计算机
编程修改内存中的过时数据。
第一步一定要查看数据在内存中的分布,非常重要!!!
代码如下:
assume cs:code,ds:data,ss:stack
data segment
db 'DEC' ;公司名
db 'Ken Olsen' ;总裁姓名
dw 137 ;排名 ==》上升至38位 —》通过观察数据在内存中的分布可知起始地址在第12位
dw 40 ;收入(40亿美元)==》增加70亿美元 ;起始地址在第14位
db 'PDP' ;著名产品 ==》VAX ;起始地址在第16位
data ends
stack segment
dw 0,0,0,0,0,0,0,0
dw 0,0,0,0,0,0,0,0
stack ends
code segment
start:
mov ax,stack
mov ss,ax
mov sp,32
mov ax,data
mov ds,ax
mov bx,0
mov word ptr ds:[bx+12],38 ;改为38 字型数据
add word ptr ds:[bx+14],70 ;增加70
mov si,0 ;再使用一个偏移地址寄存器si
mov byte ptr ds:[bx+16+si],'V';这里的16也可以改成10H
inc si
mov byte ptr ds:[bx+16+si],'A'
inc si
mov byte ptr ds:[bx+16+si],'X'
mov ax,4c00h
int 21h
code ends
end start