[Hb-VI] 使用[ bx + si(di) + idata ]更灵活的访问内存

来源:互联网 发布:王充 论衡 知乎 编辑:程序博客网 时间:2024/06/09 15:04

《汇编语言·第三版》--王爽


1 问题

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

assume  cs:codesg, ss:stacksg, ds:datasg

 

stacksg  segment

       dw   0,0, 0, 0, 0, 0, 0, 0

stacksg ends

 

 

datasg    segment

       db   '1. display      '

       db   '2. brows        '

       db   '3. replace      '

       db   '4. modify       '

datasg    ends

 

 

codesg   segment

start:

      

codesg   ends

end       start

Datasg中的数据的存储结构如下图:


Figure1. datasg中数据的存储结构

2 代码

1.        assume    cs:codesg, ss:stacksg, ds:datasg

2.         

3.        stacksg    segment

4.                 dw    0, 0, 0, 0, 0, 0,0, 0

5.        stacksg ends

6.         

7.         

8.        datasg      segment

9.                 db     '1. display      '

10.             db     '2. brows        '

11.             db     '3. replace      '

12.             db     '4. modify       '

13.    datasg      ends

14.     

15.     

16.    codesg     segment

17.    start:

18.             mov ax, datasg

19.             mov ds, ax                 ;ds指向数据段datasg

20.            

21.             mov ax, stacksg

22.             mov ss, ax

23.             mov sp, 2

24.            

25.             mov bx, 0                   ;指向datasg每行 

26.            

27.             mov cx, 4          ;四行,一共循环四次

28.     

29.    s0:    push          cx               ;外层循环数cx值缓存到stack的第一个字节单元处

30.            

31.             mov si, 0           ;用来索引每行的前四个字母

32.             mov cx, 4          ;内层循环中的循环次数,对应每行的前四个字母

33.    s1:    mov al, 3[bx + si]      ;[bx + si +3]

34.             and  al, 11011111b

35.             mov 3[bx + si], al

36.            

37.             inc    si

38.             loop s1

39.            

40.             add  bx, 16                 ;下一行字符串

41.             pop  cx

42.             loop s0

43.     

44.             mov ax, 4c00h

45.             int    21h

46.    codesg     ends

47.    end         start

3 调试

(1) stacksg和datasg段地址

Figure2. stacksg和datasg段地址

stacksg段地址为076B,datasg段地址为076A。


(2) 查看datasg段内容

Figure3. 原datasg段内容

(3) 执行程序后看datasg段内容

Figure4. 程序成功
002b为“mov          ax,4c00h”在代码段中的偏移地址。

4 总结

[bx+si(di) + idata]可以更加灵活的访问内存。像此次题目中具有多行,每行中具有固定的偏移,每行还需要遍历的情况就可以使用[bx+si(di) + idata]的形式来访问内存。对于更简单的情况,或许只需要用到[bx],[bx + idata]或[bx + si(di)]的形式来访问内存。对于更复杂的情况,或许还会同时用上si和di。


[2014.11.25 - 21:20]
R《Hb》Note Over.

0 0