assembly 堆栈中存储的字符串在 Boot 扇区汇编代码中被反向打印

epfja78i  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(114)

我写了一个简单的 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
gojuced7

gojuced71#

在启动keyboard_loop之前,保存SP寄存器的值。一旦检测到CR字符已经输入(13h),就加载该地址并从那里输出字符串。只需确保跟踪有多少字符被压入堆栈,并在返回之前相应地调整堆栈。
对代码的注解:
keyboard_loop的末尾有以下代码:

jne keyboard_loop
  call newline
  je print_stack_values

print_stack_values:

je print_stack_values指令是不必要的,因为代码会进入print_stack_values。此外,在调用newline之后,无法保证Equal标志会被设置。在这个特殊的例子中,这没有问题,因为如果Equal标志没有被设置,它只会进入'print_stack_values'。
您应该删除je指令,或将其更改为jmp short print_stack_values

相关问题