程序获取用户的详细信息,计算年龄并显示所有信息

时间:2015-12-15 20:34:36

标签: assembly masm irvine32

我已经启动了一些代码但是在将用户字符串输入保存到变量时遇到了问题。

使用ReadString我可以提示用户输入一个字符串,但是在将用户输入保存到名为AskName1的变量中,然后显示保存在AskName1中的信息后,我发现它保存了用户的字符数输入而不是实际的字符串。所以我需要弄清楚的是如何将用户输入的字符串保存到变量而不是用户输入的字符数。

INCLUDE Irvine32.inc
.data
    AskName BYTE "Please enter your name " ,0dh,0ah,0
    Birth BYTE "Please enter your birth year",0dh,0ah,0
    Job BYTE "Pleas enter the location at which you work",0dh,0ah,0
    AskName1 DWORD ?
    Birth1 DWORD ?
    Job1 DWORD ?

.code
main PROC

call Clrscr

mov edx, OFFSET Birth
call writestring

call ReadInt
mov Birth1, eax

mov edx, OFFSET Birth1
call writeint
call crlf

mov edx, OFFSET AskName
call WriteString

call ReadString
; AT THIS POINT I WANT TO TAKE USER STRING INPUT AND SAVE THE STRING INTO THE VARIABLE "ASKNAME1"

main ENDP

END main 

1 个答案:

答案 0 :(得分:1)

欧文的ReadString需要EDXECX中的两个参数。它填充EDX指向的内存并返回输入的大小。由于[EDX]中的字符串将以零结尾,因此您必须为字符串保留空间并终止空值。使用AskName1 DWORD ?,您只保留了4个字节 - 这肯定是不够的。

在我看到调试时,ECX应该是字符串的大小 null(不是提到的:“非空字符的最大数量” = size-1 )。

这样做:

INCLUDE Irvine32.inc
.data
    ...
    AskName1 BYTE 16 DUP (0)        ; Reserve 16 bytes and fill them with 0
    ...

.code
...
lea edx, AskName1                   ; EDX = address of AskName1
mov ecx, Sizeof AskName1            ; ECX = size of AskName1
call ReadString
...

; and don't forget:
push 0
call ExitProcess