2016-05-06 11 views
0

Ich bin ziemlich neu in Assembly und ich habe ein kleines Problem. Ich versuche, mit Loops zu arbeiten, aber als ich versuchte, mein Programm zu testen, ich habe FehlerFehler A2070 auf 'Push' Anweisung

A2070: ungültige Befehlsoperanden

auf den Leitungen 15,17,19,22 (mit Push Anweisung)

extrn ExitProcess: PROC 

extrn printf: PROC 

.data 

komunikat1 db 'This linecode should be shown as %d ,and 10th should be last.', 0 


Start PROC 

push rdi 

sub rsp, 28h 

mov ecx, 1 

_petla: 

inc ecx 

push ecx 

dec ecx 

push ecx 

push komunikat1 

call printf 

add esp,16 

pop ecx 

or ecx, ecx 

jne _petla 



call ExitProcess 

Start ENDP 

END 

ich weiß nicht, selbst wenn es das einzige Problem ist, wie gesagt, ich mit Assembly gerade erst begonnen und ich konnte nicht und gute Materialien aus über das Internet zu lernen, finden. Ich arbeite an NASM x64.

+0

Sie scheinen zu versuchen, die 32-Bit-Aufrufkonvention zu verwenden. Die 64-Bit-Aufrufkonvention [ist anders] (https://en.wikipedia.org/wiki/X86_calling_conventions#Microsoft_x64_calling_convention). Probieren Sie googeln _ "Windows 64-Bit Nasm Printf" _ oder etwas in diesen Zeilen. – Michael

+0

Sie sagen, Sie verwenden NASM, aber Ihr Code sieht aus wie MASM. –

Antwort

0

In Nasm x64 ist der Stack 64 Bit breit.

Sie können also nicht Ecx Register drücken.

Der Operand muss 64 Bit groß sein.

Verwenden

push rcx 

statt, wenn

push ecx 
0

Sie 64-Bit-Register wie rcx mit dem PUSH-Befehl in x64-Bit-Prozessor verwendet werden sollen.

PUSH rcx