(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进行的实验
(1) 补全下面的程序,使其可以将10000H~1000FH中的8个字,逆序复制到20000H~2000FH中。逆序复制的含义如图3.17所示(图中内存里的数据均为假设)。

图3.17 逆序复制示意图
mov ax, 1000H
mov ds, ax
mov ax, 2000H
mov ss, ax
mov sp, 0010H
push [0]
push [2]
push [4]
push [6]
push [8]
push [A]
push [C]
push [E]
(2) 补全下面的程序,使其可以将 10000H~1000FH 中的8个字,逆序复制到20000H~2000FH中。
mov ax, 2000H
mov ds, ax
mov ax, 1000H
mov ss, ax
mov sp, 0000H
pop [E]
pop [C]
pop [A]
pop [8]
pop [6]
pop [4]
pop [2]
pop [0]
(1) 在Debug中,用户”d 0:0 1F” 查看内存,结果如下。
0000:0000 70 80 F0 30 EF 60 30 E2-00 80 12 66 20 22 60
0000:0010 62 26 E6 D6 CC 2E 3C 3B-AB BA 00 00 26 06 66 88
下面的程序执行前,AX=0,BX=0,写出每条汇编指令执行后相关寄存器中的值。
阅读全文…
2.实验任务
(1)使用Debug,将下面的程序段写入内存,逐条执行,观察每条指令执行后,CPU中相关寄存器中内容的变化。
注意在进入debug模式时 AX 和 BX 的初始数据为 0000H
机器码 汇编指令
b8 20 4e mov ax,4E20H 使用T命令读入指令后 IP = IP + 3 执行指令后 AX=4E20H
05 16 14 add ax,1416H 使用T命令读入指令后 IP = IP + 3 执行指令后 AX=6236H
bb 00 20 mov ax,2000H 使用T命令读入指令后 IP = IP + 3 执行指令后 AX =2000H
01 d8 add ax,bx 使用T命令读入指令后 IP = IP + 2 执行指令后 AX=2000H,BX=0000H
89 c3 mov bx,ax 使用T命令读入指令后 IP = IP + 2 执行指令后 AX=2000H,BX=2000H
01 d8 add ax,bx 使用T命令读入指令后 IP = IP + 2 执行指令后 AX=4000H,BX=2000H
b8 1a 00 mov ax,001AH 使用T命令读入指令后 IP = IP + 2 执行指令后 AX=001AH,BX=2000H
bb 26 00 mov bx,0026H 使用T命令读入指令后 IP = IP + 3 执行指令后 AX=001AH,BX=0026H
00 d8 add al,bl 使用T命令读入指令后 IP = IP + 2 执行指令后 AX=0040H,BX=0026H
00 dc add ah,bl 使用T命令读入指令后 IP = IP + 2 执行指令后 AX=2640H,BX=0026H
00 c7 add bh,al 使用T命令读入指令后 IP = IP + 2 执行指令后 AX=2640H,BX=4026H
b4 00 mov ah,0 使用T命令读入指令后 IP = IP + 2 执行指令后 AX=0040H,BX=4026H
00 d8 add al,bl 使用T命令读入指令后 IP = IP + 2 执行指令后 AX=0066H,BX=4026H
04 9c add al,9CH 使用T命令读入指令后 IP = IP + 2 执行指令后 AX=0002H,BX=4026H
注意,以上结果是102H,担al是8位寄存器,高位1不能存放在al中
提示,可用E命令和A命令以两种方式将将指令写入内存。注意用T命令执行时,CS:IP的指向。
阅读全文…
下面的3条指令执行后,CPU几次修改IP??都是在什么时候?最后IP中的值是多少?
mov ax, bx
sub ax, ax
jmp ax
指令序列:
mov ax, bx 读取这个指令进入指令缓冲器后第一次修改IP,IP = IP + 2; 执行后 ax = bx;
sub ax, ax 读取这个指令进入指令缓冲器后第二次修改IP,IP = IP + 2; 执行后 ax = 0000H;
jmp ax 读取这个指令进入指令缓冲器后第三次修改IP, IP = IP + 2; 指令执行后第四次修改IP,IP = 0000H;
阅读全文…