匯編六

8086偽指令

  • db (define byte) 字節(jié)
  • dw (define word) 字
示例代碼:
assume cs:code 
code segment
     db 1,2,3,4,5,6,7,8,9
     db 'hello'
     db "Flonger"
 start:    
     mov al,cs[3]
     mov ah,0
     mov ah,4cH
     int 21H ;中斷  中斷碼叫做21
code ends    
end start

除了cs段不需要指定,剩下的棧段ss,數(shù)據(jù)段ds必須指定

示例代碼:
assume  cs:code,ds:data,ss:stack  
;棧段(存放數(shù)據(jù),比如高級語言中的局部變量)
stack segment 
    db 20 dup(0)
stack ends
;數(shù)據(jù)段(存放數(shù)據(jù),比如高級語言中的全局變量)
data segment   
     db 20 dup(0)
     str db "Hello World!$"    
data ends
;代碼段
code segment
start: 
    ;設(shè)置ds和ss
    mov ax,data
    mov ds,ax
    mov ax,stack
    mov ss,ax

    mov ax,1122h   
    ;退出程序
    mov ah,4ch
    int 21h     
code ends
end start
打印的指令:
;打印,遇到$停止打印
mov ah,9h
int 21h

Call 和 ret 指令

  • Call指令

  • 將下一條指令的偏移地址入棧

  • 跳轉(zhuǎn)到定位的地址執(zhí)行指令

  • ret指令

  • 將棧頂?shù)闹祊op給IP

示例代碼:
assume  cs:code,ds:data,ss:stack  
;棧段(存放數(shù)據(jù),比如高級語言中的局部變量)
stack segment 
            db 20 dup(0)
stack ends
;數(shù)據(jù)段(存放數(shù)據(jù),比如高級語言中的全局變量)
data segment   
            db 20 dup(0)
            str db "Hello World!$"    
data ends
;代碼段
code segment
start: 
           ;設(shè)置ds和ss
           mov ax,data
           mov ds,ax
           mov ax,stack
           mov ss,ax
           ;業(yè)務(wù)邏輯代碼 
           call print
           mov ax,1122h   
           ;退出程序
           mov ah,4ch
           int 21h  
print: 
           mov ax,3344h
           push ax   
           mov dx,offset str;offset 獲得標(biāo)號對應(yīng)的偏移
           mov ah,9h
           int 21h 
           pop ax
           ret   
code ends
end start
  • 函數(shù)調(diào)用,參數(shù)使用寄存器

示例代碼
assume  cs:code,ds:data,ss:stack  
;棧段(存放數(shù)據(jù),比如高級語言中的局部變量)
stack segment 
    db 20 dup(0)
stack ends
;數(shù)據(jù)段(存放數(shù)據(jù),比如高級語言中的全局變量)
data segment   
     db 20 dup(0)             
data ends
;代碼段
code segment
start: 
    ;設(shè)置ds和ss
    mov ax,data
    mov ds,ax
    mov ax,stack
    mov ss,ax
    ;業(yè)務(wù)邏輯代碼 
    mov bx,3h
    mov dx,4h
    call sum
    ;退出程序
    mov ah,4ch
    int 21h   
    ;參數(shù):傳遞兩個字型參數(shù),參數(shù)分別用bx,dx存放
    ;返回值:返回值存放在ax中
 sum:   
     mov ax,bx
     add ax,dx
     ret
code ends
end start

棧平衡

  • 在逆向過程中發(fā)現(xiàn)ip突然上升,然后又恢復(fù),指的是調(diào)用了一次函數(shù)
  • 函數(shù)內(nèi)部使用棧里面的數(shù)據(jù)不能pop來取,只能用段地址+偏移地址(SS:SP)來取
  • 這里引入bp寄存器
    • 在棧里面尋址不能用SS:[SP + 1]
    • 所以引入bp寄存器
mov bp,sp
mov ax,ss:[bp + 1]

函數(shù)棧平衡:保證函數(shù)調(diào)用前后的棧頂是一致的

  • 外平棧
push 1h
push 2h
call sum
add sp,4
  • 內(nèi)平棧
sum:
       mov bp,sp
       mov ax,ss:[bp+2]
       mov ax,ss:[bp+4]
       ret 4
示例代碼:
assume  cs:code,ds:data,ss:stack  
;棧段(存放數(shù)據(jù),比如高級語言中的局部變量)
stack segment 
    db 20 dup(0)
stack ends
;數(shù)據(jù)段(存放數(shù)據(jù),比如高級語言中的全局變量)
data segment   
     db 20 dup(0)             
data ends
;代碼段
code segment
start: 
    ;設(shè)置ds和ss
    mov ax,data
    mov ds,ax
    mov ax,stack
    mov ss,ax
    ;業(yè)務(wù)邏輯代碼
    push 1h
    push 3h
    push 4h
    call sum
    ;add sp,6   
    push 1h
    push 3h
    push 4h
    call sum
    ;add sp,6 
    push 1h
    push 3h
    push 4h
    call sum
    ;add sp,6 
    ;退出程序
    mov ah,4ch
    int 21h   
    ;參數(shù):傳遞兩個字型參數(shù),參數(shù)分別用bx,dx存放
    ;返回值:返回值存放在ax中
 sum:
     mov bp,sp   
     mov ax,ss:[bp + 2] 
     add ax,ss:[bp + 4]
     add ax,ss:[bp + 6]
     ret 6
      
code ends
end start
;函數(shù)棧平衡:保證函數(shù)調(diào)用前后的棧頂是一致的
;1.外平棧:由函數(shù)外部保持棧平衡
;2.內(nèi)平棧:由函數(shù)內(nèi)部保持棧平衡

Xcode中相應(yīng)的實例分析有待添加。。。

以上

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容