第五章 [BX]和loop指令

<1>[BX]編程

想要完整地描述一個內存單元,須要兩種信息:(1)內存單元的地址(2)內存單元的長度(類型)。[BX]和[0]有些類似,表示一個內存單元,它的偏移地址在bx中。指令mov ax,[bx]的功能爲將bx中存放的數據做爲一個偏移地址EA,段地址SA默認在ds中,將SA:EA處的數據送入ax中,即(ax)=((ds)*16+(bx))。ps:此處的()表示的爲括號內寄存器或者內存單元的內容。oop

<2>Loop指令spa

loop在英語中有循環的含義,因此這個指令應該和循環有關。loop指令的格式:loop 標號,這裏的標號指明瞭循環開始的地方。CPU執行loop指令的時候,要進行兩步操做:(1)(cx)=(cx)-1(2)判斷cx中的值,若是不爲零則轉至標號處執行程序,若是爲零則向下執行。通過書上所給示例的實踐,能夠總結出用cx和loop指令相配合實現循環功能的3個要點:(1)在cx中存放循環次數(2)loop指令中的標號所標識的地址要在前面(3)要循環執行的程序段,要寫在標號和loop指令的中間。3d

<3>Debug和彙編編譯器masm對指令的不一樣處理blog

 在Debug中咱們曾經使用過mov ax,[0]這樣的指令,這條指令表示將ds:0處的數據送入寄存器ax中。可是在彙編的源程序中,指令「mov ax,[0]」被編譯器看成指令「mov ax,0」來處理。通過實踐咱們能夠看出Debug和編譯器對這些指令中的「[idata]」解釋的不一樣。Debug將其解釋爲「[idata]」是一個內存單元,「idata」爲內存單元的偏移地址;而編譯器將其解釋爲「idata」。咱們若是想要實如今寄存器中訪問內存單元,咱們能夠把偏移地址送入bx寄存器中,用[bx]的方式來訪問內存單元。例如咱們想要訪問2000:0單元:mov ax,2000h;mov ds,ax;mov bx,0;mov al,[bx]通過驗證上述方法可以實現目標。但是用[bx]間接地給出內存單元的偏移地址仍是較爲麻煩的,咱們也能夠在[ ]中直接給出內存單元的偏移地址,只不過要在[ ]的前面顯式地給出段地址所在的段寄存器,例如咱們仍是要訪問2000:0單元:mov ax,2000h;mov ds,ax;mov al,ds:[0]通過實踐能夠實現目標。內存

 

下面經過編程實踐書上的示例、問題,來對這章的內容有更深層次的理解。編譯器

(1)p100示例asm

上述代碼所實現的是計算2^12,使用11條重複的add ax,ax指令可以達成目標但是太過於繁瑣,而使用循環指令loop可以很好的簡化程序,下面咱們對循環程序進行跟蹤。編譯

使用u指令查看程序對應的彙編指令以及其在內存的存儲狀況,並用g指令執行到程序返回以前,在執行以後能夠看到結果送入寄存器ax值爲1000h即2^12,實現了目標。循環

(2)p102示例

上述的代碼所要實現的是用加法實現123*236,結果存入寄存器ax中,下面對程序進行跟蹤。

 

執行和(1)相同的操做能夠看到寄存器ax在程序執行到返回先後的值爲7164h即29028,實現了目標。在這個實驗中若是咱們將236加123次,能夠用123次加法實現相同的目標,提升了計算的速度。

相關文章
相關標籤/搜索