第三章 檢測點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]讀取的是數據。