Arrays Can';在将字符串数组转换为整数数组的汇编语言程序上找不到生成错误的原因
我正在创建一个程序,它通过控制台读取由单个空格分隔的整数列表,并打印所有整数的总和。主要问题是将字符串数组中的整数提取到有符号整数数组中 输入的一些示例是“-20 30 5”(每个整数由一个空格分隔)或“[space]-20 30 5[space]”(列表的开头和结尾之间可能有空格,但数字仍然由一个空格分隔) 此外,在打印总和后,程序将返回读取另一个输入,除非只键入enter键 在编写代码并按下调试按钮后,我得到以下两个生成错误: A2005符号重新定义:InBuffer A2111冲突参数定义 我已经检查了错误消息,显然它们都与PROTO和PROC指令有关。但是在参数定义方面似乎没有问题 这是我的密码Arrays Can';在将字符串数组转换为整数数组的汇编语言程序上找不到生成错误的原因,arrays,assembly,masm,irvine32,Arrays,Assembly,Masm,Irvine32,我正在创建一个程序,它通过控制台读取由单个空格分隔的整数列表,并打印所有整数的总和。主要问题是将字符串数组中的整数提取到有符号整数数组中 输入的一些示例是“-20 30 5”(每个整数由一个空格分隔)或“[space]-20 30 5[space]”(列表的开头和结尾之间可能有空格,但数字仍然由一个空格分隔) 此外,在打印总和后,程序将返回读取另一个输入,除非只键入enter键 在编写代码并按下调试按钮后,我得到以下两个生成错误: A2005符号重新定义:InBuffer A2111冲突参数定义
INCLUDE Irvine32.inc
ArrayGet PROTO, ; convert string array into int array
inBuffer: PTR BYTE,
inBufferN: DWORD,
intArray: PTR SDWORD
.data
BUF_SIZE EQU 256
inBuffer BYTE BUF_SIZE DUP(?) ; input buffer
inBufferN DWORD ? ; length of input
intArray SDWORD BUF_SIZE/2 DUP(?) ; integer array for storing converted string
intArrayN DWORD ? ; number of integers
prompt BYTE "Enter numbers(<ent> to exit) : ", 0
bye BYTE "Bye!", 0
.code
main PROC
L1:
mov esi, 0
mov edx, OFFSET prompt
call WriteString
mov edx, OFFSET inBuffer
mov ecx, BUF_SIZE
call ReadString
cmp inBuffer[0], 0ah
je L3 ; only typing <ent> ends the program
mov inBufferN, eax
mov ecx, inBufferN
SpaceCheck: ; calls procedure when it finds a number
cmp inBuffer[esi], 20h
jne L2
inc esi
loop SpaceCheck
jmp L1
L2:
INVOKE ArrayGet, ADDR inBuffer, inBufferN, ADDR intArray ; put inBuffer offset on edx, inBufferN on ecx
mov intArrayN, eax
mov ecx, intArrayN
mov eax, 0
mov esi, OFFSET intArray
Ladd: ; adding the integer array
add eax, [esi]
inc esi
loop Ladd
call WriteInt
call CRLF
jmp L1
L3:
mov edx, OFFSET bye
call WriteString
exit
main ENDP
; procedure definition
ArrayGet PROC USES edx ecx,
inBuffer : PTR BYTE,
inBufferN: DWORD,
intArray: PTR SDWORD
LOCAL ArrayNum: DWORD
mov ArrayNum, 0
mov ecx, inBufferN
sub ecx, esi ; ecx(loop count) from first char to the end
LOOP1:
lea edx, inBuffer
add edx, esi ; edx points the offset of first char
mov edi, esi ; save location of first char
LOOP2: ; check spaces between integers
cmp inBuffer[esi], 20h
je getNum
inc esi
loop LOOP2
jmp getNum ; jump to getNum if array ends with a number
getNum: ; converting char into int
push ecx
inc esi
cmp inBuffer[esi], 20h ; two spaces in a row is considered as no more numbers afterwards
je EndBuffer
dec esi
mov ecx, esi
sub ecx, edi ; length of single number in char
call ParseInteger32
mov edi, ArrayNum
mov intArray[edi], eax
inc ArrayNum
inc esi
pop ecx
loop LOOP1
jmp EndBuffer ; end procedure when loop is over
EndBuffer:
mov eax, ArrayNum
inc eax
ret
ArrayGet ENDP
END main
包括Irvine32.inc
ArrayGet-PROTO;将字符串数组转换为int数组
inBuffer:PTR字节,
因布弗恩:德沃德,
intArray:PTR-SDWORD
.数据
BUF_尺寸等于256
缓冲字节大小DUP(?);输入缓冲区
因布弗恩·德沃德;输入长度
阵列SDWORD BUF_尺寸/2双(?);用于存储转换字符串的整数数组
因塔林·德沃德;整数数
提示字节“输入数字(退出):”,0
bye字节“bye!”,0
.代码
主进程
L1:
电影esi,0
mov edx,偏移提示
通话记录
移动edx,缓冲区内的偏移量
mov ecx,BUF_尺寸
调用读取字符串
cmp inBuffer[0],0ah
乙脑L3;只有打字才能结束程序
莫夫因布弗恩,eax
莫夫埃克斯,因布弗恩
空格检查:;当过程找到一个数字时调用该过程
cmp-inBuffer[esi],20小时
jne L2
公司esi
循环空格检查
jmp-L1
L2:
调用ArrayGet、ADDR inBuffer、inBufferN、ADDR intArray;将inBuffer偏移量放在edx上,将inBufferN放在ecx上
莫夫因塔林,eax
莫夫埃克斯,因塔林
mov-eax,0
胶印胶卷
拉德:;添加整数数组
添加eax,[esi]
公司esi
环垫
呼叫写入
呼叫CRLF
jmp-L1
L3:
mov-edx,OFFSET-bye
通话记录
出口
主端
; 程序定义
ArrayGet程序使用edx ecx,
inBuffer:PTR字节,
因布弗恩:德沃德,
intArray:PTR-SDWORD
本地阵列:DWORD
莫夫·阿雷努姆,0
莫夫埃克斯,因布弗恩
分ecx、esi;从第一个字符到结束的ecx(循环计数)
循环1:
lea edx,inBuffer
添加edx、esi;edx指向第一个字符的偏移量
mov edi、esi;保存第一个字符的位置
第2条:;检查整数之间的空格
cmp-inBuffer[esi],20小时
杰格纳姆
公司esi
环路2
jmp-getNum;如果数组以数字结尾,则跳转到getNum
getNum:;将字符转换为int
推ecx
公司esi
cmp-inBuffer[esi],20h;一行中的两个空格被视为之后不再有数字
je端缓冲区
dec esi
mov ecx,esi
电子数据交换分公司;字符中单个数字的长度
调用ParseInteger32
埃迪电影公司
mov intArray[edi],eax
阿莱南公司
公司esi
波普ecx
循环1
jmp端缓冲区;循环结束时结束过程
EndBuffer:
莫夫·埃克斯,阿雷努姆
埃克斯公司
ret
ArrayGet ENDP
端干管
如果您对我在代码中的意图或输入的形式有疑问,请将其留在注释部分您的
inBuffer:PTR BYTE
函数arg与中的inBuffer BYTE BUF_SIZE DUP(?)
同名。显然,从“符号重新定义:InBuffer”错误中可以看出,MASM不允许以这种方式对全局变量进行阴影处理,这与C不同。对于函数param和全局变量使用相同名称的问题,基本上只需.data
部分和proc
指令,只要它仍然产生错误信息。谢谢你指出它。我认为使用相同的名称意味着使用相同的arg,但显然我错了。在过去的5天里,我一直在努力找出错误,您真的帮了我的忙,我真诚地感谢您。.data
中的内容是全局/静态变量,而不是本地函数参数。这就是为什么它会在那里声明,而不是在任何与proto或proc相关的东西中声明。如果您想编写一个只使用全局变量的函数,那么它不是arg(在堆栈或寄存器中传递)。