我写了一个简单的 Boot 扇区汇编程序,它将键盘中输入的每个字符推到堆栈中,但当我试图从堆栈顶部检索每个字符并将它们作为一个整体打印时,结果是相反的。我知道我是从顶部阅读的,所以它会被反转请告诉我如何正确地做到这一点
mov ax,0x800
mov ss,ax
mov ax,0x7c0
mov ds,ax
mov cx,0
mov bp,0
mov sp, 0
push 0
call print_placeholder
keyboard_loop:
call wait_key
push ax
mov bl,al
call simple_print
cmp al,13
jne keyboard_loop
call newline
je print_stack_values
print_stack_values:
pop bx
call simple_print
cmp bx,0
jne print_stack_values
push 0
call print_placeholder
je keyboard_loop
jmp $
placeholder:
db "ENTER: ",0
print_placeholder:
call newline
mov bx,placeholder
call print_string
ret
newline:
mov ah, 0x0e
mov al, 10
int 0x10
mov al, 13
int 0x10
ret
wait_key:
mov ah, 0
int 0x16
ret
%include "print_string.asm"
times 510-($-$$) db 0
dw 0xaa55
qemu运行结果:
ENTER: Hello World
dlroW olleH
ENTER: this is a string
gnirts a si siht
1条答案
按热度按时间gojuced71#
在启动
keyboard_loop
之前,保存SP寄存器的值。一旦检测到CR字符已经输入(13h),就加载该地址并从那里输出字符串。只需确保跟踪有多少字符被压入堆栈,并在返回之前相应地调整堆栈。对代码的注解:
在
keyboard_loop
的末尾有以下代码:je print_stack_values
指令是不必要的,因为代码会进入print_stack_values
。此外,在调用newline
之后,无法保证Equal标志会被设置。在这个特殊的例子中,这没有问题,因为如果Equal标志没有被设置,它只会进入'print_stack_values'。您应该删除
je
指令,或将其更改为jmp short print_stack_values
。