操作符offset
操作符offset在匯編語言中是由編譯器處理的符號,它的功能是取得標號的偏移地址([bx,bp,si,di])。
示例:使該程序在運行中將s處的一條指令復制到s0處。
1 assume cs:codesg 2 codesg segment 3 s: mov ax,bx ;(mov ax,bx 的機器碼占兩個字節) 4 mov si,offset s 5 mov di,offset s0 6 mov ax,cs:[si] 7 mov cs:[di],ax 8 s0: nop ;(nop的機器碼占一個字節) 9 nop 10 codesg ends 11 ends
jmp指令
jmp為無條件轉移,可以只修改IP,也可以同時修改CS和IP;
jmp指令要給出兩種信息:
- 轉移的目的地址
- 轉移的距離(段間轉移、段內短轉移,段內近轉移)
1、段內短轉移
格式:jmp short 標號(轉到標號處執行指令)
這種格式的 jmp 指令實現的是段內短轉移,它對IP的修改范圍為 -128~127,也就是說,它向前轉移時可以最多越過128個字節,向后轉移可以最多越過127個字節。
執行 jmp short 標號 指令的過程:
(1)從CS:IP指向內存單元讀取指令,讀取的指令進入指令緩沖區;
(2)(IP) = (IP)+所讀取指令的長度(8位地址,因為范圍是-128~127),從而指向下一條指令;
(3)執行指令。轉到1,重復這個過程。
所以 CPU在執行 jmp short 標號 指令時並不需要轉移的目的地址,只需要知道轉移的位移就行了。
2、段內近轉移
格式:jmp near ptr 標號
指令“jmp near ptr 標號”的功能為:(IP)=(IP)+16位位移(一個段最大有2^16B)。
3、段間轉移
格式:jmp far ptr 標號
(CS)=標號所在段的段地址;
(IP)=標號所在段中的偏移地址。
far ptr指明了指令用標號的段地址和偏移地址修改CS和IP。
轉移地址在內存中的jmp指令
轉移地址在內存中的jmp指令有兩種格式:
(1) jmp word ptr 內存單元地址(段內轉移)
功能:從內存單元地址處開始存放着一個字,是轉移的目的偏移地址。內存單元地址可用尋址方式的任一格式給出。
(2) jmp dword ptr 內存單元地址(段間轉移)


jcxz指令
jcxz指令為有條件轉移指令,所有的有條件轉移指令都是短轉移,在對應的機器碼中包含轉移的位移,而不是目的地址。對IP的修改范圍都為-128~127。
指令格式:jcxz 標號(如果(cx)=0,則轉移到標號處執行。)
jcxz 標號 指令操作:
1、當(cx)=0時,(IP)=(IP)+8位位移)
- 8位位移=“標號”處的地址-jcxz指令后的第一個字節的地址;
- 8位位移的范圍為-128~127,用補碼表示;
- 8位位移由編譯程序在編譯時算出。
2、當(cx)!=0時,什么也不做(程序向下執行)。


loop指令
loop指令為循環指令,所有的循環指令都是短轉移,在對應的機器碼中包含轉移的位移,而不是目的地址。對IP的修改范圍都為-128~127。
指令格式:loop 標號
((cx))=(cx)-1,如果(cx)≠0,轉移到標號處執行。
loop 標號 指令操作:
(1)(cx)=(cx)-1;
(2)如果(cx)≠0,(IP)=(IP)+8位位移。
- 8位位移=“標號”處的地址-loop指令后的第一個字節的地址;
- 8位位移的范圍為-128~127,用補碼表示;
- 8位位移由編譯程序在編譯時算出。
當(cx)=0,什么也不做(程序向下執行)。



