彙編語言學習分享(四)

[BX]的含義

想要完整的描述一個內存單元,須要兩個條件:1.內存單元的地址 2.內存單元的長度(類型)。
首先講一下[0]的含義,[0]表示的內存單元,偏移地址爲一個當即數0,段地址默認保存在DS寄存器中(以前的文章中講到過,經過DS寄存器和偏移地址(ds:[0])就能夠肯定內存中的一個地址)。
說完[0]再回頭來講[bx],[bx]表示的依然是偏移地址,可是它不是一個當即數了,而是保存在一個寄存器中,段地址仍是默認保存在DS寄存器中。編程

loop指令

loop指令的格式是:loop 標號,CPU執行loop指令的時候,要進行兩部操做,第一步:cx = cx - 1 第二步:判斷cx中的值,不爲零則轉至標號處執行程序,若是爲零則向下執行。從這兩步咱們能夠看出loop指令的執行結果受到cx中值的影響,一般狀況下,咱們使用loop指令來實現循環功能,cx中存放loop指令須要循環的次數。框架

僞指令

在彙編語言中,包含兩種指令,一種是彙編指令,另外一種是僞指令,彙編指令是對應着機器碼,能夠直接被編譯爲機器指令被CPU執行,而僞指令不會被CPU執行,它是用來讓編譯器進行相關的編譯工做。
(1)segment
segnment和ends是一對成對使用的僞指令,用於定義一個段,segnment用於聲明一個段開始,ends用於聲明一個段結束,使用格式爲:oop

段名 segnment
段名 ends

好比用codesg爲段名聲明一個用於存放數據的段:code

codesg segnment 
codesg ends

一個彙編程序由多個段造成,這些段用來存放代碼、數據或者看成棧空間使用,一個有意義的彙編程序至少要有一個段用於存放代碼。內存

(2)end
end指令是一個彙編程序的結束標記,編譯器在執行彙編程序的時候若是碰到end就結束對源程序的編譯。編譯器

(3)assume
assume是假設的意思,它用於假設某一個寄存器和程序中的某一段相關。好比:
assume cs:codesg
就是將代碼段codesg和CPU的段寄存器cs聯繫在一塊兒。編譯

再來說講標號,除了彙編指令和僞指令之外,還有標號,一個標號指代一個地址。好比codesg segment,這個codesg最終將被處理爲一個段的段地址。循環

程序分析

接着來分析一段求2的10次方彙編程序程序

assume cs:code
code segment
    mov ax,2
    mov cx,9
s: add ax,ax
    loop s
    mov ax,4c00h
    int 21h
code ends
end

分析:
先來看一下總體框架數據

  • assume cs:code表示cs與code代碼段有聯繫
  • code segment和code ends用於標識一段代碼段
  • end用於表示程序結束

接着分析中間部分

  • mov ax,2 將2存到ax寄存器中用做初始值
  • 將9存放到cx中用於循環次數計數
  • s是標號,指代add ax,ax的地址
  • add ax,ax就是將ax中的值進行自加
  • loop s就是執行到這一句的時候就就跳轉到標號爲s的地方,也就是add ax,ax的地址,loop每執行一次cx就減一,只到cx爲0就執行結束,loop指令就再也不跳轉而是接着向下執行

最後的 mov ax,4c00h和 int 21h暫時先無論 這樣就將2的10次方的值保存在ax中了。

相關文章
相關標籤/搜索