2016-10-10 17 views
3

テキストファイルからバイナリ入力を受け取り、パラメータとしてアセンブリ関数に送信するプログラムを作成しようとしています。アセンブリ関数は、このバイナリ入力を画面に出力する必要があります。入力は、そのアドレスによってcコードからアセンブリコードに送信されます。オペコードとオペランドの組み合わせが正しくありません

私のasmファイルをアセンブルしようとすると、mov msg, [esp+8]行に「オペコードとオペランドの無効な組み合わせ」エラーが発生します。 char argをスタックから静的変数にコピーしたいと思います。それはなぜ有効な指示ではないのですか?

完全なコードは次のとおりです。

mov msg, [esp+8] 

しかし、あなたは、メモリからメモリへのmov Eに許可されていません。

segment .data 
     len equ 31 
segment .bss 
     msg resb 0 
segment .text 
global sequence_generator 

sequence_generator: 

     push ebp 
     mov ebp, esp 
     mov msg, [esp+8] 

     mov eax,4 
     mov ebx,1 
     mov ecx,msg 
     mov edx,len 
     int 80h 

     pop ebp 
     ret 
+1

「mov msg、[esp + 8]」これは何をやっていると思いますか?そしてこの 'msg resb 0'?そして 'edx'を固定31にすることが意図されていますか?したがって、Cコードは常に31以上の文字を送信しますか? – Ped7g

+0

本当にバイナリデータであれば、印字不可能な文字が含まれていますが、これはLinuxではうまくいきません。そのため、印刷できない値を ''。 ''に変更したり、バイト自体ではなく16進値を出力する。 (データ '' "(' 3重スペース)から '20 20 20' 'を印刷します) – Ped7g

答えて

4

私はあなたがこの行で行うことを試みているのだろうか。例えば、thisページを参照してください。

メモリからメモリに移動する場合は、レジスタを一時記憶域として使用します。例:

mov eax, [var1] 
mov [var2], eax 
関連する問題