《汇编语言·第三版》--王爽
1 题目
(1) 向内存中传数据
编程,向内存0:200 ~ 023F依次传送数据0 ~ 63(3FH),程序中只能使用9条指令,9条指令包括“mov ax, 4c00h”和“int 21h”。
(2) 补全程序,跟踪运行
下面的程序的功能是将“mov ax, 4c00h”之前的指令赋值到内存0:200处,补全程序。上机调试,跟踪运行结果。
Table 1. l42.asm
1. assume cs:code 2. code segment 3. mov ax, code ;标号code最终被编译、连接程序处理为一个段的段地址 4. mov ds, ax 5. mov ax, 0020h 6. mov es, ax 7. mov bx, 0 8. mov cx, 018h ;此源程序经编译连接接被加载后,cx的值为整段程序的长度(包含mov ax, 4c00h和int 21h) 9. 10. s: mov al, [bx] 11. mov es:[bx], al 12. inc bx 13. loop s 14. 15. mov ax, 4c00h 16. int 21h 17. code ends 18. end |
提示:
[1] 复制的是什么?从哪里到哪里?
[2] 复制的是什么?有多少个字节?你如何知道要复制的字节的数量?
2 练习
(1) 向内存中传数据
[1] 源程序
Table 2. l41.asm
1. assume cs:code 2. 3. code segment 4. mov ax, 20h 5. mov ds, ax 6. mov bx, 0 7. 8. mov cx, 40h 9. s: mov [bx], bl ;bx作为偏移地址的同时bl作为传输值 10. inc bx 11. loop s 12. 13. mov ax, 4c00h 14. int 21h 15. code ends 16. end |
[2] 编译连接
[3] 查看0:200 ~ 0:23F内容
欧克,写入成功。
(2) 补全程序,跟踪运行
[1] 程序加载后各寄存器中的值
经编译后连接后的汇编程序,被加载时各寄存器的值如下:
CX代表整个程序的长度。DS为PSP的段地址,DS+10H为整个程序的段地址。CS:IP为程序第一条指令的地址。
跟踪运行:
[2] 程序中标号的含义
标号如l42.asm中的code最终被编译、连接程序处理为一个段的段地址,所以赋值DS为code后,DS就代表此段代码的段地址。
3 总结
- 汇编程序经加载后各寄存器的值。见“程序加载后各寄存器中的值”。
- debug理解“mov al,[idata]”指令,[idata]被理解为偏移地址,此指令可实现将ds: idata内存单元中的值存到al中。masm理解“mov [idata], al”指令,[idata]被理解为常数idata。Debug和masm都将“mov al, [bx]”中的[bx]理解为偏移地址,即将ds:bx单元中的值存到al中。
- 要完整的描述一个内存单元,需要两种信息:内存单元的地址;内存单元的长度(类型)。
- 在DOS下,0:200 ~ 0:2FF空间没有系统或其它程序的数据或者代码,可往这段空间写数据。
- 汇编程序中的标号代表了一个地址。如l41.asm中的code最终被编译、连接程序处理为一个段的段地址。s最终被处理为“mov [bx], bl”指令的地址。
- CPU执行loop指令时,需进行两步操作:第一步,(cx) = (cx) – 1;第二步,判断cx中的值,不为0则转至loop后面的标号处执行程序。