String 是否在汇编中读取数组?
我在读取汇编中的数组时遇到了一些问题 这是一个相当简单的程序(尽管目前还远未完成)。在这一点上,我所要做的就是读取一个字符串(我们假设的是数字),将其转换为十进制数,然后打印出来。这是我到目前为止得到的。到目前为止,它打印str1。输入数字并按enter键后,它将再次打印str1并冻结。谁能告诉我我做错了什么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
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
中的任何内容放回缓冲区。这就是您想要的吗?请尝试一步一步地调试。