汇编 无条件转移和过程调用指令
生活随笔
收集整理的這篇文章主要介紹了
汇编 无条件转移和过程调用指令
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
(1)JMP無條件轉移指令
- 指令格式:JMP 目的
- 指令功能:
使程序無條件地轉移到指令中指定的目的地去執行。 - 這類指令又分為兩種類型:
- 第一種類型:段內轉移或近(NEAR)轉移,轉移指令的目的地址和JMP指令在同一代碼段中,轉移時僅改變IP寄存器的內容,段地址CS的值不變。
- 第二種類型:段間轉移,又被稱之為遠(FAR) 轉移,轉移指令的目的地址和JMP指令不在同一段中,發生轉移時,CS和IP的值都要改變——程序要轉移到另一個代碼段去執行。
無條件轉移指令的類型和方式
| 段內轉移 | 直接 | 立即短轉移(8位) |
| 段內轉移 | 直接 | 立即近轉移(8位) |
| 段內轉移 | 間接 | 寄存器(16位) |
| 段內轉移 | 間接 | 存儲器(16位) |
| 段間轉移 | 直接 | 立即轉移(32位) |
| 段間轉移 | 間接 | 存儲器(32位) |
指令格式:JMP SHORT 標號 JMP NEAR PTR 標號(或JMP 標號)
jmp指令能夠修改 IP 或 CS 或者同時修改的指令
- CS:段地址
- IP:偏移地址
通過以下指令,修改段地址和偏移地址
jmp 4000:0 jmp 2600:500
錯誤的修改CS和IP的方式:
以上三條修改方式均是錯誤的修改方式。
注意:用以下方式雖然編譯成功,但是也不能對CS進行正確的修改。
mov ax,500 mov cs,ax但是用以下這種方式對IP進行修改:
mov ax,500 jmp ax指令執行的過程:
- 1.CPU從 cs:ip 所組成的地址中讀取指令,將這個指令存放到指令緩存器中
- 2.IP = IP + 所讀指令的字節數
- 3.執行指令緩存器中的內容,回到步驟 1 重復這個過程。
假設cs = 2000, IP = 0000, 寫出指令執行的過程
a 2000:0 mov ax,6622 ; cs = 2000, ip = 0 + 3 = 3 jmp 1000:3 ; cs =2000, ip= 3 + 5 = 8 mov cx,axa 1000:0 mov ax,0123 ; cs = 1000 ip = 0 + 3 = 3 mov ax,0 ; cs = 1000 ip = 3 + 3 = 6 mov bx,ax ; cs = 1000 ip = 6 + 2 =8 jmp bx ;cs = 1000 ip = 0
例:
mov ax,bx ; ax = bx sub ax,ax ; ax = ax - ax =0 jmp ax mov ax,bx ; => 指令緩存器 => 1 => 執行 sub ax,ax ; => 指令緩存器 = > 1 = > 執行 jmp ax ; => 指令緩存器 = > 1 => 執行 => 1上面3條指令執行后,cpu 4次修改了IP,最后一次IP的值為0
用3條指令寫入從2000:0開始的內存單元,利用3條指令計算 2 的 8 次方
mov ax,1 add ax,ax jmp 2000:3
(2)過程調用和返回指令
在編寫程序時,往往把某些能完成特定功能而又經常要用到的程序段,編寫成獨立的模塊,并把它成為過程,習慣上也稱為主程序,然后在程序中用CALL語句調用這些過程,調用過程的程序稱為主程序。若在過程運行中又去調用另一個過程,稱為過程嵌套。它使程序結構清晰,可讀性強,同時也能節省內存。
過程調用和返回指令的格式如下:
CALL 過程名 RET過程調用有近調用和遠調用兩種類型 。
例如:
上面程序代碼執行的順序:
總結
以上是生活随笔為你收集整理的汇编 无条件转移和过程调用指令的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: STM32F 103C8T6开发板 点亮
- 下一篇: 汇编 debug调试