彙編學習記錄之十二

資料來源:彙編語言第二版-王爽

1.loop指令

loop指令爲循環指令,所有的循環指令都是短轉移,在對應的機器碼中包含轉移的位移,而不是目的地址。

對ip的修改範圍都爲:-128~127。

指令格式:loop 標號

( (cx) = (cx) - 1 ,如果(cx)≠0,轉移到標號處執行。)

操作:(1) (cx)=(cx)-1;

           (2) 如果(cx)≠0,(ip)=(ip)+8位位移。

如果(cx)=0,什麼也不做(程序繼續向下執行)。

我們從loop的功能可以看出,指令 'loop 標號' 的功能相當於:

(cx)--;

if((cx) ≠ 0) jmp short 標號;

2.根據位移進行轉移的意義

jmp short 標號、jmp near ptr 標號、jcxz 標號、loop 標號等幾種彙編指令,它們對ip的修改是根據轉移目的地址和轉移起始地址之間的位移來進行的。在它們對應的機器碼中不包含轉移的目的地址,而包含的是目的地址的位移。

這種設計,方便了程序段在內存中的浮動裝配。

例如:

    彙編指令            機器指令
    mov cx,6            B9 06 00
    mov ax,10           B8 10 00
s:  add ax,ax           01 C0
    loop s              E2 FC

這段程序裝在內存中的不同位置都可以正確執行,因爲loop s 在執行時只涉及到s的位移(-4,前移4個字節,補碼錶示爲FCH),而不是s的地址。如果loop s的機器碼中包含的是s的地址,則就對程序段在內存中的偏移地址有了嚴格的限制,因爲機器碼中包含的是s的地址,如果s處的指令不在目的地址處,程序的執行就會出錯。而loop s的機器碼中包含的是轉移的位移,就不存在變個問題了,因爲,無論s處的指令的實際地址是多少,loop指令的轉移位移是不變的。

3.編譯器對轉移位移超界的檢測

根據位移進行轉移的指令,它們的轉移範圍受到轉移位移的限制,如果在源程序中出現了轉移範圍超界的問題,在編譯的時候,編譯器將會報錯。

例如下面的程序將引起編譯錯誤:

assume cs:code

code segment

start:    jmp short s
          db 128 dup (0)
    s:    mov ax, 0ffffh

code ends

end start

因爲 jmp short s轉移範圍是-128~127,ip最多向後移動127個字節,而這個例子中s的轉移位移是128,超出了轉移範圍,所以會引起編譯錯誤。

 

 

有錯誤請指正,謝謝!

發佈了24 篇原創文章 · 獲贊 7 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章