NASM汇编教程翻译05 第五讲 外部包含文件

英文原版地址:NASM Assembly Language Tutorials - asmtutor.com

外部包含文件允许我们从程序将代码移动到单独的文件中。这个技术对于编写清晰且易于维护的程序是非常有用的。可复用的少量代码可以被写作子程序并存入到被叫做库的独立文件中。当你需要一段逻辑,你可以在你的程序中包含这个文件并把它当作同一个文件的一部分来使用。

在本节课中,我们将移动计算字符串长度的子程序到外部文件中。我们还将字符串打印以及程序退出作为子程序并移动到这个外部文件中。当它完成时,我们的实际程序将变得简洁且易于阅读。

我们可以声明另一个消息变量并调用两次我们的打印函数两次来演示我们如何复用代码。

使用下边的命令编译,链接然后执行这个程序

functions.asm文件

;------------------------------------------
; int slen(String message)
; 字符串长度计算函数
slen:
    push    ebx
    mov     ebx, eax
 
nextchar:
    cmp     byte [eax], 0
    jz      finished
    inc     eax
    jmp     nextchar
 
finished:
    sub     eax, ebx
    pop     ebx
    ret
 
 
;------------------------------------------
; void sprint(String message)
; 字符串打印函数
sprint:
    push    edx
    push    ecx
    push    ebx
    push    eax
    call    slen
 
    mov     edx, eax
    pop     eax
 
    mov     ecx, eax
    mov     ebx, 1
    mov     eax, 4
    int     80h
 
    pop     ebx
    pop     ecx
    pop     edx
    ret
 
 
;------------------------------------------
; void exit()
; 退出程序并复原资源
quit:
    mov     ebx, 0
    mov     eax, 1
    int     80h
    ret

hello.asm文件

%include        'functions.asm'                             ; 包含我们的外部文件
 
SECTION .data
msg1    db      'Hello, brave new world!', 0Ah              ; 第一个字符串
msg2    db      'This is how we recycle in NASM.', 0Ah      ; 第二个字符串
 
SECTION .text
global  _start
 
_start:
 
    mov     eax, msg1       ; 将第一个字符串的地址给EAX
    call    sprint          ; 调用字符串打印函数
 
    mov     eax, msg2       ; 将第二个字符串的地址给EAX
    call    sprint          ; 调用字符串打印函数
 
    call    quit            ; 调用退出函数

编译命令

nasm -f elf hello.asm

链接命令

ld -m elf_i386 hello.o -o hello

执行命令

./hello

错误:第一个字符串被输出两次,这个bug将在下一节被修复。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值