資料來源:彙編語言第二版-王爽
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,超出了轉移範圍,所以會引起編譯錯誤。
有錯誤請指正,謝謝!