[汇编语言]-第十章 ret,retf,call指令
1- ret 相當(dāng)于 pop IP;用棧中數(shù)據(jù),修改IP內(nèi)容.從而實現(xiàn)近轉(zhuǎn)移.
執(zhí)行后(IP)=0, CS:IP指向代碼段的第一條指令.
1 assume cs:code 2 stack segment 3 db 16 dup(0) 4 stack ends 5 code segment 6 mov ax,4c00h 7 int 21h 8 start: 9 mov ax,stack 10 mov ss,ax 11 mov sp,16 12 mov ax,0 13 push ax 14 mov bx,0 15 ret 16 code ends 17 end start?
2- retf 相當(dāng)于 pop IP; pop CS;用棧中數(shù)據(jù)修改CS,IP內(nèi)容.從而實現(xiàn)遠轉(zhuǎn)移.
執(zhí)行后 CS:IP指向代碼段的第一條指令.
1 assume cs:code 2 stack segment 3 db 16 dup(0) 4 stack ends 5 code segment 6 mov ax,4c00h 7 int 21 8 start: 9 mov ax,stack 10 mov ss,ax 11 mov sp,16 12 mov ax,0 13 push cs 14 push ax 15 retf 16 code ends 17 end startreference:
http://bbs.csdn.net/topics/340237304
?
3- 實現(xiàn)從內(nèi)存1000:0000處開始執(zhí)行指令
1 assume cs:code 2 stack segment 3 db 16 dup(0) 4 stack ends 5 code segment 6 mov ax,4c00h 7 int 21 8 start: 9 mov ax,stack 10 mov ss,ax 11 mov sp,16 12 mov ax,1000H 13 push ax 14 mov ax,0 15 push ax 16 retf 17 code ends 18 end start?
4- call 標號 (將當(dāng)前的IP壓棧后,轉(zhuǎn)到標號處執(zhí)行指令)
push Ip
jmp near ptr 標號
1 assume cs:code 2 code segment 3 start: 4 mov ax,0 5 call s 6 inc ax 7 s: 8 pop ax 9 code ends 10 end start?
?ax=6
CPU指令執(zhí)行的過程:
1- 從CS:IP指向的內(nèi)存單元讀取指令,讀取的指令,進入指令緩沖器.
2- (IP) = (IP) + 所讀取的指令長度, 從而指向下一條指令
3- 執(zhí)行指令, 轉(zhuǎn)到1, 重復(fù)這個過程
?
5-?call far ptr 標號
push cs?
push ip
jmp far ptr 標號
執(zhí)行步驟分析:
CS:1000 IP:3 時 讀取call far ptr s放入緩存, ip = IP + 5 = 8
push cs ?//1000
push ip ?//8
跳轉(zhuǎn)到s執(zhí)行
pop ax ?//ax = 8
add ax,ax // ax = 8 + 8 = 10 寄存器中存放的數(shù)為16進制
pop bx ?//bx = 1000
add ax,bx ?//ax = 1000 + 10 = 1010
最終結(jié)果 ax = 1010
?
6- call 16位寄存器
push IP
jmp 16位寄存器 ?// mov IP,16位寄存器; jmp IP
ax=000B
sp是棧頂?shù)刂?[bp]棧頂值為5
ax = 6 + 5 = B
reference:
http://bbs.csdn.net/topics/100016651
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/galoishelley/p/3788306.html
總結(jié)
以上是生活随笔為你收集整理的[汇编语言]-第十章 ret,retf,call指令的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IOC容器特性注入第一篇:程序集反射查找
- 下一篇: 访问者(Visitor)模式