assembly 操作数、错误逗号、冒号、装饰器或行尾后应有错误逗号

az31mfrm  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(129)
SECTION .data
matriz: DD 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16
x:      DD 16 DUP (?)
out:   DD 16 DUP (?)
fmt:  DD "%d", 10, 0

SECTION .text

        GLOBAL main
        extern printf

main:
        MOV ESI, 0
        copia:
          MOV EDX, matriz[ESI]
          MOV x[ESI], EDX
          ADD ESI, 4
          CMP ESI,64
          JNE copia

        MOV  [val], EDX
        ;fst dword [val]
        PUSH ESP
        CALL printval
        POP ESP

        z1:
                MOV EBP x[0]
                ADD EBP,x[3]
                ROL EBP, 7
                XOR x[1], EBP

        z2:
                MOV EBP, x[1] ;z1
                ADD EBP, x[0] ;a
                ROL EBP, 9
                XOR x[2], EBP

        z3:
                MOV EBP, x[2]
                ADD EBP, x[1]
                ROL EBP, 13
                XOR x[3], EBP
        z0:
                MOV EBP, X[3]
                ADD EBP, X[2]
                ROL EBP, 18
                XOR x[0],EBP

printval:

        SUB ESP, 8
        FSTP qword [ESP]
        PUSH fmt
        CALL printf
        ADD ESP, 32
        RET
dnph8jn4

dnph8jn41#

您忘了提到您收到错误消息的源代码行,但是有几个地方是错误的,所以这里有一个列表。

MOV EDX, matriz[ESI]
MOV x[ESI], EDX

NASM不接受这种寻址模式。
为了简单起见,NASM也不支持MASM及其克隆支持的混合语法,例如mov ax,table[bx],其中内存引用由方括号外的一部分和方括号内的另一部分表示。上面的正确语法是mov ax,[table+bx]。同样地,mov ax,es:[di]是错误的,mov ax,[es:di]是正确的。
所以这样写(许多其他指令也是一样):

MOV EDX, [matriz + ESI]
MOV [x + ESI], EDX

NASM不使用MASM风格的dup (?)
将未初始化的数据放入.bss部分并写入:

SECTION .bss
x:   resd 16        ; reserves 16 dwords
out: resb 64        ; reserves 64 bytes (just as many)

如果确实要将其放置在.data部分中,请用途:

x:   times 16 dd 0  ; 16 repeats of `dd 0`
out: times 64 db 0  ; 64 repeats of `db 0` (just as many)

对格式字符串使用DDDefineDoubleword)指令是错误的!您需要的是DBDefineByte):

fmt: db "%d", 10, 0

大多数关于esp使用的代码没有多大意义!而且将您的问题标记为emu8086也没有用,因为该模拟器不能与这些32位寄存器一起工作。

相关问题