現場保護

assume  cs:code,ds:data,ss:stack  

;棧段(存放數據,比如高級語言中的局部變量)
stack segment 
    db 20 dup(0)
stack ends

;數據段(存放數據,比如高級語言中的全局變量)
data segment   
     db 20 dup(0)
     str db "Hello World!$"              
data ends

;代碼段
code segment
start: 
    ;設置ds和ss
    mov ax,data
    mov ds,ax
    mov ax,stack
    mov ss,ax


    ;業務邏輯代碼
    push 3h    ;傳遞參數
    push 4h
    call sum
    ;add sp,6   
    
    
      
    ;退出程序
    mov ah,4ch
    int 21h   
    ;參數:傳遞兩個字型參數,參數分別用bx,dx存放
    ;返回值:返回值存放在ax中
 sum:
     ;保護bp
     push bp
     mov bp,sp    
     sub sp,20  ;20字節留作局部變量 
     ;保護寄存器
     push bx
     push cx
     push dx
     ;*****************業務邏輯代碼
     ;定義兩個局部變量
     mov ss:[bp - 2],1h
     mov ss:[bp - 4],2h  
     
     ;修改寄存器
     mov bx,2h
     mov cx,3h
     mov dx,4h  
     
     mov ax,ss:[bp + 2] 
     add ax,ss:[bp + 4] 
     add ax,ss:[bp - 2]
     add ax,ss:[bp - 4]  
     ;*****************業務邏輯代碼 
     ;恢復寄存器
     pop dx
     pop cx
     pop bx
     
     ;恢復sp
     mov sp,bp   
     ;恢復bp
     pop bp
     
     ret 4  
      
code ends
end start

;函數棧平衡:保證函數調用前后的棧頂是一致的
;1.外平棧:由函數外部保持棧平衡
;2.內平棧:由函數內部保持棧平衡
;int sum(int a, int b)
;{
; int c = 1;
; int d = 2;
; return a + b + c + d;
;}
;函數的調用流程
;1.push參數(64位cpu 任性使用寄存器)
;2.call指令調用(將下一條指令地址入棧)
;3.保護bp寄存器,將sp賦值給bp
;4.提升sp指針,作為局部變量空間(sp 減去值)
;5.保護寄存器
;6.業務邏輯
;7.恢復寄存器
;8.恢復sp(sp指向bp/sp 加上值)
;9.恢復bp(pop bp)
;10.返回(ret)

例圖

641BC049-D881-4F8B-B2C9-2CACE359C7DB.png
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容