警告A6004:过程参数或未引用的本地:地址MASM程序集

时间:2018-05-01 03:27:41

标签: assembly visual-studio-2015 x86 masm irvine32

所以,我在汇编代码中不断收到此错误,而且我不知道如何修复它

1>..\finalTe2.asm(175): warning A6004: procedure argument or local not referenced : address

这是我对程序及其参数的声明

displayBoard PROTO address:DWORD

以下是我如何使用它

displayBoard PROC address:DWORD
.data
boardRow BYTE '----------------', 0Ah, 0Dh, 0
boardColumn BYTE '|', 0

.code
push EBP
mov EBP, ESP
mov ESI, [EBP + 12]                             ;The address of the 2D array on the stack
mov ECX, 3h                                     ;Loop 3 times for the number of rows
BOARD1:
    mov EDX, OFFSET boardRow                    ;Display the first set of row characters
    coutS
    push ECX                                    ;preserve ECX
    clearECX
    mov ECX, 3h                                 ;Loop 3 times for the number of columns
    BOARD2:
        mov EDX, OFFSET boardColumn             ;display the first column character
        coutS
        invoke displayCell, ESI                 ;Call the proc that assigns the color of each cell
        inc ESI                                 ;Inc ESI to step through the 2D array this is used in the testCell proc
    loop BOARD2
    pop ECX
    mov EDX, OFFSET boardColumn
    coutS
    call crlf
loop BOARD1
mov EDX, OFFSET boardRow
coutS
pop EBP
ret
displayBoard ENDP

我看到另一篇关于同样错误的帖子,我尝试了他们所说的,但它没有奏效。我的所有程序都有这个错误,我似乎无法摆脱它们。

1 个答案:

答案 0 :(得分:1)

对于大多数C编译器,int foo(int x) { return 0; }会警告未使用的x是否在定义之前有原型。

这是asm版本:我假设您没有在定义中使用参数

MASM可能没有注意到mov ESI, [EBP + 12]正在访问你的函数arg; 为了让您高兴,您可能不得不使用令人困惑的mov ESI, address (如果您不习惯使用MASM),因为它看起来像一个静态符号名称,而不是带有基址寄存器的堆栈地址!

如果你不喜欢MASM,你就不必使用它。 NASM运作良好。 (虽然你可能会因为Irvine32而无法使用MASM。但我认为你可以避免使用它的参数声明内容,而只是写一些简单的asm来跟踪你自己在堆栈/寄存器上做的事情。也就是说,如果你push填充或者以正常方式call之前把它放在寄存器中,它就不会抱怨。)