我正在学习汇编,我编写了一个简单的程序来将字符串写入屏幕:
[org 0x7c00]
mov bp, 0x8000
mov sp, bp
mov bx, HELLO_MSG
call print_string
mov bx, GOODBYE_MSG
call print_string
jmp $
print_string:
pusha
mov ah, 0x0e
for_block:
mov al, [bx]
int 0x10
add bx, 0x1
cmp bl, 0
jne for_block
popa
ret
HELLO_MSG:
db "Hello, World", 0
GOODBYE_MSG:
db "Goodbye", 0
times 510-($-$$) db 0
dw 0xaa55
但输出是" Hello World Goodbye"然后是一堆空间,然后是另一个"再见",更多的空间,它终止于下面的某些线条的中间。
我在Bochs中效仿。
答案 0 :(得分:0)
这里的问题是cmp bx,0。因为我们正在使用cmp移动字符串cmp应该在它上面获得停止点。
答案 1 :(得分:0)
加载后将每个字母与零比较: 此外,使用SI作为指针而不是BX,因为BX是您使用的BIOS功能的输入。
[org 0x7c00]
mov bp, 0x8000
mov sp, bp
mov si, HELLO_MSG
push cs
pop ds
call print_string
mov si, GOODBYE_MSG
push cs
pop ds
call print_string
jmp $
print_string:
pusha
mov ah, 0x0e
for_block:
lodsb ;loading the byte on the offset specified in SI. SI is automatically incremented here.
cmp al, 0
je exit
int 0x10
add bx, 0x1
jmp for_block
exit:
popa
ret
HELLO_MSG:
db "Hello, World", 0
GOODBYE_MSG:
db "Goodbye", 0
times 510-($-$$) db 0
dw 0xaa55