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

 

不同寻址方式的总结

  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执行结果

7.10 不同的寻址方式的灵活应用_第1张图片

结果与目标一致

7.10 不同的寻址方式的灵活应用_第2张图片

问题

其实不需要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

7.10 不同的寻址方式的灵活应用_第3张图片

 

7.10 不同的寻址方式的灵活应用_第4张图片

结果与目标一致

7.10 不同的寻址方式的灵活应用_第5张图片

 

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

 

 

 

 

 

你可能感兴趣的:(汇编)