2016-04-27 11 views
1

私は現在、x86 LinuxにNASMプログラムを書いています。最初の閏年チェックで最初のコマンドライン引数(1年)を分ける計算を実行しようとしています。私は残りが0かどうかをチェックしたいが、私はそれをどうするかと苦労している。私はdivコマンドが特定のレジスタに答えを格納し、別のものに残っていることを知っていますが、今はテストを使っています。ここで私は、私はdiv要素を使用してテストRDI、fourTestを変更する必要があるが、私は次のテストにジャンプするかどうか、私はにジャンプする必要がある場合、残りを隔離して決定する方法がわからないと信じていたコードnasmプログラムで剰余を分離する

 global main 
     extern puts 
     extern printf 
     extern atoi 

     section .text 

main: 
     sub  rsp, 8 
     cmp  rdi, 2 
     jne  error1    ; jump if aguments != 1 
     mov  rdi, [rsi+8] 
     call atoi 
     test rdi, fourTest 
     jnz  notLeapYear 
     jmp  done 
testTwo: 
     jmp  done 

notLeapYear: 
     mov  edi, nLeap 
     call puts 
     jmp  done 
error1: 
     mov  edi, badArgs 
     call puts 
     jmp  done 

done: 
     add  rsp, 8 
     ret 

badArgs: 
     db  "Requires exactly one argument", 5, 0 

nLeap: 
     db  "Not a leap year", 5, 0 

     section .data 
fourTest:  dq  4 
hundTest:  dq  100 
fHundTest:  dq  400 

ですうるう年ではありません。

+1

あなたが苦労していることはわかりませんが、明らかにあなたがそれをかなりうまく説明して以来、divの仕組みが分かっているようです。また、 'test'を使って' modulo 4 'を得るには、 'test rdi、3'を' test rdi、4'にする必要があります。 – Jester

+0

@Jester申し訳ありません私はアセンブリとx86アーキテクチャにはかなり新しいです。私はrdiをテストするために行を変更しました。3私のジャンプは、 "うるう年ではありません"と表示するべきnotLeapYearのセクションにjnzしません。たとえば、コマンドラインに2005を入力します。コマンドラインには、4で修飾したときには0にしてはいけませんが、jnzは無視されます。 –

+0

'atoi'は' rdi'ではなく 'eax'で結果を返します。 – Jester

答えて

0

最初に、関数の戻り値はeaxになるので、結果はatoiになります。次に、このようなdivを使用する:

xor edx,edx 
div 4 

今除算の結果はeaxになり、残りはedxであろう。

+0

'test edi、3'が0の場合は、' div'のオーバーヘッドなしで4で割り切れることを意味します。 –

+1

@MichaelPetchはい、それは4で動作しますが、年入力が100と400 = 0であるかどうかを確認する必要があります。テストは2の累乗(ビット単位)でしか動作しません。次の2つはdivを使用して残りの部分を監視しようとします。ありがとうございました。 –

+0

私は、NASMが「div 4」のように即時に分割することを認めていませんでした。 – Fifoernik

関連する問題