检测点3.1
(1)在debug中,用“d 0:0 1f” 查看内存,结果如下:
0000:0000 70 80 F0 30 EF 60 30 E2-00 80 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,写出每条汇编指令执行完后相关寄存器中的值。
mov ax,1
mov ds,ax
mov ax,[0000] AX=2662H
mov bx,[0001] BX=E626H
mov ax,bx AX=E626H
mov ax,[0000] AX=2662H
mov bx,[0002] BX=D6E6H
add ax,bx AX=FD48H
add ax,[0004] AX=2C14H
mov ax,0 AX=0000H
mov al,[0002] AX=00E6H
mov bx,0 BX=0000H
mov bl,[000c] BX=0026H
mov al,bl AX=000CH
(2)内存中的情况如图3.6所示。
各寄存器的初始值:CS=2000H,IP=0,DS=1000H,AX=0,BX=0;
<1>写出CPU执行的指令序列(用汇编指令写出)。
<2>写出CPU执行每条指令后,CS、IP和相关寄存器中的数值。
<3>再次体会:程序和数据有区别吗?如何确定内存中的信息哪些是数据,哪些是程序?
答:<1><2>
指令的执行顺序及每条指令执行后CS、IP和相关寄存器的值:
mov ax,6622H CS=2000H,IP=0003H,AX=6622H
jmp 0ff0:0100 CS=0FF0H,IP=0100H
mov ax,2000H CS=0FF0H,IP=0103H,AX=2000H
mov ds,ax CS=0FF0H,IP=0105H,DS=2000H
mov ax,[0008] CS=0FF0H,IP=0108H,AX=C389H
mov ax,[0002] CS=0FF0H,IP=010BH,AX=EA66H
<3>指令和数据没有区别,程序中CS:IP指向的单元的信息被当成程序,而DS和偏移地址执行的单元就被当成数据。
检测点3.2
(1)补全下面的程序,使其可以将10000H~1000FH中的8个字,逆序复制到20000H~2000FH中。逆序复制的含义如图3.17所示(图中内存里的数据均为假设)。
应补部分为:
mov ax,2000H
mov ss,ax
mov sp,0010H
(2)补全下面的程序,使其可以将10000H~1000FH中的8个字,逆序复制到20000H~2000FH中。
应补部分为:
mov ax,1000H
mov ss,ax
mov sp,0000H
第三章 实验任务
(1)使用debug,将下面的程序段写入内存,逐条执行,根据指令执行后的实际运行情况填空。
mov ax,ffffH
mov ds,ax
mov ax,2200H
mov ss,ax
mov sp,0100H
mov ax,[0] ;ax=5BEAH
add ax,[2] ;ax=5CCAH
mov bx,[4] ;bx=30F0H
add bx,[6] ;bx=6024H
push ax ;sp=00FEH;修改的内存单元的地址是2200:00FE内容为0000H
push bx ;sp=00FCH;修改的内存单元的地址是2200:00FC内容为0000H
pop ax ;sp=00FEH;ax=6024H
pop bx ;sp=0100H;ax=5CCAH
push [4] ;sp=00FEH;修改的内存单元的地址是2200:00FE内容为0000H
push [6] ;sp=00FCH;修改的内存单元的地址是2200:00FC内容为0000H
(2)仔细观察图3.19中的实验过程,然后分析:为什么2000:0~2000:F中的内容会发生改变?
答:因为T命令利用了单步中断,中断时要保存现场和断点地址到栈中。
图中栈顶为2000:0010,这样中断时就将中断现场和断点地址CS:IP进栈,从图中可以找到0B39H、0108H即为CS、IP的值。
第四章 实验任务
(1)将下面的程序保存为t1.masm文件,将其生成可执行文件t1.exe。
(2)用debug跟踪t1.exe的执行过程,写出每一步执行后,相关寄存器中的内容和栈顶的内容。
(3)PSP的头两个字节是CD 20,用Debug加载t1.exe,查看PSP的内容。
实验:
assume cs:codesg
codesg segment
mov ax,2000H ;AX=2000H
mov ss,ax ;SS=2000H
mov sp,0 ;SP=0000H
add sp,10 ;SP=0010H
pop ax ;AX=0E24H
pop bx ;BX=3206H
push ax ;SS:SP=2000:000C=0E24H
push bx ;SS:SP=2000:000A=3206H
pop ax ;AX=3206H
pop bx ;BX=0E24H
mov ax,4C00H ;AX=4C00H
int 21H
codesg ends
end
PSP的内容:
-d ds:0 100
1448:0000 CD 20 FF 9F 00 9A F0 FE-1D F0 4F 03 36 0E 8A 03
1448:0010 36 0E 17 03 36 0E 25 0E-FF FF FF FF FF FF FF FF
1448:0020 FF FF FF FF FF FF FF FF-FF FF FF FF E3 13 F6 FF
1448:0030 00 20 14 00 18 00 48 14-FF FF FF FF 00 00 00 00
1448:0040 05 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
1448:0050 CD 21 CB 00 00 00 00 00-00 00 00 00 00 20 20 20
1448:0060 20 20 20 20 20 20 20 20-00 00 00 00 00 20 20 20
1448:0070 20 20 20 20 20 20 20 20-00 00 00 00 00 00 00 00
1448:0080 00 0D 74 31 2E 65 78 65-0D 42 4C 41 53 54 45 52
1448:0090 3D 41 30 0D 64 64 72 65-73 73 2E 20 20 46 6F 72
1448:00A0 20 65 78 61 6D 70 6C 65-3A 0D 20 6F 6E 20 4E 54
1448:00B0 56 44 4D 2C 20 73 70 65-63 69 66 79 20 61 6E 20
1448:00C0 69 6E 76 61 6C 69 64 0D-20 6F 6E 6C 79 2E 0D 00
1448:00D0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
1448:00E0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
1448:00F0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
1448:0100 B8
- [younggay] 如果段中的数据占N个字节,则程序加载后,该段实际占有的空间为N ================ 08/18 09:29
- [younggay] 实验五的第1、2题中,“s: mov [bx],bx ”这条指令应该是“s: mov [bx], 08/18 09:27
- [younggay] 更改后的回答都OK了。 08/18 08:56
- [mywiil] 博主回答的都没有问题。 对于检测点9.1 (1)db 0 dw 0 这个答案, 08/13 09:49
- [游客] 连中断都理解到了,看来博主很用心。 中断除了保存cs,ip外还有标志寄存器。 08/07 18:47
- [游客] 监测点2.1的(1)中有些不对,建议重新全部计算一下。 检测点2.3建议看看本章节的“小结”,就明 08/06 14:58
- [tinyparticle] 检测点2.1(1) 第二格mov ah,31h 第十一格add ah,ah 第十二格 08/05 21:56
- [游客] 事情选择了,就要做,做就要做好! 08/03 20:54
[ 游客 发表于 2009-08-07 18:47 ]
连中断都理解到了,看来博主很用心。
中断除了保存cs,ip外还有标志寄存器。