汇编语言学习_5_包含外部文件

第五节

包含外部文件

翻译自:https://asmtutor.com/

外部包含文件允许我们从我们的程序中移动代码并将其放入单独的文件中。这种技术对于编写干净、易于维护的程序很有用。可重用的代码位可以编写为子程序并存储在称为库的单独文件中。当您需要一段逻辑时,您可以将该文件包含在您的程序中并使用它,就好像它们是同一文件的一部分一样。
在本课中,我们将把我们的字符串长度计算子程序移动到一个外部文件中。我们还填充了我们的字符串打印逻辑和程序退出逻辑一个子例程,我们将把它们移到这个外部文件中。一旦完成,我们的实际程序将变得干净且更易于阅读。
这样,我们可以声明再声明一个变量,调用 print 函数两次,来演示如何重用代码。

注意: 除非它发生变化,否则我不会在本课后展示 functions.asm 中的代码。如果需要,它只会被包括在内。

functions.asm

;------------------------------------------
; int slen(String message)
; String length calculation function
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)
; String printing function
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()
; Exit program and restore resources
quit:
    mov     ebx, 0
    mov     eax, 1
    int     80h
    ret

helloworld-inc.asm

; Hello World Program (External file include)
; 编译: nasm -f elf helloworld-inc.asm
; 链接 (64 bit systems require elf_i386 option): ld -m elf_i386 helloworld-inc.o -o helloworld-inc
; 运行: ./helloworld-inc
 
%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 helloworld-inc.asm 
~$ ld -m elf_i386 helloworld-inc.o -o helloworld-inc 
~$ ./helloworld-inc 
Hello, brave new world! 
This is how we recycle in NASM. 
This is how we recycle in NASM.

错误:我们的第二条消息输出了两次。这将在下一课中修复。

posted @ 2023-03-01 23:19  charain_li  阅读(73)  评论(0编辑  收藏  举报