2012-01-31 8 views
1

負の数で正の数を除算しようとしています。nasm idiv負の値

現在、私のプログラムは正しく分割され、残りの部分に正しくアクセスすることができます。

しかし、正の数を負の値で割った値を入力すると、それはまったく割り切れません。

「署名する」方法があり、それが正しく分割されることはわかっています。私は手動

movsss $ IMM /%REG%REG/MEMの動きを理解しない、記号はゼロATT構文厥ofcourseの

を拡張し、231 movzss $ IMM /%REG%REG/MEM動きを拡張、Iここでは、インテルの構文

を必要とする私のコードはマイナスで分割する方法として

xor rdx, rdx 
mov rax, [input] 
mov rcx, [input2] 
idiv rcx 

のアイデアですか?

+0

私はまた、それを行うかもしれないが、まだ働いていない指示 "cdq"を見つけました – user1050632

答えて

4

除数が符号付き64ビット値の場合は、何もする必要はありません。同様に、配当が符号付き128ビット値である場合、何もする必要はありません。その上位64ビットをrdxに、下位64ビットをraxにロードします。

数字のいずれかが署名されていて、idivより短い場合は、その番号を署名拡張する必要があります。署名拡張は非常に簡単です。あなたはあなたの番号の最重要ビット(符号ビット)で空きトップビットを埋めるだけです。非負の数値の場合は、その領域を0で埋め、負の数値の場合は1で埋めます。アキュムレータに現在保持されている値を符号拡張できる命令がいくつかあります。それらは:cbw,cwde,cdqe,cwd,cdq,cqoである。最後の3つの符号はdx/edx/rdxです。 のための「しかし、私は正の数が負の値によって分割されinputaとき、それはすべてで分裂する文句を言わない」として

mov rax, [input] 
cqo ; sign extends rax into rdx:rax 
mov rcx, [input2] 
idiv rcx 

、それはすることはできません。ほとんどの場合、あなたはこのようなcqoの代わりxor rdx, rdx必要です。分割例外(0除算またはオーバーフローによる除算)を分割または呼び出します.3番目のオプションはありません。

+0

cqoは働いて!!!、私はしばらくの間cdqを試みていました。あなたはそれを理解するために使ったソースに私を指差しますか? – user1050632

+0

この文書(amd.comから):AMD64アーキテクチャ・プログラマーズ・マニュアル第3巻:汎用およびシステム命令。 –

+0

@ user1050632すでに 'cwd'(ダブルワードからダブルワードに変換)と' cdq'(ダブルワードからクワッドワードに変換)があるので、 'cqo'のような64ビット命令同様の名前。 – hirschhornsalz