11

(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

08

(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,cs ; CS存储的是代码段地址
mov ds,ax
mov ax,0020H
mov es,ax ; 目标段地址存储在ES寄存器中
mov bx,0
mov cx,cx ; CX存放的是程序的长度
s:mov al,[bx]
mov es:[bx],al
inc bx
loop s

mov ax,4C00H
int 21H

code ends

end

asmt43
(1) 复制的是什么?从哪里到哪里?
答:复制的是代码的二进制数据,从CS:0到ES:0。
(2) 复制的是什么?有多少个字节?你如何知道要复制的字节的数量?
答:复制的是代码的二进制数据,有cx个字节,因为CX存放的是程序的长度。

07

(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

06

(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进行的实验

图3.19 用Debug进行的实验