不同寻址方式的灵活运用

对内存的寻址方式

形式名称特点意义示例
[idata]直接寻址用一个常量/立即数来表示地址用于直接定位一个内存单元mov ax,[200]
[bx]寄存器间接寻址用一个变量来表示内存地址用于间接定位一个内存单元mov bx,0 mov ax, [bx]
[bx+idata]寄存器相对寻址用一个变量和常量表示地址可在一个起始地址的基础上用变量间接定位一个内存单元mov bx, 4 mov ax, [bx+200]
[bx+si]基址变址寻址用两个变量表示地址mov ax,[bx+si]
[bx+si+idata]相对基址变址寻址用两个变量和一个常量表示地址mov ax, [bx+si+200]

二重循环问题的处理方法

  • 问题:编程将datasg段中每个单词改为大写字母。
assume cs:codesg,ds:datasg
datasg segment
    db 'ibm    '
    db 'dec    '
    db 'dos    '
    db 'vax    '
datasg ends
codesg segment
start:
	;有缺陷的程序(共用cx会出现问题)
	mov ax,datasg
	mov ds,ax
	mov bx,0
	mov cx,4
 sO:mov si,0
 	mov cx,3
  s:mov al,[bx+si]
  	and al,11011111b
  	mov[bx+si],al
  	inc si
	loop s
	add bx,16
	loop s0
	
codesg ends
end start
法1用寄存器dx保存数据
assume cs:codesg,ds:datasg
datasg segment
    db 'ibm    '
    db 'dec    '
    db 'dos    '
    db 'vax    '
datasg ends
codesg segment
start:
	mov ax,datasg
	mov ds,ax
	mov bx,0
	mov cx,4
 s0:mov dx,cx;将外层循环的cx值保存在dx中
	mov si,0
	mov cx,3;cx设置为内存循环的次数
  s:mov al,[bx+si]
  	and al,11011111b
  	mov [bx+si],al
  	inc si
	loop s
	add bx,16
	mov cx,dx;用dx中存放的外层循环的计数值恢复cx
	loop s0;(cx)=(cx)-1针对外层循环

codesg ends
end start
法2用固定的内存空间保存数据
assume cs:codesg,ds:datasg
datasg segment
    db 'ibm    '
    db 'dec    '
    db 'dos    '
    db 'vax    '
datasg ends
codesg segment
start:
	mov ax,datasg
	mov ds,ax
	mov bx,0
	mov cx,4
 s0:mov ds:[40H],cx;将外层循环的c值保存在datasg:40H单元中
	mov si,0
	mov cx,3;cx设置为内存循环的次数
  s:mov al,[bx+si]
  	and al,11011111b
  	mov [bx+si],al
  	inc si
	loop s
	add bx,16
	mov cx,ds:[40H];用datasg:40H单元中的值恢复cx
	loop s0;

codesg ends
end start
法3用栈保存数据
assume cs:codesg,ds:datasg
datasg segment
    db 'ibm    '
    db 'dec    '
    db 'dos    '
    db 'vax    '
datasg ends
stacksg segment
    dw 0,0,0,0,0,0,0,0
stacksg ends
codesg segment
start:
	mov ax,stacksg
	mov ss,ax
	mov sp,16
	mov ax,datasg
	mov ds,ax
	mov bx,0
	mov cx,4
 s0:push cx;将外层循环的cx值压栈
	mov si,0
	mov cx,3;cx设置为内存循环的次数
  s:mov al,[bx+si]
 	and al,11011111b
  	mov [bx+si],al
  	inc si
	loop s
	add bx,16
	pop cx;从栈顶弹出原cx的值,恢复cx
	loop s0

codesg ends
end start
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值