NASM 用户输入的输出提示

NASM output prompt for user input

相关,但对我目前的情况没有帮助:nasm dos interrupt (output string)

(我只是想澄清这不是重复的)

我想做的是创建一个提示,向用户说 "Enter a Base 10 number: "。之后,我会将这个数字转换为二进制、八进制和十六进制。然而,我遇到了一个问题,我确信这很简单,但我盯着这段代码看得太久了,无法理解问题出在哪里。

它会输出 "Enter a Base Ten Number: ",然后闪烁大约 3 次并自动关闭我的 DOSbox 模拟器。有什么想法吗?

代码如下:

org   0x100               

mov   bx, 1                  ;init bx to 1
mov   ax, 0100h

mov   dx, msg                ;message's address in dx
mov   cx, len
mov   ah, 0x40
int   0x21

msg   db 'Enter a Base Ten Number: '
len   equ $ -msg

;all of the code above runs fine it seems. It gets to this point
;but does not then run the following code

mov   ah, 9
int   21h

while:
        cmp   ax, 13        ;is char = carriage return?
        je    endwhile      ;if so, we're done
        shl   bx, 1         ;multiplies bx by 2
        and   al, 01h       ;convert character to binary
        or    bl, al        ;"add" the low bit
        int   21h
        jmp   while
endwhile
int   0x21

msg   db 'Enter a Base Ten Number: '  <- OOPS. This will be executed as code.
len   equ $ -msg

;all of the code above runs fine it seems. It gets to this point
;but does not then run the following code

mov   ah, 9

您已将数据放入代码路径。 CPU 无法知道您在 msg 中存储的不是一堆指令。在跳转到数据后的标签的 int 0x21 之后执行 jmp,或者将数据放在程序中所有代码之后。

您已将 msg 放在包含代码的文本段中。因此,当它被执行时,你不想发生的事情就会发生。

msg 放在初始化数据的适当部分,.data,其中:

section .data
    msg:  db 'Enter a Base Ten Number: '
    len   equ $ -msg

section .text
start:
    mov   bx, 1
    # etc.

请参阅 how to produce COM files 上的 NASM 文档。

在您的数据部分,设置您想要的提示。在本例中,我将使用“>>”作为提示符:

section .data
    prompt   db   ">>", 13, 10, '$'

然后在你的bss段,设置一个string destination,并预留一定的字节数供用户使用。在此示例中,我将使用 string1 作为目标,并保留 80 个字节:

section.bss
    string1   resb   80

从那里开始,按照您的文本部分中的逻辑进行操作:

    section .text
       mov dx, prompt ; move your prompt into your data register
       mov ah, 9      ; use the print string function
       int 21h        ; print your prompt

       mov     cx, 0  ; set your counter register to 0
       cld            ; clear direction to process string left to right
       mov     di, string1       ;set string1 as destination
       mov     ah, 1             ;read char fcn
       int     21h               ;read it