2016-05-06 5 views
0

私はアセンブリにかなり新しく、少し問題があります。 私はループで動作するようにしようとしているが、私は私のプログラムをテストしようとしたとき、私はエラーを得たエラー 'push'命令のA2070

A2070:プッシュで無効な命令のオペランドライン15,17,19,22上

(命令)

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 

それが唯一の問題だ場合、私は、私はちょうど国会を始め、私は見つけることができませんでしたし、良い材料は、インターネット上から学ぶために言ったように私も、知りません。 私はNASM x64で作業しています。

+0

32ビットの呼び出し規約を使用しようとしているようです。 64ビット呼び出し規約は異なります(https://en.wikipedia.org/wiki/X86_calling_conventions#Microsoft_x64_calling_convention)。 googling _ "windows 64-bit nasm printf" _またはそれらの行に沿ったものを試してみてください。 – Michael

+0

あなたはNASMを使用していますが、あなたのコードはMASMのようです。 –

答えて

0

Nasm x64では、スタックは64ビット幅です。

ecxレジスタをプッシュすることはできません。

オペランドのサイズは64ビットでなければなりません。

使用

push rcx 

代わり

push ecx 
0

場合は、x64ビットプロセッサでのPUSH命令でRCXのような64ビットのレジスタを使用する必要があります。

PUSH rcx