No.4ベストアンサー
- 回答日時:
ADCとSBBはキャリーフラグも一緒に加減算を行う命令です。
ですので、
>ADCとSBBはキャリーフラグによって1を加算減算するらしいのですが、
と言う表現はあまりうまくないです。
筆算形式で書くと、
AX
BX
+ CF
----
という感じです。
ですから、
>そのキャリーフラグを参照するタイミングはADCやSBB自身の加算減算を行う前ですか?
と言う質問には「いちおうYES」と答えておきます。
キャリーフラグの内容共々同時に演算しているからです。
そういう意味では同時です。
ですが、細かいことを言うと、実際のCPUの中ではおそらく右の桁から1ビットずつ全加算機を使って演算してゆくので、
そういう意味ではキャリーの中身を先に参照していると言えます。
そして、
>それともADCやSBB自身の加算減算によって立てられたキャリーフラグを参照して1を加算減算するのでしょうか?
これはナンセンスです。
たとえば、ここに3桁の10進数しか扱えない電卓があるとして、
543+579を計算したときに桁上がりがあったからと言って最後に1を足しますか?
445
+ 678
------
1123 (← 千の位へ桁上がりが起きた=キャリー発生)
で、最後に1を足すことに意義があるのかどうか?です。
キャリーフラグの第一の用途は、「桁上がり/桁下がりの事実を次の演算へ伝えることによりレジスタ幅より大きい桁の演算を容易に実現すること」です。
さっきの3桁電卓で12345+6789を計算するときは、
345
+ 789
------
1134 (← 千の位へ桁上がりが起きた=キャリー発生)
この3桁の答えとしては下3桁のみをとり「134」
012
006
+ 1 (←先の演算のキャリー)
------
019 (← 千の位へ桁上がりはない=キャリーなし)
この3桁の答えとしては下3桁のみをとり「019」
二つをつなぎ合わせて答えは
「019134」です。
この原理で何桁の計算でもできます。
そして8086CPUの中でも16桁の2進数をつかって同じ仕組みで演算をしているのです。
まとまってない説明ですが、こんな感じでいかがでしょう。
No.5
- 回答日時:
あ, そうだ, 「『演算した直後のフラグの値』を使う意味がわからん」と自分で書きましたが, 「全く意味がない」わけではないですね. 「1 の補数」を使う場合には, 「最終的に最上位からキャリーが出たら最下位に 1 を加える」必要がありますから. もっとも, 8086 では「1 の補数」を使わないでしょうから, 普通の場合は「意味がない」んですが.
ちなみに, いくら 8086 の時代であっても「最下位桁から 1ビットずつ全加算器を使って演算する」ことはないと思います>#4. さすがにリップルキャリーじゃなくってキャリールックアヘッドアダーじゃないかなぁ? 回路の構成は見たことがないのでわかりませんが.
No.3
- 回答日時:
>ADCとSBBはキャリーフラグによって1を加算減算するらしいのですが、そのキャリーフラグを参照するタイミングはADCやSBB自身の加算減算を行う前ですか?
>それともADCやSBB自身の加算減算によって立てられたキャリーフラグを参照して1を加算減算するのでしょうか?
どちらも違います。キャリーフラグはADCやSBB自身の加算減算時に参照されます。
adc ax,bxは、ax=ax+bx+CFの演算を行います。演算の結果で各フラグが設定され、桁上がりがあればキャリーフラグに1が設定されます。
adcの前に設定されたキャリーフラグの状態が加算に使われて、adcに結果に合わせて新たなキャリーフラグの状態が決まることになります。
例1
mov ax,0000h
mov bx.0000h
stc
adc ax,bx
でadc後はaxは0001hになりキャリーフラグは0になります。
なんのためにこの命令が必要かという視点で考えて見ましょう。
キャリーフラグは桁上がりを示すフラグです。既に調べてると思いますが、符号なし16bit同士の演算で桁上がりが起こった場合に1になるのがキャリーフラグです。
つまり、16bitの演算結果が16bitに収まらなかったときにフラグが1になる訳で、このフラグを参照することで16bit以上の演算が可能になります。
次のように使います。
mov ax,AL
mov bx.BL
add ax,bx
mov CL,ax
mov ax,AH
mov bx.BH
adc ax,bx
mov CH,ax
AL dw FFFFh
AH dw 0000h
BL dw 0001h
BH dw 0001h
CL dw 0000h
CH dw 0000h
でメモリ内容CH,CLはどうなるでしょう?
No.1
- 回答日時:
直前の状態を参照します。
コンピューターなどのデジタル回路は、クロックに同期して動くようになっています。
クロックを与えた瞬間に、以前の状態を元にして、新しい状態に遷移しますが、クロックを与えた後の結果がさらにそのクロック内で波及する事はありません。
もうちょっと正確に言うと、クロックを与えるのは結果を格納するレジスターです。演算機は常に入ってきた入力に応じて演算結果を遅延を伴いながら出し、レジスターの入力に供給しています。キャリーやレジスターの値が確定し、演算機の出力が安定したところにクロックがやってきて結果を取り込みます。よって参照されるのは古いキャリーの値です。キャリーフラグにも同時にクロックが与えられますので、同時にキャリーの値も更新されます。
2進演算なので細かく見ると16bitの加算器は内部でもキャリーがありますが、それはクロックの影響を受けずに、常に下位ビットから上位ビットに流れます。キャリーフラグだけがクロックに同期して記憶します。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 数学 小学生がたった1日で19×19までかんぺきに暗算できる本、のおみやげ算。数学的に言うと何? 3 2023/04/07 09:35
- C言語・C++・C# 【CASLプログラム】 定数(80と55)を確保し、その和をGR1に、その差をGR2に求めるCASL 1 2022/12/16 01:17
- 弁護士・行政書士・司法書士・社会保険労務士 募集株式の発行 取締役会議事録について 募集事項 増加する資本金及び資本準備金に関する事項について 1 2022/06/06 01:25
- MySQL SQLでカラムを追加し、条件に合致した場合にフラグ(レコード)を付与する方法 2 2022/05/18 23:54
- 財務・会計・経理 (今さら) 中古海外不動産の減価償却と経費除外について 2 2023/03/28 20:48
- 数学 【数学】100を1%ずつ減算していくと100回割った数字は幾らになりますか? また100を1%ずつ減 6 2022/06/22 06:58
- その他(教育・科学・学問) 医療事務の資格の勉強をしています。 ある問題で、日曜日23時に来院した診察はどのように加算を算定すれ 2 2022/10/11 14:51
- 一戸建て 既に住宅引き渡しも半年前に完了しています。当初からの床面積が変更になり、一昨年の11月に最終の契約変 4 2023/01/05 20:53
- 法人税 地方税の納付に関しての法人税別表4,5の書き方について 2 2023/04/01 19:03
- 情報処理技術者・Microsoft認定資格 2進数の問題を教えてください。 1 2022/07/27 09:42
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルVBAのIf,Then 構...
-
0xffffとは?
-
8ビットのデータの、先頭ビット...
-
ビットシフトってどんな時使うの?
-
3進数を10進数に変換
-
03分22秒36のような時間の単位...
-
ビットリバース
-
文字参照は10進数と16進数では...
-
Python: 数値を反転させたい
-
verilog 符号付加減算(最上位...
-
PS3に搭載されている"Cell"は、...
-
アセンブラからC言語に変換する...
-
ライン数とステップ数の違いは?
-
レジストってなんですか?
-
レジスタの数
-
アセンブラで割り算
-
C言語による赤外線受信
-
正しく書けていますか?
-
RTCの通信方法(I2C、S...
-
アセンブラの数値比較
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルVBAのIf,Then 構...
-
0xffffとは?
-
8ビットのデータの、先頭ビット...
-
ビットシフトってどんな時使うの?
-
一般のソフトで画像を扱う場合...
-
シーケンス制御についての質問...
-
文字参照は10進数と16進数では...
-
算術シフト演算が成り立つ理由...
-
03分22秒36のような時間の単位...
-
Python: 数値を反転させたい
-
上位ビットと下位ビットの入れかえ
-
verilog 符号付加減算(最上位...
-
命令について
-
剰余の法が大きい場合のアルゴ...
-
ビット列を表示するプログラム
-
アクセス(2003)のVBAでビット...
-
16ビットCPUで32ビットの計算方法
-
C言語で128bitの2進数のビット...
-
10進数(+-)→2進数への変換(2)
-
シーケンス制御について質問で...
おすすめ情報