我在NASM编程时遇到问题。我正在学习如何纯粹在汇编中开发一个操作系统,并且已经开始创建一个启动加载器。
我目前的目标是打印“Hello,World!”和“再见!”使用BIOS中断0x10。
在屏幕上打印值时,我似乎遇到了这个问题。两个标签在内存中看起来彼此相邻,导致打印一个字符串以打印另一个字符串的内容。
为什么hlen
没有在第一个字符串的末尾停止循环?
[org 0x7c00]
mov ah, 0x0e
mov bx, HELLO_MSG
mov cx, hlen
call print_string
mov bx, GOODBYE_MSG
mov cx, glen
call print_string
jmp $
%include "print_string.asm"
HELLO_MSG db 'Hello, World!',0
GOODBYE_MSG db 'Goodbye!',0
hlen equ $ - HELLO_MSG
glen equ $ - GOODBYE_MSG
times 510-($-$$) db 0
dw 0xaa55
错误:
两次打印再见信息
这是由于HELLO_MSG打印Hello, World!
和Goodbye!
。
我相信这是因为Hello_MSG
标签就在内存中的GOODBYE_MSG
标签旁边
;;;print_string.asm
print_string: ;cx = string length
;bX = string label - memory offset
; -- if you want the data at a memory adress use [bx]
mov al, [bx]
int 0x10
inc bx
loop print_string
ret
答案 0 :(得分:4)
您对hlen
的计算包含字符串Goodbye!
,因为它来自GOODBYE_MSG
的定义。表达式$ - HELLO_MSG
是标签HELLO_MSG
与定义hlen
的行之间的字节数。这就是你第一次打电话给print_string
打印这两个消息的原因。
请尝试此订单:
HELLO_MSG db 'Hello, World!',0
hlen equ $ - HELLO_MSG
GOODBYE_MSG db 'Goodbye!',0
glen equ $ - GOODBYE_MSG