Assembly 在NASM中,内存中彼此相邻的标签会导致打印问题
我在NASM编程时遇到问题。我正在学习如何纯粹在汇编中开发操作系统,并从创建引导加载程序开始 我目前的目标是使用BIOS中断0x10打印“你好,世界!”和“再见” 我似乎遇到的问题发生在屏幕上打印值时。两个标签在内存中相邻,导致打印一个字符串时打印另一个字符串的内容 为什么Assembly 在NASM中,内存中彼此相邻的标签会导致打印问题,assembly,x86,nasm,labels,Assembly,X86,Nasm,Labels,我在NASM编程时遇到问题。我正在学习如何纯粹在汇编中开发操作系统,并从创建引导加载程序开始 我目前的目标是使用BIOS中断0x10打印“你好,世界!”和“再见” 我似乎遇到的问题发生在屏幕上打印值时。两个标签在内存中相邻,导致打印一个字符串时打印另一个字符串的内容 为什么hlen不在第一个字符串的末尾停止循环 [org 0x7c00] mov ah, 0x0e mov bx, HELLO_MSG mov cx, hlen
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\u MSG
标签就在内存中的再见\u MSG
标签旁边您对
hlen
的计算包括字符串再见
因为它是在再见\u MSG
的定义之后出现的。表达式$-HELLO\u MSG
是标签HELLO\u MSG
和定义hlen
的行之间的字节数。这就是为什么第一次调用print\u string
会打印这两条消息
请尝试以下顺序:
HELLO_MSG db 'Hello, World!',0
hlen equ $ - HELLO_MSG
GOODBYE_MSG db 'Goodbye!',0
glen equ $ - GOODBYE_MSG
有关更多详细信息,请参见,并将此作为示例。您对
hlen
的计算包括字符串再见
因为它是在再见\u MSG
的定义之后出现的。表达式$-HELLO\u MSG
是标签HELLO\u MSG
和定义hlen
的行之间的字节数。这就是为什么第一次调用print\u string
会打印这两条消息
请尝试以下顺序:
HELLO_MSG db 'Hello, World!',0
hlen equ $ - HELLO_MSG
GOODBYE_MSG db 'Goodbye!',0
glen equ $ - GOODBYE_MSG
有关更多详细信息,请参见,并以此为例。谢谢!你的解决方案奏效了,我理解这个概念。我在这里留下一个链接来解释$和$$命令是如何工作的。@HoodedMan:您应该删除消息中的零,因为它们不应该显示,也不应该在这里用作终止符。(它们可能会作为时髦的空格输出。)谢谢!你的解决方案奏效了,我理解这个概念。我在这里留下一个链接来解释$和$$命令是如何工作的。@HoodedMan:您应该删除消息中的零,因为它们不应该显示,也不应该在这里用作终止符。(它们可能会输出为时髦的空格。)有关更多详细信息,请参阅。有关更多详细信息,请参阅。