7.10 不同的寻址方式的灵活应用

这篇博客总结了不同的寻址方式,包括[idata]、[bx]、[bx+idata]和[bx+si+idata]在编程中的应用。通过解决两个问题——将内存段中的单词首字母转大写,探讨了如何灵活运用这些寻址方式,指出在某些情况下可以简化变量使用。同时,提出了在需要暂存数据时使用栈的方法。
摘要由CSDN通过智能技术生成

 

不同寻址方式的总结

  1. [idata]用一个常量来表示地址,可用于直接定位一个内存单元;
  2. [bx]用一个常量来表示内存地址,可用于间接定位一个内存单元;
  3. [bx+idata]用一个变量和常量表示地址,可在一个起始地址的基础上用变量间接定位一个内存单元;
  4. [bx+si]用两个变量表示地址;
  5. [bx+si+idata]用两个变量和一个常量表示地址。

 

问题7.6

编程,将datasg段中每个单词的头一个字母改变为大写字母

assume cs:codesg,ds:datasg

datasg segment
  db '1. file         '
  db '2. edit         '
  db '3. search       '
  db '4. view         '
  db '5. options      '
  db '6. help         '
datasg ends

codesg segment
start:

codesg ends

end start

 

源程序

assume cs:codesg,ds:datasg

datasg segment
  db '1. file         '
  db '2. edit         '
  db '3. search       '
  db '4. view         '
  db '5. options      '
  db '6. help         '
datasg ends

codesg segment
start:
    mov ax,datasg
	mov ds,ax
    mov cx,6
	mov bx,0
	mov si,0
	mov dx,0
  s:
    mov dl,[bx + si + 3] ;这里操作的是字节,借助dl保存
    and dl,11011111B
	mov [bx + si + 3],dl
    add si,10h
	loop s
	
	mov ax,4c00h
	int 21h
codesg ends

end start

debug执行结果

结果与目标一致

问题

其实不需要si与dl,只需要ax、bx与idata就可以了

 

问题7.7

编程,将datasg段中每个单词改为大写字母

assume cs:codesg,ds:datasg

datasg segment
  db 'ibm             '
  db 'dec             '
  db 'dos             '
  db 'vax             '
datasg ends

codesg segment
start:
codesg ends

end start

分析

本题的难点在于在只有cx一个循环计数器的情况下如何实现双重循环。这里可以把cx中的值暂时保存在内存中再取出

源程序

assume cs:codesg,ds:datasg

datasg segment
  db 'ibm             '
  db 'dec             '
  db 'dos             '
  db 'vax             '
  dw 0
datasg ends

codesg segment
start:
    mov ax,datasg
    mov ds,ax
    mov bx,0   ;行
	
    mov cx,4
  s:
    mov ds:[40h],cx
    mov si,0   ;列
    mov cx,3
    s0:
        mov al,[bx+si]
        and al,11011111b
        mov [bx+si],al
        inc si
        loop s0
	add bx,10h
	mov cx,ds:[40h]
	loop s
	
	mov ax,4c00h
	int 21h
codesg ends

end start

debug

 

结果与目标一致

 

一般来说,在需要暂存数据的时候,我们都应该使用栈

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值