现场保护

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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 8086汇编 本笔记是笔者观看小甲鱼老师(鱼C论坛)《零基础入门学习汇编语言》系列视频的笔记,在此感谢他和像他一样...
    Gibbs基阅读 37,659评论 8 114
  • 原文地址:C语言函数调用栈(一)C语言函数调用栈(二) 0 引言 程序的执行过程可看作连续的函数调用。当一个函数执...
    小猪啊呜阅读 10,199评论 1 19
  • 王爽汇编全书知识点大纲 第一章 基础知识 机器语言 汇编语言的产生 汇编语言的组成 存储器 cpu对存储器的读写 ...
    2c3ba901516f阅读 7,089评论 0 1
  • 梦中人一分钟抱紧接十分钟的吻陌生人怎样走进内心制造这次兴奋我仿似跟你热恋过和你未似现在这槎近思想开始过份为何突然袭...
    西丷阅读 26评论 0 3
  • 比较感性,容易感动,容易动怒,语无伦次。找个安静的地方或者用某种发泄方式来释放。这个社会带给我的创伤,这个社会产生...
    浅港墨漓阅读 1,053评论 0 0