我有这段代码
call print_char
mov ah, 0x0e
mov al, 'O'
print_char:
mov ah, 0x0e
mov al, 'J'
int 0x10
ret
jmp $
times 510 -($-$$) db 0
dw 0xaa55
我从它得到的输出是J,它应该是JO,为什么不发生这种情况?我调用了print_char
标签然后点击ret
它应该去call print_char
不应该做什么吗?
答案 0 :(得分:2)
它应该去做任何事情后调用print_char不应该吗?
当然,call print_char
之后是什么?
mov ah, 0x0e
mov al, 'O' ; set al='O'
print_char:
mov ah, 0x0e
mov al, 'J' ; overwrite al with 'J'. the second interrupt hasn't been executed yet.
int 0x10
然后ret
再次执行而没有相应的call
。我会说放弃你当前的设计并将其更改为更清晰的东西:
jmp main
print_char:
mov ah, 0x0e
int 0x10
ret
main:
mov al ,'J'
call print_char
mov al,'O'
call print_char
jmp $
times 510 -($-$$) db 0
dw 0xaa55