String 是否在汇编中读取数组?

String 是否在汇编中读取数组?,string,assembly,x86,masm,irvine32,String,Assembly,X86,Masm,Irvine32,我在读取汇编中的数组时遇到了一些问题 这是一个相当简单的程序(尽管目前还远未完成)。在这一点上,我所要做的就是读取一个字符串(我们假设的是数字),将其转换为十进制数,然后打印出来。这是我到目前为止得到的。到目前为止,它打印str1。输入数字并按enter键后,它将再次打印str1并冻结。谁能告诉我我做错了什么 INCLUDE Irvine32.inc .data buffersize equ 80 buffer DWORD buffersize DUP (0) str1 BYTE "Ent

我在读取汇编中的数组时遇到了一些问题

这是一个相当简单的程序(尽管目前还远未完成)。在这一点上,我所要做的就是读取一个字符串(我们假设的是数字),将其转换为十进制数,然后打印出来。这是我到目前为止得到的。到目前为止,它打印str1。输入数字并按enter键后,它将再次打印str1并冻结。谁能告诉我我做错了什么

INCLUDE Irvine32.inc

.data

buffersize equ 80
buffer DWORD buffersize DUP (0)

str1 BYTE "Enter numbers to be added together. Press (Q) to Quit.", 0dh, 0ah,0;
str2 BYTE "The numbers entered were: ", 0dh, 0ah, 0
str3 BYTE "The total of numbers entered is: ", 0dh, 0ah, 0
error BYTE "Invalid Entry. Please try again.", 0dh, 0ah,0
value DWORD 0

.code
main PROC
mov edx, OFFSET str1
call Writestring

Input:
 call readstring
 mov buffer[edi], eax

 cmp buffer[edi], 0
 JL NOTDIGIT
 cmp buffer[edi], 9
 JG NOTDIGIT

call cvtDec
mov edx, buffer[edi]
call WriteString
jmp endloop

Notdigit:
 mov edx, OFFSET error
 call writestring
 exit

 cvtDec:
    mov eax, buffer[edi]
    AND eax,0Fh
    mov buffer[edi],edx
    ret

endloop:
main ENDP
END MAIN

首先,Irvine先生创建了名为
WriteString
的函数,但您使用了两种变体-WriteString和WriteString;您确实在一个位置使用了函数的正确大小写。现在就养成使用正确函数名的习惯,这样以后就可以减少bug

其次,您创建了一个名为
Notdigit
的标签,但在代码中使用了
JL Notdigit
JG Notdigit
。同样,请使用正确的拼写。MASM应该给您一个2006年的错误“未定义的符号”

您还将入口点声明为
main
,但您用
END main
而不是
END main
关闭代码部分

如果已正确设置MASM(通过在源代码顶部添加
option casemap:none
,或者只需打开irvine32.inc并取消注释显示
option casemap:none

让我们看看irvine32.asm中的
ReadString
过程注释:

; Reads a string from the keyboard and places the characters
; in a buffer.
; Receives: EDX offset of the input buffer
;           ECX = maximum characters to input (including terminal null)
; Returns:  EAX = size of the input string.
; Comments: Stops when Enter key (0Dh,0Ah) is pressed. If the user
; types more characters than (ECX-1), the excess characters
; are ignored.
ReadString
获取缓冲区的地址,以在
edx
中保存输入的字符串,您正在使用提示符的地址
str1
,可能您打算使用
缓冲区
?您也没有将缓冲区的大小放入
ecx

您使用
edi
作为缓冲区的索引,
edi
包含什么值?您试图将
eax
的值放入其中,
eax
包含哪些内容???
edi
eax
可能都包含垃圾;不是你想要的

仔细看看这个:

cvtDec:
    mov     eax, buffer[edi]
    AND     eax,0Fh
    mov     buffer[edi],edx

您将一个值(您认为是一个数字的ASCII值)放入
eax
中,然后转换为十进制值。。。好啊接下来,您将把
edx
中的任何内容放回缓冲区。这就是您想要的吗?

请尝试一步一步地调试。