|實驗二 用機器指令和匯編指令編程
實驗二 用機器指令和匯編指令編程
|實驗結論
(一、 預備知識
1.D命令也提供了一種符合CPU機理的格式:“D 段寄存器:偏移地址”,以段寄存器中的數據為段地址SA,列出從SA:偏移地址開始的內存區間中的數據。
例
查看從1000:0開始的內存區間中的內容
查看從1000:10~1000:18中的內容
查看當前代碼段中的指令代碼
查看當前棧段中的內容
2.在E、A、U命令中使用段寄存器。
在從1000:0開始的內存空間中寫入數據
以匯編指令的形式,顯示當前代碼段中的代碼,0代碼的偏移地址
以匯編指令的形式,向從1000:0開始的內存單元中寫入指令
3.debug的T命令在執行修改寄存器SS的指令時,下一條指令也緊接著被執行。
(二、p71實驗任務
1.使用debug,將下面的程序段寫入內存,逐條執行,根據指令執行後的實際運行情況填空。在使用 a 命令輸入指令調試前,使用 e 命令將內存單元 0021:0 ~0021:7 連續 8 個字節數據修改為 30H, 31H, 32H, 33H,34H,35H,36H,37H。
mov ax,0021
mov ds,ax
mov ax,2200
mov ss,ax
mov sp,0100
mov ax,[0]
add ax,[2]
mov bx,[4]
add bx,[6]
push ax
push bx
pop ax
pop bx
push [4]
push [6]
實驗前預測
mov ax,0021
mov ds,ax
mov ax,2200
mov ss,ax
mov sp,0100
mov ax,[0] ;ax=3130
add ax,[2] ;ax=6462
mov bx,[4] ;bx=3534
add bx,[6] ;bx=6C6A
push ax ;sp=00fe;修改的內存單元地址是00ff內容為6462
push bx ;sp=00fc;修改的內存單元地址是00fd內容為6C6A
pop ax ;sp=00fe;ax=6C6A
pop bx ;sp=0100;bx=6462
push [4] ;sp=00fe;修改的內存單元地址是00ff內容為3534
push [6] ;sp=00fc;修改的內存單元地址是00fd內容為3736
結果:
mov ax,0021
mov ds,ax
mov ax,2200
mov ss,ax
mov sp,0100
mov ax,[0] ;ax=3130
add ax,[2] ;ax=6462
mov bx,[4] ;bx=3534
add bx,[6] ;bx=6C6A
push ax ;sp=00fe;修改的內存單元地址是00ff內容為6462
push bx ;sp=00fc;修改的內存單元地址是00fd內容為6C6A
pop ax ;sp=00fe;ax=6C6A
pop bx ;sp=0100;bx=6462
push [4] ;sp=00fe;修改的內存單元地址是00ff內容為3534
push [6] ;sp=00fc;修改的內存單元地址是00fd內容為3736
分析:實驗時的確出現了t命令在執行修改寄存器ss的指令時,下一條指令也緊接著被執行。
2.分析為什麽2000:0~2000:f中的內容會發生改變。
按照題目要求輸入指令並執行
觀察發現這裏面有cs值(073f),ip值(0108),ax值(2000)
繼續執行指令並在push操作完成後用d命令查詢
發現寄存器ax中的值成功的被存入棧中
寫入pop指令將3366和3123出棧後,再次查詢棧中的數據
通過查詢資料,t命令實際是引發了單步中斷,執行中斷例程時,CPU會將一些中斷例程使用的的寄存器變量自動壓棧到棧中。
|總結與體會
通過對前三章的學習,我對匯編語言有了深入的了解,接觸並深入了解了一部分寄存器,從寄存器的角度理解了CPU的工作原理,以及內存訪問的一些方法,初次學習並掌握了mov,add,jmp,sub,push,pop指令。
最大的收獲就是,明白了匯編指令是不需要死記硬背的,可以根據自己的理解記憶。當我們對匯編指令的語法有新的想法時,可以直接用debug工具驗證,這樣也有助於我們加深理解。
|實驗二 用機器指令和匯編指令編程