Arrays Can';在将字符串数组转换为整数数组的汇编语言程序上找不到生成错误的原因

Arrays Can';在将字符串数组转换为整数数组的汇编语言程序上找不到生成错误的原因,arrays,assembly,masm,irvine32,Arrays,Assembly,Masm,Irvine32,我正在创建一个程序,它通过控制台读取由单个空格分隔的整数列表,并打印所有整数的总和。主要问题是将字符串数组中的整数提取到有符号整数数组中 输入的一些示例是“-20 30 5”(每个整数由一个空格分隔)或“[space]-20 30 5[space]”(列表的开头和结尾之间可能有空格,但数字仍然由一个空格分隔) 此外,在打印总和后,程序将返回读取另一个输入,除非只键入enter键 在编写代码并按下调试按钮后,我得到以下两个生成错误: A2005符号重新定义:InBuffer A2111冲突参数定义

我正在创建一个程序,它通过控制台读取由单个空格分隔的整数列表,并打印所有整数的总和。主要问题是将字符串数组中的整数提取到有符号整数数组中

输入的一些示例是“-20 30 5”(每个整数由一个空格分隔)或“[space]-20 30 5[space]”(列表的开头和结尾之间可能有空格,但数字仍然由一个空格分隔)

此外,在打印总和后,程序将返回读取另一个输入,除非只键入enter键

在编写代码并按下调试按钮后,我得到以下两个生成错误:

A2005符号重新定义:InBuffer

A2111冲突参数定义

我已经检查了错误消息,显然它们都与PROTO和PROC指令有关。但是在参数定义方面似乎没有问题

这是我的密码

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(在堆栈或寄存器中传递)。