1. 理解和掌握寄存器間接尋址方式[bx]編程
2. 經過彙編指令 loop 的使用理解編程語言中循環的本質編程語言
3. 熟練掌握使用 debug 按需調試完整彙編源程序的方法oop
1. 學習/複習第 5 章使用[bx]和 loop 實現循環的編程應用示例(教材 5.5 節,5.8 節)學習
2. 複習第 3 章「棧」的知識spa
3. 結合第 4 章課件,複習完整彙編源程序編寫→彙編→鏈接→運行→調試的方法debug
1. 綜合使用 loop,[bx],編寫完整彙編程序,實現向內存 b800:07b8 開始的連續 16 個調試
字單元重複填充字數據 0403H。code
必作:綜合使用 loop, [bx], mov 實現blog
實現代碼以下:內存
assume cs:code code segment mov ax,0b800h mov ds,ax mov cx,16 mov bx,07b8H mov ax,0403h s: mov [bx],al inc bx mov [bx],ah inc bx loop s
mov ax,4c00h int 21h code ends end
首先固然是設置bx和ds的值,將b800經過ax傳給ds(因爲b800是以字母開頭的,因此應當在前面加上一個0),bx的值設爲07b8h.
最後將ax的值設爲0403h,用於累加
這裏要加16次,顯然要使用loop循環,設置cx的值等於16以控制循環次數,用inc bx每次bx地址加1
一個字單元是16位的,採用小端法讀字
實驗結果以下:
這裏仍然使用了上一個實驗中所使用的process.bat簡化步驟,能夠看出輸出結果是一串紅心
2. 綜合使用 loop,[bx],編寫完整彙編源程序,實現向內存 0:200~0:23F 依次傳送數據
0~63(3FH)。
代碼以下:
assume cs:code code segment mov ax,20h mov ds,ax mov bx,0 mov cx,64 s:mov [bx],bx inc bx loop s mov ax,4c00h int 21h code ends end
首先邏輯地址0:200能夠寫成20:0,這樣改寫是爲了便於後面bx遞增,經過ax將20h傳入到ds中。
bx初值賦爲0,一共須要執行64次,將cx的值賦爲64以控制循環次數
恰好這裏須要傳送的數據0~63(3FH)與[bx]是一致的,數據0-63是64個連續的數字,0-3fH也是連續的64個編號。
咱們可使用一個bx變量就把偏移地址和數字的遞增都搞定。
因此循環段內容就寫成了如上的樣子
實驗結果以下:
彷佛沒有什麼變化和輸出,仿照前面實驗的經驗,咱們將屏幕清空後再次執行
依然沒有發現有任何的輸出結果,固然這個程序是執行了的,猜想可能改程序沒有輸出,只是在內部內存中發生了一些變化。
3. 教材實驗 4(3)(P121)
分析過程:
cs段寄存器中存儲的是指向程序代碼段的段地址。此實驗是將程序的代碼(按字節)複製,故將cs寄存器中的指向代碼的段地址賦值給ax,再經過ax寄存器賦值給ds段寄存器。
因此顯然第一個空應當填寫CS
對於第二個空,咱們須要填寫CX的值,即須要知道循環的次數,這是重點,此試驗是將"mov ax,4c00h"以前的指令複製到內存0:200處
因此沒有執行前咱們不知道次數,索性先隨便輸入一個CX值,反彙編看出"mov ax,4c00h"以前的機器碼長度
這裏咱們隨機輸了個10,代碼以下
assume cs:code code segment mov ax,cs mov ds,ax mov ax,0020h mov es,ax mov bx,0 mov cx,10 s:mov al,[bx] mov es:[bx],al inc bx loop s mov ax,4c00H int 21H code ends end
Debug後查看和反彙編的內容如上
CX的值爲1C,即整個代碼長度
咱們發現mov ax,4cooh/int 21h它們共佔用了5個字節。因此在本實驗中咱們須要複製的代碼字節數是001CH-0005H=0017H==23個字節,故cx計數寄存器賦值爲23或17H。
故正確的代碼以下
assume cs:code code segment mov ax,cs mov ds,ax mov ax,0020h mov es,ax mov bx,0 mov cx,17h s:mov al,[bx] mov es:[bx],al inc bx loop s mov ax,4c00H int 21H code ends end
成功編譯鏈接後,咱們進入Debug,對0020:0(即0:200)處,長度爲17h的內存進行反彙編,查看其中的內容
經查看發現確實是mov ax,4c00h"以前的指令複製到內存0:200處,實驗成功!!!
(1)不只能夠向內存中寫入數據,還能夠複製代碼
(2)在必須執行過一次才能知道結果的狀況下,咱們能夠先假設再得出準確的數值
(3)loop的做用很大,極大的減小沒必要要的重複操做