第三章 检测点3.1
(1).在Debug中,用“d 0:0 1f”查看内存,结果如下。
下面的程序执行前,AX = 0,BX = 0,写出每条汇编指令执行完后相关寄存器中的值。
mov ax,1 ;将1放入AX寄存器中,此时AX寄存器中的值为1
mov ds,ax ;将AX寄存器中的值放入DS寄存器中,此时DS寄存器中的值为1
mov ax,[0000] AX = 2662 ;此时的内存单元地址为 DS*16+0=00010H,即将2662放入AX寄存器中
mov bx,[0001] BX = E626 ;将内存单元地址为00011H的数据放入BX寄存器中,即为E626
mvo ax,bx AX = E626 ;将BX寄存器中的数据放入AX寄存器中
mov ax,[0000] AX = 2662 ;和第三条指令相同
mov bx,[0002] BX = D6E6 ;将内存单元00012H的数据放入BX寄存器中
add ax,bx AX = FD48 ;将BX寄存器中的数据和AX寄存器中的数据相加后存入AX中,即 D6E6 + 2662 = FD48
add ax,[0004] AX = 2C14 ;将内存单元00014H中的数据和AX寄存器中的数据相加后放入AX中,即 FD48 + 2ECC = 12C14,注意此时数据已经超出AX寄存器所能存放的范围,所以只保留低16位
mov ax,0 AX = 0 ;将0放入AX寄存器中
mov al,[0002] AX = 00E6 ;将内存单元00012H中的数据放入AX寄存器的低八位中,由于操作的是低八位寄存器,所以此时按字节存放,即E6
mov bx,0 BX = 0 ;将0放入BX寄存器中
mov bl,[000C] BX = 0026 ;将内存单元0001CH中的数据放入BX寄存器的低八位
add al,bl AX = 000C ;将BX寄存器低八位中的数据和AX寄存器低八位中的数据相加后放入AX寄存器中的低八位,即 E6 + 26 = 10C,注意此时数据已超过AL的范围,所以只保留低8位
(2).内存中的情况如图3.6所示
各寄存器的初始值:CS = 2000H,IP = 0,DS = 1000H,AX = 0,BX = 0;
①写出CPU执行的指令序列(用汇编指令写出)
②写出CPU执行每条指令后,CS、IP和相关寄存器中的数值
③再次体会:数据和程序有区别吗?如何确定内存中的信息哪些是数据,哪些是程序?
mov ax,6622H ;AX = 6622H CS = 2000H IP = 0003H 将6622放入AX寄存器中,这条指令为3个字节,所以CS不变,IP+3
jmp 0ff0:0100 ;CS = 0FF0H IP = 0100H 这是一条跳转语句,跳转到CS=0FF0,IP=0100的地址
mov ax,2000H ;AX = 2000H CS = 0FF0H IP = 0103H 将2000放入AX寄存器中,这条指令为3个字节,所以CS不变,IP+3
mov ds,ax ;AX = 2000H DS = 2000H CS = 0FF0H IP = 0105H 将AX寄存器中的内容放入DS中,这条指令为3个字节,所以CS不变,IP+3
mov ax,[0008] ;AX = C389H CS = 0FF0H IP = 0108H 将内存单元为20008中的数据放入AX寄存器中,我们从图3.6可以看到内存单元地址为20008中存放的是89 C3,所以此时AX寄存器中的值为C389,注意此时是用DS+[xxxx]从某内存单元中取数据
mov ax,[0002] ;AX = EA66H CS = 0FF0H IP = 010BH 将内存单元为20002中的数据放人AX寄存器中
具体调试过程如下图:
通过上述过程,我们可以知道使用CS和IP读取的是指令,而是用DS和[xxxx]读取的是数据。