在汇编语言中,在主调函数中使用call指令,并且在被调函数中使用ret,这样就实现了函数调用这个过程。本文想展示一个另类的函数调用。下文中的示例代码1为我们通常使用的函数调用,示例代码2为另类的函数调用。
示例代码1如下:
.equ BOOT_SEG, 0x07C0
.code16
.section .text
.global _start
_start:
jmp $BOOT_SEG, $main
main:
mov %cs, %ax
mov %ax, %ds
mov %ax, %ss
mov $0x1, %ax
mov $0x2, %bx
call add
hlt
add:
push %bp
mov %sp, %bp
push %bx
push %cx
push %dx
jmp save_registers
add %bx, %ax
pop %dx
pop %cx
pop %bx
mov %bp, %sp
pop %bp
ret
.org 510
.word 0xAA55
示例代码2如下:
.equ BOOT_SEG, 0x07C0
.code16
.section .text
.global _start
_start:
jmp $BOOT_SEG, $main
main:
mov %cs, %ax
mov %ax, %ds
mov %ax, %ss
mov $0x1, %ax
mov $0x2, %bx
call add
hlt
save_registers:
push $1f
push %bp
mov %sp, %bp
push %bx
push %cx
push %dx
jmp *4(%bp)
1: pop %dx
pop %cx
pop %bx
mov %bp, %sp
pop %bp
jmp *6(%bp)
add:
push $1f
jmp save_registers
1: add %bx, %ax
jmp *2(%bp)
.org 510
.word 0xAA55