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
相关,但对我目前的情况没有帮助: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