2016-07-12 9 views
2

私は次のプログラムコンパイルしよう:だから、無効な命令サフィックス

demo.s: Assembler messages: 
demo.s:7: Error: invalid instruction suffix for `mov' 

:私は、このエラーメッセージが表示されます

.globl _start 
.section .text 

_start:  movw  $-23, %ax 
      movl  $-1, %ebx # -1 = $0xffffffff 
      movw  %ax, %ebx 

      movl  $1, %eax 
      movl  $0, %ebx 
      int   $0x80 

movw  %ax, %ebx 

しかし、事は、私は私がやっているとは思わないということであることは完全に間違っているプラ​​スそれは目に使用例を示しますproglemのルートはここにあります電子書籍私は現在読んでいます:Professional Assembly Language by Richard Blum (2005)

+4

'movw%ax、%ebx'は意味がありません。それは「** 16ビット**レジスタAXを** 32ビット**レジスタEBXに移動する」です。あなたはどうしますか?ゼロ拡張( 'movzwl%ax、%ebx')?記号拡張( 'movswl%ax、%ebx')?作者が 'movw%ax、%bx'を意図していないと確信していますか?私はソースでの使用からはわかりません。 –

+0

'movw%ax、%ebx' - それは本の中で示されている通りです。 –

+1

その本のErrataセクションで判断すると、その中の情報源について少し慎重になるでしょう。説明された各事柄については、書籍なしで独自のソースを書くことができることを確かめてください。デバッガではまったく同じように動作します(すべてのレジスタ、メモリ、フラグの変更を監視してください)。基本的に、ASM開発者のための正式な書籍は1つだけです。手順リファレンスガイド。それ以外のものは自転車のヘルパーホイールのようなもので、あるレベル以上になるまで非常に役立ちます。それは負担です。次の有用なASMの本は、ターゲットプラットフォームの詳細なアーキテクチャーまたは数学理論のブックです。 – Ped7g

答えて

5

あなたはそのプログラムで何をしたいのですか?

まずあなたがebx-1その後、ax-23を入れて、あなたはaxは16ビットで、ebxは、32ビットのレジスタであるとして、x86プロセッサ上で有効ではありませんこれは、ebxaxを移動しよう。 movは処理中にデータの幅を変換できません。

2つの基本的なオプションがあります。

  • あなたは(axから16bで)修正ebxの16bの下部のみをしたい場合、あなたはmov %ax, %bxを行うことができ、そのままebxの上層16Bを維持します。 (あなたの場合、結果はebx/bx/bl-23となります)。

  • あなたは32bの値に16bの値を拡張したい場合は、あなたがいずれかを行うことができます。1. ebx(およびbx

    1. movswl %ax, %ebx # sign-extended conversion (movsx in Intel syntax)
    2. movzwl %ax, %ebx # zero-extended conversion (movzx in Intel syntax)

blも同様)は-23を含むでしょう。 2. ebxには0x0000FFE9が含まれるため、ebx65513,bxbl-23となり、符号付き整数として扱われます。または、bxの場合は65513、符号なし整数として扱う場合はの場合は233です。

本について...本当ですか?もう一度注意深く読んでください。タイプミスでなければなりません。細かい部分を見落としているかもしれません。