跳至主要內容
汇编语言一发入魂 0x08 - 过程调用中的参数传递

通常我们封装过程是为了方便调用,避免写重复的代码。过程调用时通常需要通过传递参数来控制过程的执行,今天我们来讲一讲参数传递时的一些规范和需要注意的地方。

先来看一个例子:

示例一

.code16

movw $0x7c00, %sp

callw set_cursor

jmp .

# 目的: 设置光标位置为 0
#
# 输入: 无
#
# 输出: 无
set_cursor:
  movw $0x3d4, %dx
  movb $0xe, %al
  outb %al, %dx

  movw $0x3d5, %dx
  movb $0, %al
  outb %al, %dx

  movw $0x3d4, %dx
  movb $0xf, %al
  outb %al, %dx

  movw $0x3d5, %dx
  movb $0, %al
  outb %al, %dx

  retw

.org 510
.word 0xAA55

未央大约 6 分钟汇编语言过程调用
汇编语言一发入魂 0x07 - 过程调用

前两篇文章中我们学习了如何控制屏幕光标,如何从硬盘读取数据。这种常用的功能我们希望将它封装成过程调用,类似于高级语言中的函数,这样当我们控制光标或者从硬盘读取数据时就不需要每次都写大段的重复代码了。

CPU中,执行的指令通过cs:ip来确定。过程调用实际上就是通过calllcall指令来修改ipcs:ip来达到跳转到另一段指令中执行的目的。

call指令通过修改ip来实现过程调用,因为只修改ip,所以被调例程与原例程在同一个代码段内,也称为近调用。处理器在执行call指令时先将call后面的第一条指令的偏移地址压栈,再通过操作数计算出新的ip替换当前ip


未央大约 7 分钟汇编语言过程调用