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
1条答案
按热度按时间dnph8jn41#
您忘了提到您收到错误消息的源代码行,但是有几个地方是错误的,所以这里有一个列表。
NASM不接受这种寻址模式。
为了简单起见,NASM也不支持MASM及其克隆支持的混合语法,例如
mov ax,table[bx]
,其中内存引用由方括号外的一部分和方括号内的另一部分表示。上面的正确语法是mov ax,[table+bx]
。同样地,mov ax,es:[di]
是错误的,mov ax,[es:di]
是正确的。所以这样写(许多其他指令也是一样):
NASM不使用MASM风格的
dup (?)
。将未初始化的数据放入
.bss
部分并写入:如果确实要将其放置在
.data
部分中,请用途:对格式字符串使用
DD
(DefineDoubleword)指令是错误的!您需要的是DB
(DefineByte):大多数关于
esp
使用的代码没有多大意义!而且将您的问题标记为emu8086也没有用,因为该模拟器不能与这些32位寄存器一起工作。