日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

转移指令的原理

發布時間:2025/3/15 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 转移指令的原理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

可以修改IP,或同時修改CS和IP對的指令統稱為轉移指令。概括的來講,轉移指令就是可以控制CPU執行內存中的某處代碼的指令
8086CPU的轉移行為有以下=幾類。

  • 只修改IP的段內轉移,比如:jmp ax
  • 同時修改CS和IP時,稱為段間轉移,比如:jmp 1000:0
    由于轉移指令對IP的修改范圍不同,段內的轉移又分為:短轉移和近轉移
  • 短轉移的IP修改范圍是-128~127
  • 近轉移IP的修改范圍為-32786~32786

8086CPU的轉移指令分為以幾類:
- 無條件轉移指令(如:jmp)
- 條件轉移指令
- 循環指令(如:loop)
- 過程
- 中斷

操作符offset

操作符offset在匯編語言中是由編譯器處理的符號,它的功能是取得標號的偏移地址;

assume cs:code code segmentstart: mov ax,offset start ;相當于 mov ax,0s: mov ax,offset s ;相當于 mov ax,3 code ends end start

mov ax,offset start相當于指令mov ax,0,因為start是代碼段中標號,它所標記的指令是代碼中的第一條指令,偏移地址為0;
mov ax,offset s 相當于指令mov ax,3,因為s是代碼中的標號,它所指向的指令是代碼中第二條指令,第一條指令的長度是3個字節,則s的偏移地址為3;

jmp指令

依據位移進行轉移的jmp指令

jmp short 標號(跳轉到標號處執行)
這種jmp實現的是段內轉移,它對IP修改的范是-128~127。jmp指令前的short說明要進行的是短轉移,
例如:

assume cs:code code segmentstart: mov ax,0jmp short sadd ax,1s: inc ax code ends end start

還有一種和jmp功能想近的指令格式,jmp near ptr標號,它實的是段內近轉移

轉移的目的地址在指令中的jmp指令

指令“jmp far ptr 標號”實現的是段間轉移,又稱為遠轉移
實現代碼如下:

assume cs:code code segment start: mov ax,0mov bx,0jmp far ptr sdb 256 dup (0)s: add ax,1inc ax code ends end start

轉移指令在寄存器中的jmp指令

指令格式:jmp 16位寄存器

轉移地址在內存中的jmp指令

格式:

  • jmp word ptr 內存單元地址(段內轉移)
    功能:從內存單元地址處開始存放著一個字,是轉移的目的偏移地址。
    內存單元地址可用尋址方式的任一格式給出。

  • jmp dword ptr 內存單元地址(段間轉移)
    功能:從內存單元地址處開始存放著兩個字,高地址處的字是轉移的目的段地址,低地址處是轉移的偏移地址;
    (CS) = (內存單元地址 + 2)
    (IP) = (內存單元地址)

mov ax,0123H mov ds:[0],ax mov word ptr ds:[2],0 jmp dword ptr ds:[0]

jcxz指令

jcxz指令為有條件轉移指令,所有的有條件轉移指令都是短轉移,在對應的機器碼中包含轉移位移,而不是目的的地址。對IP的修改范圍為:-128~127。
指令格式:jcxz 標號(如果(CX) = 0,轉移到標號處執行)
操作: 當(cx)==0時,(IP)=(IP)+8位位移

也是判斷 CX 是否為零作為跳轉的條件

當(cx)!=0時,什么也不做(程序向下執行);
<==>
if((cx)==0)jmp short 標號;

loop指令

loop指令為循環指令,所有的循環指令都是短轉移,在對應的機器碼中包含轉移的位移,而不是目的地址。對IP的修改范圍為:-128~127.
指令格式: loop 標號((cx)!= 0,轉移到標號處執行。)
<==>
高級語言

(cx)--; if((cx)!=0)jmp 標號;

根據位移進行轉移的意義

方便程序進行浮動裝配

mov cx,6 mov ax,10H s:add ax,ax loop s

這一段代碼放在程序的任何地方都能正常的執行

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

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

總結

以上是生活随笔為你收集整理的转移指令的原理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。