gpt4 book ai didi

assembly - 如何在汇编语言编程中提示用户输入字符串并再次显示

转载 作者:行者123 更新时间:2023-12-02 09:21:08 25 4
gpt4 key购买 nike

我的汇编语言代码遇到问题。

我们被要求提示用户输入字符串,我们应该再次显示它或将其回显到命令行。我们需要假设它最多只有 20 个字符(在字符串中)

这是示例输出:

输入字符串(最多 20 个字符)

012345678901234567890

您输入的字符串是:

012345678901234567890

当我在 DOSBOX 中运行代码时,我输入:0123456789按回车键后,它向我显示了一堆看起来很奇怪的字符和符号......

这是我的代码:

.186 

data segment

message1 db "Enter a string (max 20 char.): " ,13, 10, '$'

message2 db "The string you entered is: " , 13, 10, 'S'

myBStr db 20, 21 dup(?) ,'S'

data ends
stack1 segment stack
db 100 dup(?) ; This is the stack of 100 bytes
stack1 ends


code segment
assume cs:code, ds:data, ss:stack1

start:
mov ax, data
mov ds, ax
mov ax, stack1
mov ss, ax


lea dx, message1 ;load message to dx
mov ah, 9h ;show this message
int 21h

mov ah, 0Ah
lea dx, myBStr ;Load address of string
int 21h

mov ah, 9h ; show message of entered string
int 21h

lea dx, message2 ;load second message to dx
mov ah, 9h ;show this message
int 21h

mov ah, 0Ah
lea dx, myBStr ;Load address of string
int 21h

mov ah, 4ch ;Set up code to specify return to dos
int 21h
code ends
end start

最佳答案

Enter a string (max 20 char.)

012345678901234567890

奇怪的是,当要求输入最多 20 个字符时,您可能会收到 21 个字符!

<小时/>
 1 mov ah, 0Ah                         
2 lea dx, myBStr ;Load address of string
3 int 21h
4 mov ah, 9h ; show message of entered string
5 int 21h
6 lea dx, message2 ;load second message to dx
7 mov ah, 9h ;show this message
8 int 21h
9 mov ah, 0Ah
10 lea dx, myBStr ;Load address of string
11 int 21h

第 4 行和第 5 行不合适。 显示第二条消息后,您需要此代码。
第 9、10 和 11 行当前重新输入字符串,而实际上您想要显示它。

lea dx, myBStr       ;Load address of INPUT STRUCTURE
mov ah, 0Ah ;Buffered input
int 21h
lea dx, message2 ;Load second message
mov ah, 09h ;Show this message
int 21h
lea dx, myBStr + 2 ;Load address of string
mov ah, 09h ;Show entered string
int 21h

字符串从输入结构的第三个字节开始。这就是为什么您需要编写 lea dx, myBStr + 2

<小时/>
message2 db "The string you entered is: " , 13, 10, 'S'

末尾的“S”没有任何实际用途。让我们同意这是一个拼写错误并写道:

message2 db "The string you entered is: " , 13, 10, '$'
<小时/>

由于您希望能够获取 20 个字符的字符串,因此您需要以不同的方式设置 DOS.BufferedInput 函数 0Ah 的输入结构:

myBStr   db 21, 0, 21 dup(0) 

第一个字节(21)告诉DOS存储空间(21 dup(0))有空间容纳20个字符和1强制回车CR。
第二个字节(0)将由 DOS 设置为实际输入的字符数(不包括 CR)。在输出之前,您可以使用此字节正确地以“$”结束字符串。

mov bl, [myBStr + 1]                 ;Get length of string
mov bh, 0
mov byte ptr [myBStr + 2 + bx], '$' ;Replace CR with '$'
lea dx, myBStr + 2 ;Load address of string
mov ah, 09h ;Show entered string
int 21h
<小时/>

正如 prl 所指出的,如果您要设置 SS 段寄存器,那么还要设置 SP 寄存器:

mov ax, stack1                  
mov ss, ax
mov sp, 100

但通常情况下,您根本不需要编写这些行。

<小时/>

来自评论

Just a minor question though, how can I keep the string printed out

只需等待用户按任意键然后退出 DOS。

mov ah, 07h        ;DOS.InputCharacterWithoutEcho
int 21h
mov ax, 4C00h ;DOS.TerminateWithExitcode
int 21h

请注意,最好使用 DOS 函数 4Ch 实际指定退出代码。 AL 中的零表示程序正常终止。

关于assembly - 如何在汇编语言编程中提示用户输入字符串并再次显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46924172/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com