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