我试图从scrath编写一个简单的操作系统,但我遇到了一个问题,我编写了一个简单的过程,它运行一个字符串并将其打印在屏幕上。
print_string:
pusha
cmp byte[bx], 0
je exit
mov ah, 0x0e
mov al, [bx]
int 0x10
inc bx
jmp print_string
exit:
mov ah, 0x0e
mov al, 13
int 0x10
mov al, 10
int 0x10
popa
ret
我会把它放在主文件里。
[org 0x7c00]
mov bx, hello
call print_string
mov bx, hi
call print_string
jmp $
%include "print_string.s"
hello:
db "Hello, World!",0
hi:
db "This is a test.",0
times 510-($-$$) db 0
dw 0xaa55
但是由于某种原因,它没有打印Hello, World! This is a test.
,而是只打印Hello World!
当我从print_string.s中删除pusha
和popa
并将其放在主文件中时,如下所示:
[org 0x7c00]
mov bx, hello
pusha
call print_string
popa
mov bx, hi
pusha
call print_string
popa
jmp $
%include "print_string.s"
hello:
db "Hello, World!",0
hi:
db "This is a test.",0
times 510-($-$$) db 0
dw 0xaa55
很好用。怎么了?
1条答案
按热度按时间jaql4c8m1#
在循环中调用
print_string
,每次迭代都执行pusha
。但多个pusha
只有一个popa
指令。修复方法: