[BX] 和 loop 指令---汇编学习笔记
[BX] 和 loop 指令
5.1 [BX]
具體實例:
mov ax,[bx]功能:bx中存放的數據作為一個偏移地址EA,段地址SA默認在ds中,將SA:EA處的數據送入ax中。即:(ax) = ((ds)*16+(bx))。
問題 5.1
程序和內存中的情況如下圖所示,寫出程序執行后,21000H~21007H單元中的內容。
程序代碼和結果如下:
5.2 Loop指令
loop指令格式:loop 標號
loop指令執行的時候,進行兩步操作:(cx) = (cx) - 1 和 判斷cx中的值,若不為0則轉至標號處執行程序,若為0則向下繼續執行程序(通俗的說,就是如果不為0繼續循環,為0就退出)。
任務:
對于上面3個問題,如果我們進行重復輸入指令去計算的話,會發現如果我們要計算一百次,就需要寫幾百行代碼。所以我們引入了loop這個工具。
程序用loop實現:
assume cs:codecode segmentmov ax,2mov cx,n ;這里的n代表n+1次方s: add ax,ax ;第一次add時,ax = 4 = 2^2loop s mov ax,4c00hint 21hcode endsend問題 5.2
編程,用加法計算 123*236,結果存在ax中。
assume cs:codecode segmentmov ax,0mov cx,123m: add ax,236loop mmov ax,4c00hint 21hcode endsend此時,效率達到最高。
5.3 在Debug中跟蹤用loop指令實現的循環程序
考慮這樣一個問題,計算ffff:0006單元中的數乘以3,結果存儲在dx中。
我們分析一下:
ffff:0006單元中的數是一個字節型的數據,范圍0~255之間,則用它和3相乘結果不會大于65535,可以在dx中存放下。
將ffff:0006單元中的數賦值給ax,用dx進行累加。先設(dx) = 0,然后做3次(dx) = (dx) + (ax)。
ax的低8位與ffff:6對其。
編寫程序:
assume cs:codecode segmentmov ax,0ffffhmov ds,axmov bx,6mov al,[bx]mov ah,0mov dx,0mov cx,3m: add dx,axloop mmov ax,4c00hint 21hcode endsend注意:在匯編源程序中,數據不能以字母開頭。
自行Debug調試。這里還有個g指令,可以直接跳到某個語句。格式為:g IP的地址。
Debug和匯編編譯器masm對指令的不同處理
在Debug中編程實現:
匯編源程序實現:
在Debug加載后:
我們發現,Debug將它解釋為[idata],而編譯器將[idata]解釋為idata(也就是說,mov al ,[0] 等效于 (ax) = 0。[idata]表示常量,[bx]表示ds:[bx]。)
loop 和 [bx] 的聯合應用
計算ffff:0~b單元中的數據的和,結果存儲在dx中。
分析:
ffff:0~b內存單元中的數據是字節型數據,范圍在0~255之間,12個這樣的數據相加,結果不會大于65535,可以在dx中存放下。
當然不行,因為ffff:0~b中的數據是8位的,不能直接加到16位寄存器dx中。
不行,dl是8位寄存器,只能容納0~255之間,可能會造成進位丟失。
將8位數據賦值到一個16位寄存器ax中,再將ax中的數據加到dx上。
程序代碼如下:
assume cs:code code segmentmov ax,0ffffhmov ds,axmov bx,0mov dx,0mov cx,12s: mov al,[bx]mov ah,0add dx,axinc bxloop smov ax,4c00hint 21hcode ends end這就是bx與loop配合使用的一個典型例子。
5.6 段前綴
我們可以使用段地址:[偏移地址]的形式:
以上的“ds:”、“cs:”、“ss:”、“es:”,在匯編語言中稱為段前綴。
5.7 一段安全的空間
我們執行以下程序:
assume cs:code code segmentmov ax,0mov ds,axmov ds:[26h],axmov ax,4c00hint 21hcode ends end運行后,發現報錯:
這是由于0000:0026處存放的重要系統數據被修改而造成的。
一般,合法的程序不會使用0000:0200~0000:02ff這段空間,所以對于我們來說,這段空間是安全的。
5.8 段前綴的使用
將內存ffff:0~b單元中的數據復制到0:200~0:20b單元中。
分析:
(1)0:200~0:20b單元等同于0020:0~0020:b單元,它們描述的是同一段內存空間,
(2)復制的過程應用循環實現。
(3)在循環中,源始單元ffff:x和目標單元0200:x的偏移地址x是變量。用bx存放。
(4)將0:200~0:20b用0020:0~0020:b描述。
程序如下:
assume cs:code code segmentmov ax,0ffffhmov ds,axmov ax,0020hmov es,axmov bx,0hmov cx,12m: mov dl,[bx]mov es:[bx],dlinc bxloop mmov ax,4c00hint 21hcode ends end實驗4 [bx]和loop的使用
(1)編程,向內存0:200~0:23F依次傳送數據0~63(3FH)。
assume cs:code code segmentmov ax,20hmov ds,axmov cx,40hmov bx,0s: mov [bx],bxinc bxloop smov ax,4c00hint 21hcode ends end(2)編程,向內存0:200~0:23F一次傳送數據0~63(3FH),程序中只能使用9條指令,9條指令中包括“mov ax,4c00h”和“int 21h”。
答案同上。
(3)下面的程序的功能是將“mov ax,4c00h”之前的指令復制到內存0:200處,補全程序。上機調試,跟蹤運行結果。
assume cs:code code segmentmov ax,076Amov ds,axmov ax,0020hmov es,axmov bx,0mov cx,1Bh s: mov al,[bx]mov es:[bx],alinc bxloop smov ax,4c00hint 21hcode ends end提示:
(1)復制的是什么?從哪里到哪里?
復制的是指令,從076A:0開始到0020:0。
(2)復制的是什么?有多少個字節?你如何知道要復制的字節的數量?
有1B個字節。
本章完
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的[BX] 和 loop 指令---汇编学习笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: B端产品经理如何更好的了解需求?
- 下一篇: 互联网日报 | 3月7日 星期日 | 《