(1) 下面的程序实现依次用内存0:0~0:15单元中的内容改写程序中的数据,完成程序:
- assume cs:codesg
-
- codesg segment
-
- dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
-
- start: mov ax,0
- mov ds,ax
- mov bx,0
-
- mov cx,8
- s: mov ax,[bx]
- mov cs:[bx],ax
- add bx,2
- loop s
-
- mov ax,4c00h
- int 21h
- codesg ends
-
- end start
(2) 下面的程序实现依次用内存0:0~0:15单元中的内容改写程序中的数据,数据的传送用栈来进行,栈空间设置在程序内。完成程序:
- assume cs:codesg
-
- codesg segment
-
- dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
- dw 0,0,0,0,0,0,0,0,0,0
-
- start: mov ax,cs
- mov ss,ax
- mov sp,24h
-
- mov ax,0
- mov ds,ax
- mov bx,0
- mov cx,8
- s: push [bx]
- pop cs:[bx]
- add bx,2
- loop s
-
- mov ax,4c00h
- int 21h
- codesg ends
-
- end start
(1) 编程,向内存0:200~0:23F依次传送数据0~63(3FH)。
(2) 编程,向内存0:200~0:23F依次传送数据0~63(3FH),程序中只能使用9条指令,9条指令中包括“mov ax,4cooh”和“int 21h”。
- assume cs:code
-
- code segment
-
- mov ax,0020H
- mov ds,ax
- mov bx,0
-
- mov cx,64
-
- s:mov ds:[bx],bl ; bl存储低8位1字节数据
- inc bx
- loop s
-
- mov ax,4C00H
- int 21H
-
- code ends
-
- end
(3) 下面的程序功能是将“mov ax,4c00h”之前的指令复制到内存0:200处,补全程序。上机调试,跟踪运行结果。
- assume cs:code
-
- code segment
-
- mov ax,<span style="text-decoration: underline;">cs</span> ; CS存储的是代码段地址
- mov ds,ax
- mov ax,0020H
- mov es,ax ; 目标段地址存储在ES寄存器中
- mov bx,0
- mov cx,<span style="text-decoration: underline;">cx</span> ; CX存放的是程序的长度
- s:mov al,[bx]
- mov es:[bx],al
- inc bx
- loop s
-
- mov ax,4C00H
- int 21H
-
- code ends
-
- end

(1) 复制的是什么?从哪里到哪里?
答:复制的是代码的二进制数据,从CS:0到ES:0。
(2) 复制的是什么?有多少个字节?你如何知道要复制的字节的数量?
答:复制的是代码的二进制数据,有cx个字节,因为CX存放的是程序的长度。
(1) 将下面的程序保存为t1.asm文件,将其生成可执行文件t1.exe。
- assume cs:codesg
-
- codesg segment
- mov ax,2000H
- mov ss,ax
- mov sp,0
- add sp,10
- pop ax
- pop bx
- push ax
- push bx
- pop ax
- pop bx
- mov ax,4c00H
- int 21H
-
- codesg ends
-
- end
(2) 用Debug跟踪t1.exe的执行过程,写出每一步执行后,相关寄存器中的内容和栈顶的内容。
(3) PSPR头两个字节是CD 20,用Debug加载t1.exe,查看PSP的内容。
输入命令:
debug t1.exe
d ds:0 ff
(1) 使用Debug,将下面的程序段写入内存,逐条执行,根据指令执行后的实际运行情况填空。
mov ax,ffff
mov ds,ax
mov ax,2200
mov ss,ax
mov sp,0100
mov ax,[0] ;ax=5BEA
add ax,[2] ;ax=5CCA
mov bx,[4] ;bx=30F0
add bx,[6] ;bx=6021
push ax ;sp=00FE; 修改的内存单元地址是220FE内容为5CCA
push bx ;sp=00FC; 修改的内存单元地址是220FC内容为6021
pop ax ;sp=00FE; ax=6021
pop bx ;sp=0100; bx=5CCA
push [4] ;sp=00FE; 修改的内存单元地址是220FE内容为30F0
push [6] ;sp=00FC; 修改的内存单元地址是220FC内容为2F31
(2) 仔细观察图3.19中的实验过程,然后分析:为什么2000:0~2000:f中的内容会发生改变?
可能要再做些实验才能发现其中的规律。如果你在这里就正确回答了这个问题,那么要恭喜你,因为你有很好的悟性。大多数的学习者对这个问题还是比较迷惑的,不过不要紧,因为随着课程的进行,这个问题的答案将逐渐变得显而易见。

图3.19 用Debug进行的实验