1. 程式人生 > >彙編實驗4 [bx]和loop的使用

彙編實驗4 [bx]和loop的使用

實驗內容

1.實驗1

  • 原始碼:
 1 assume cs:code
 2 code segment
 3     mov ax,0b800h
 4     mov ds,ax
 5     mov ax,0403h
 6     mov bx,07b8h
 7 
 8     mov cx,10h
 9 s:  mov [bx],ax
10     inc bx
11     inc bx
12     loop s
13 
14     mov ax,4c00h
15     int  21h
16 code ends
17 end
  • 按要求將0403H修改為0441H

  經彙編連線執行可得:

2.實驗2

原始碼:

 1 assume cs:code
 2 code segment
 3     mov ax,0
 4     mov ds,ax
 5     mov bx,0200h
 6     mov ax,0
 7     mov cx,40h
 8 s:  mov [bx],ax
 9     inc ax
10     inc bx
11     loop s
12     mov ax,4c00h
13     int 21h
14 code ends
15 end
  • 用debug進行除錯

  • 使用d命令檢視是否修改成功

 成功!nice!

 3.實驗3

補全程式碼,實現將“mov ax,4c00h”前的指令複製到記憶體0:200處。

老實說,剛看到題目的時候還是有點懵的,因為之前都是對資料進行操作,但是怎樣複製指令呢???

於是乎,就隨便填了點內容,想著就先試試看看

 1 assume cs:code
 2 code segement
 3     mov ax,00h
 4     mov ds,ax          
 5     mov ax,0020h
 6     mov es,ax
 7     mov bx,0
 8     mov cx,10h
 9     
10 s:  mov al,[bx]
11     mov
es:[bx],al 12 inc bx 13 loop s 14 15 mov ax,4c00h 16 int 21h 17 code ends 18 end

剛用u查看了一下命令,就意識到自己的學的是多麼爛,竟然會忘了機器是如何儲存指令的,也忘了指令同時也是資料,只是存放的暫存器不同。

所以,我也馬上就意識到,需要複製的指令不過是放存放在073A:0000到0016中的資料,想到這,自然就簡單了,指令存放在段暫存器cs中

 1 assume cs:code
 2 code segment
 3     mov ax,cs
 4     mov ds,ax
 5     
 6     mov ax,0020h
 7     mov es,ax
 8     
 9     mov bx,0
10     mov cx,17h
11     
12 s:  mov al,[bx]
13     mov es:[bx],al
14     inc bx
15     loop s
16     
17     mov ax,4c00h
18     int 21h
19 code ends
20 end

先用u命令檢視指令:

在用g命令執行:

執行完畢檢視0:200後的記憶體單元:

emmm......

這樣雖然看的出,但看著很不舒服,不過,我突然想到,既然是指令,何不用u命令檢視看呢

完成。

  • 複製的是存放在cs:ip中的“資料”,即指令,從076A:0000到076A:0016
  • 有17H個位元組,值得一提的是,我並不是直接輸入17H的,而是之前嘗試了其他的值,然後用u命令檢視的出的(本覺得那一部分沒必要寫,沒想到還問了。。。。)

結論與體會

實驗2中用棧來實現那一部分我並未完成,並不是我學習彙編的熱情沒了,而是我確實沒想出來,雖然我也可以偷偷借鑑一下別人的部落格來補全,但總感覺那沒啥意思。就想著先把基礎的,我能夠理解的部分弄熟一點,再進階吧,雖然已經是第十二週了。。。看來課後得多花點時間了