私は現在、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
ですうるう年ではありません。
あなたが苦労していることはわかりませんが、明らかにあなたがそれをかなりうまく説明して以来、divの仕組みが分かっているようです。また、 'test'を使って' modulo 4 'を得るには、 'test rdi、3'を' test rdi、4'にする必要があります。 – Jester
@Jester申し訳ありません私はアセンブリとx86アーキテクチャにはかなり新しいです。私はrdiをテストするために行を変更しました。3私のジャンプは、 "うるう年ではありません"と表示するべきnotLeapYearのセクションにjnzしません。たとえば、コマンドラインに2005を入力します。コマンドラインには、4で修飾したときには0にしてはいけませんが、jnzは無視されます。 –
'atoi'は' rdi'ではなく 'eax'で結果を返します。 – Jester