如何修复“boot.asm:21:错误:符号‘puts.mpmp’未定义”

问题描述 投票:0回答:1

这是我的代码

org 0x7C00
bits 16


%define ENDL 0x0D, 0x0A

start:
jmp main

puts:
push si
push ax

.loop:
lodsb
or al, al
jz .done
mov bh, 0
int 0x10

jmp .mpmp

.done:
 pop ax
 pop si
 ret

main:
mov ax, 0
mov ds, ax
mov es, ax
mov ss, ax
mov sp, 0x7C00
   mov si, msg_bootstring
   call puts
hlt

.halt:
jmp .halt



msg_bootstring: db "MudOS 1.0 Beta Development Preview", ENDL, 0
msg_bootstring1: db "Starting", ENDL, 0


times 510-($-$$) db 0
dw 0AA55h

https://i.stack.imgur.com/WIw4T.png

我尝试再次执行此操作,但它只是显示相同的错误

assembly nasm x86-16 bootloader
1个回答
0
投票
puts:
 ...
 jmp .mpmp
main:

由于前缀点,NASM 将 .mpmp 标签视为 local 标签。由于此本地标签位于全局标签 putsmain 之间,因此该标签的全名变为 puts.mpmp。然后错误消息表明您忘记在程序中定义这样的标签。事实上,代码应该使用

jmp .loop
才是正确的。

NASM 无法检测到的另一个错误是您忘记插入将 AH 设置为 BIOS.Teletype 服务的功能编号的指令。

    org 0x7C00
    bits 16
    
    %define ENDL 0x0D, 0x0A
    
    start:
    jmp main
    
    puts:
     push si
     push ax
    .loop:
     lodsb
     or   al, al
     jz   .done
     mov  bh, 0
     mov  ah, 0x0E    ; BIOS.Teletype
     int  0x10
     jmp  .loop
    .done:
     pop  ax
     pop  si
     ret
© www.soinside.com 2019 - 2024. All rights reserved.