Hoo*_*Man 3 x86 assembly nasm labels
在NASM中编程时遇到问题。我正在学习如何纯粹以汇编形式开发OS,并且已经开始创建引导加载程序。
我目前的目标是打印“你好,世界!” 和“再见!” 使用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
Run Code Online (Sandbox Code Playgroud)
臭虫:
两次打印再见消息
这是由于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
Run Code Online (Sandbox Code Playgroud)
小智 6
您对的计算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
Run Code Online (Sandbox Code Playgroud)