不通过寄存器确定数据的长度 + 案例

不通过寄存器确定数据的长度

在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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值