在汇编中重新认识函数

2021/05/13 编译原理

一个简单的 8086 汇编子程序(函数)。

assume cs:code
code segment
    main:   mov ax, 1000h
            call add1
            mov ax, 4c00h
            int 21h
    add1:   add ax, 1
            ret
code ends
end main
  • 标号main可以简单地理解为 C 语言中的 main 函数等入口函数;
  • 标号add1是函数 add1 的地址;
  • 指令call add1调用add1函数。在汇编中,call add1具体操作:将当前地址CS:IP压入栈SS:SP(这就是传说中的栈帧的由来吧?)中,接着转到add1开始执行;
  • 标号add1执行完add ax, 1之后,指令ret会将上一步中保存到SS:SP栈顶的地址传到CS:IP,再将该地址出栈;
  • 函数add1执行完毕。
  • 指令mov ax, 4c00hint 21h退出程序。

对以上汇编代码进行处理。

汇编

masm

链接

link

调试

debug

在这段代码中,我们重点关注 ax 寄存器。

  • 上图中的-r-t等是输入的命令,-相当于输入的提示符,rt才是实际输入的字符;在每个输出中的最后显示的是下一个将要执行的汇编指令,如MOV AX,1000

  • r查看当前寄存器状态。ax 初始值为 FFFF,下面将要执行的代码是MOV AX, 1000

  • t执行指令,并显示最新的寄存器状态。

Search

    Table of Contents