アセンブラ初心者スレッド 2©2ch.net

■ このスレッドは過去ログ倉庫に格納されています
2017/04/13(木) 17:35:55.70ID:1WMn3pSz
初心者OK!質問大歓迎!のアセンブラのスレッドです。
基本情報の勉強中の人、PICやH8を勉強中の学生などなど…

前スレ
アセンブラ初心者スレッド
http://echo.2ch.net/test/read.cgi/tech/1314502612/

関連スレ
アセンブラ 13
http://echo.2ch.net/test/read.cgi/tech/1314512680/
2020/07/03(金) 19:52:48.87ID:v8523RMt
再現性がメリット
ならそれでいいじゃん

アセンブラを使うことで
高速化とか
リソースの節約とか
それもメリット

高速化もせず
リソースも変わらず
質が落ちる
だと何のためのアセンブラ?
2020/07/03(金) 21:30:22.45ID:Rc6pK0Eu
>>763
BSDヲタきもって言ってやろうか?
766デフォルトの名無しさん
垢版 |
2020/07/04(土) 00:06:32.98ID:KYM6hePT
http://www.littlebsd.com/
https://twitter.com/little_bsd
https://twitter.com/5chan_nel (5ch newer account)
2020/07/15(水) 00:32:33.69ID:0MCF5KaT
amd64+Linuxでアセンブラを始めたのですが、スタックの状態を勘違いしてのバグや
システムコール時のレジスタの退避し忘れのバグ等に悩まされてます

スタックの利用状況を分かりやすく表示してくれたり、レジスタの状態をチェックしてくれたり
するような、統合開発環境みたいなのはありませんでしょうか
2020/07/15(水) 11:52:01.41ID:Fiuz3Frw
楽したければC使え
769デフォルトの名無しさん
垢版 |
2020/07/15(水) 12:20:50.44ID:cL9c5hZ8
慣れたら悩まなくなる
770デフォルトの名無しさん
垢版 |
2020/07/15(水) 14:03:15.88ID:p6AIoBG7
アセンブラだと自己書き換えコードが出来るぞ
それによる考えられるメリットは様々あり、ここでは書きにくいこともあるw
あと、正確なことは分からんが、OS開発ではアセンブラがしばしば使われていて、特にブートローダーの開発で使われていると聞いたことがあるな
他にはマイコンだとアセンブラの方が開発しやすいこともあったりするのか?知らんけど
俺は、スレッドセーフなプログラミングにはアセンブラの知識が不可欠だと思っているが、これは他者の意見も聞きたいところだな
他にもアセンブラでしか出来ないことはあるのにアセンブラは趣味の為ときたもんだ(怒)
まずコンパイラは確実
エミュレータなんかもそうじゃないのか?知らんけど
2020/07/15(水) 14:24:49.32ID:miBvJk/V
>>767
Linuxでは知らんが、VSのデバッガだと、EAXなどのマシンレジスタの内容を常時
表示できる。
スタックに関しては、push、pop を組にすることと、ちゃんと数える習慣を
付けるしかない。
アセンブラは、言語仕様は簡単に思えるかもしれないが、頭脳が必要。
それはちょうど、数学が小学生でも理解できる四則演算だけを組み合わせているだけ
なのに、大部分の人がどこかで難しくなってしまうのと同じようなもの。
2020/07/15(水) 14:29:36.15ID:PuirKKk2
残念な日本語を使う人って多いな
773デフォルトの名無しさん
垢版 |
2020/07/15(水) 14:41:03.67ID:cL9c5hZ8
知能は文章に滲み出る
774デフォルトの名無しさん
垢版 |
2020/07/15(水) 15:59:06.15ID:p6AIoBG7
知能はコードに滲み出る
2020/07/15(水) 17:04:33.66ID:miBvJk/V
大事なのは、言語ではなく数学。
2020/07/15(水) 17:58:36.45ID:vzNJtsb7
>>771
おまえが数学を知らないという事は良くわかった
2020/07/15(水) 18:23:23.15ID:bZTTdNA2
今時のGUIなデバッガだったらブレーク時にスタックやレジスタの内容を表示できるのは普通じゃね?
個人的にはパイプラインの動作状況を表示してくれるデバッガとか欲しいわ
依存関係に起因するNOP率とか、原因となっている命令の特定とか
2020/07/15(水) 18:40:28.77ID:miBvJk/V
>>776
俺は数学は常時使っているのだが。
2020/07/15(水) 18:48:34.73ID:JGqdiMCl
>>778
数学を知らないヤツが数学を毎日使うと
780デフォルトの名無しさん
垢版 |
2020/07/15(水) 18:51:31.23ID:miBvJk/V
>>779
違う。
俺は数学は優秀なほうだ。
2020/07/15(水) 18:52:38.10ID:JGqdiMCl
そう思ってるだけ
2020/07/15(水) 18:55:17.94ID:miBvJk/V
学生時代に伝説を作ったし、同級生達は知っている。
2020/07/15(水) 18:57:06.09ID:JGqdiMCl
kwsk
784デフォルトの名無しさん
垢版 |
2020/07/15(水) 19:10:04.26ID:p6AIoBG7
アセンブラに詳しい人はスゴい人多いから失礼な態度はとらない方がいいと思う
2020/07/15(水) 19:16:51.08ID:r/dLTGHk
>>767
アセンブラだからと言って人間が1から10まで考えなくてもいいんだよ。
間違いやすい処理はできるだけソフトやツールにさせるように考え方を変えればいい。
スタックの状態が間違いやすいと思うなら、スタックを管理するマクロを組めばいいし、
レジスタ退避を忘れるなら、レジスタ退避するマクロを組んでそれを使えばいい。
2020/07/15(水) 20:52:17.63ID:LyK3DjqL
その昔8051用のソフトをフルアセンブラで開発したことがある。デバッグは8個のLEDのみ
1500程度のコードだけどスタックや汎用レジスタの操作で苦労した記憶はないな
ペリフェラルの使い方等は大苦戦だったが

>>767は何を作っているのだろうか。IA-32ならともかくAMD64ならレジスタ本数も多いし
複雑なスタック操作をする機会は多くないと思うんだが
2020/07/16(木) 03:00:41.32ID:noTJdW03
>>786
お気持ち分かります。
788デフォルトの名無しさん
垢版 |
2020/07/16(木) 12:38:48.59ID:Bj5j4Y6i
謎の隠しコマンド連発するやつか
2020/07/16(木) 18:46:15.84ID:Zj8FcZKn
>>784
おれの方がアセンブラ技術も数学も上だから
何の問題もない
2020/07/16(木) 19:00:00.97ID:RhEyC4tQ
>>789
誰と戦ってるの?
2020/07/16(木) 19:02:56.88ID:Zj8FcZKn
>>771
2020/07/16(木) 19:43:33.89ID:TL00gXcm
スタックにデータ積んでサブルーチンに渡す時がずれやすい
2020/07/16(木) 19:46:21.84ID:Zj8FcZKn
呼ぶ側がアセンブラ?
何のために?
趣味か?
2020/07/16(木) 20:09:12.31ID:ICgJPJoU
今のアセンブラの需要って
・OS等の低レイヤーの処理をする
・高速化。1クロックでも節約したい
・リアルタイム。nクロック後に○○を実行する必要がある
こんなもんか?
2020/07/16(木) 20:10:47.57ID:Zj8FcZKn
趣味
2020/07/16(木) 20:15:52.17ID:Zj8FcZKn
リソースを極限までけちる (ROM/RAM)
2020/07/16(木) 20:17:12.32ID:Zj8FcZKn
自己書き換えコード
2020/07/16(木) 22:52:53.48ID:t94iKSIB
アセンブラも使ってるって言うとカッコいいから
2020/07/16(木) 22:54:17.68ID:Zj8FcZKn
>>798
格好良いか?
ドカタな感じ
2020/07/17(金) 02:55:00.98ID:xni+keKD
>>798
この業界では、アセンブラが使える人と使えない人ではやはり使える人の方が尊敬されるよね
2020/07/17(金) 06:35:47.52ID:CFzyXZw3
そういう歪んだ価値観のせいで
アセンブラじゃなくて良い所までアセンブラにするアホがいる
802デフォルトの名無しさん
垢版 |
2020/07/17(金) 11:02:40.02ID:hPmghiPz
役に立ってる人は忙しいのでわざわざこんな辺鄙なところに描き込みに来る暇がない
自分も役に立ってない
2020/07/17(金) 11:27:34.62ID:vcKdiH1z
仕事が生きがいですの社畜理論?
804デフォルトの名無しさん
垢版 |
2020/07/17(金) 12:58:33.29ID:hPmghiPz
はたらいたらまけ
https://www.youtube.com/watch?v=azoARoSmgrw
2020/07/17(金) 14:04:20.27ID:xni+keKD
>>801
Cが得意だと何でもCで書こうとする。
アセンブラが得意だと何でもアセンブラで書こうとする。
プログラマなら良くあること。
アセンブラがそれほど得意でない人が見たら余計なことと思うんだろうけど。
2020/07/17(金) 14:14:01.80ID:BZ2Y/mdT
>>805
そういう人はエンジニアとして三流。賃金も三流で良い
807デフォルトの名無しさん
垢版 |
2020/07/17(金) 14:36:42.77ID:R70AGkgr
PICマイコンみたく用途が限られてると、返ってアセンブラの方が短かったりする。
808デフォルトの名無しさん
垢版 |
2020/07/17(金) 15:01:36.87ID:xXsIieN6
PICよりAVR
809デフォルトの名無しさん
垢版 |
2020/07/17(金) 16:45:31.89ID:mOeBhMfJ
おいらがマシン語勉強した時(Z80A)ニモニック表見て作ってたね
相対ジャンプなんか手で計算して 今でもコード覚えてるよ LD A = 3E とか LD Bは06とか
アセンブラが手に入った時はなんて便利なんや〜と感動した
当時は子供でまさか仕事でもアセンブラ組むとは思わなかったけどね
810デフォルトの名無しさん
垢版 |
2020/07/17(金) 17:42:45.57ID:zYg36R0O
http://www.yamamo10.jp/yamamoto/comp/Z80/instructions/index.php#LOAD08
A や B にイミディエイト値を入れる場合
00DDD110
DDD はレジスタ番号
B=0, C=1, D=2, E=3, H=4, L=5, A=7
LD B,n は 00000110 (06), n
LD A,n は 00111110 (3E), n
なんで DDD=6 は飛んでるんだっけ
2020/07/17(金) 17:45:07.45ID:sm/+SVBD
フラグかな
2020/07/17(金) 17:45:11.86ID:zYg36R0O
(HL) が DDD=110 相当にみえなくもないが
命令デコーダーの都合なんだろうな
2020/07/17(金) 21:14:06.39ID:2HBm6uJU
>>806
他人の評価などどうでもいい。俺もそんな古くさい見方しかできないあんたを三流と言ってあげよう。
2020/07/18(土) 13:40:48.90ID:HDs6SbLj
>>810
原則的には、DDD=6 は、(HL)に相当している。
2020/07/18(土) 13:46:42.99ID:uRU3MGLx
IXとかIYの裏命令の話があるな
2020/07/18(土) 13:49:01.14ID:HDs6SbLj
>>814
昔の事だったし、資料が手元に無いが、原則論として
DDDとかのレジスタ番号の1つとして、(HL)が書いてあり、
それがDDD=6だったと思う。
ただし、原則論なので、全ての命令でDDD=6にすれば必ず合法で、
(HL)になるという意味ではない。
2020/07/18(土) 13:51:52.21ID:HDs6SbLj
>>816
リンク先のページでも、
INC r; DEC r; LD r1,r2; LD r2, r1 においても、DDD=6は、(HL)の命令に該当
していることが分かる。
2020/07/18(土) 13:56:24.86ID:B9g40Bu1
76: ぼくのことわすれないで
2020/07/18(土) 14:24:37.73ID:HDs6SbLj
AND, OR, XOR, ADD, ADC, SUB, SBC, CP,
やローテート、シフト命令でも、レジスタ様の命令で、
レジスタ番号を6にすると、(HL)に対する命令と同じ
マシン語になっていることが分かる。
2020/07/19(日) 04:45:05.98ID:1aVreze3
x86_64のアセンブラを始めようと思ってるのですが、レジスタの使い方を教えてください

以前、80286の頃だと、たとえばECXレジスタはカウンタ用に使うものだったと記憶してますが
x86_64だとほぼもう汎用レジスタとして使えるように見えます
gccなどもx86_64用でもそういうコードを出力するようです

昔の用途での使い方について、どれくらい意識した方がよいのでしょう
2020/07/19(日) 10:17:20.71ID:TvRHHtME
>>820
CPUの世代によっては、loop 命令は、
dec ecx
jnz ラベル名
とするよりも遅いことがあるので、後者の書き方の方が良い。
その意味で、ループカウンタを入れるレジスタとして、ecxにこだわる必要はない。

ただし、rep movsd などでは今でもカウンタが ecx に固定されている。

それ以外の場面では、ecxは、他の汎用レジスタと同じと考えてよい。

なお、ebpは汎用レジスタとしては使わず、スタックフレームの先頭アドレスを保持して、
ローカル変数をアクセスするために使うことが原則。
ただし、ローカル変数をebpの代わりにespを介してアクセスすることによって
ebpを汎用レジスタとして使う流儀も有り得る。
その場合は、push,pop命令によってespが変化してしまうので注意が必要となる。
なお、masmのlocalやarg擬似命令は、ebp方式を前提としている。

edi,esi は、movsd で使うことは意識しておく。
edx,eaxは、div命令で使うことを意識しておく。
edi,esi,ebpは、関数呼び出しで保存されるが、eax,ebx,ecx,edxは保存されないことを意識しておく。
eaxは関数呼び出しの戻り値になることを意識しておく。
2020/07/19(日) 10:18:46.24ID:TvRHHtME
>>821
さらに、dec reg 命令より、sub reg,1 の方が速いことがある。
前者は2クロック、後者は1クロック。なので、loop文は、
sub ecx,1
jnz ラベル名
と書くのが最良。
2020/07/19(日) 12:34:39.03ID:h5vFOzT4
>>820
呼び出し規約を守れば
あとはご自由に
2020/07/19(日) 12:36:44.38ID:h5vFOzT4
レジスタが増えてるし
SIMDレジスタもあるんで
自由度は高い

MULとDIVは相変わらずRAX, RDX縛りがあるけど
2020/07/19(日) 12:47:27.95ID:du465xO7
IA-32の命令ならインテルのhpにある
2020/07/19(日) 14:46:51.74ID:1aVreze3
820です

回答ありがとうございました

ABIやライブラリ等での使い方・縛りを考慮して使うようにすると、
やはりそれぞれのレジスタをアキュムレータ、カウンタ等として使う、
というのを指針にした方がよさそうですね
2020/07/19(日) 15:35:41.18ID:AazHQwx2
>>826
いや、普通の命令文に対する繰り返しのカウンタとしては、ecxを意識する必要はない。
計算のアキュムレータとしても、eaxを意識する必要も余りない。
余りを求める割り算だけは特殊。
2020/07/21(火) 11:55:19.37ID:08cjL+93
こんな感じで部品並べたら子ーどがてせきるやつないの?
amd64の

https://i.imgur.com/REDBsNI.png
https://i.imgur.com/NUN7ejI.png
https://i.imgur.com/Qchpsl1.png
2020/07/27(月) 04:16:34.73ID:FDPJJmZc
ない
2020/08/03(月) 23:51:00.41ID:f8ly6bXL
ttps://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%89%E3%83%AC%E3%83%83%E3%82%B7%E3%83%B3%E3%82%B0%E3%83%A2%E3%83%BC%E3%83%89
>アドレッシングモード
>既に使われなくなったアドレッシングモード
>メモリマップド・レジスタ
???国内なら78K0R(現RL78)、海外でもMSC-51(現EFM8BB1)とかはCPUのレジスタがメモリ空間にマッピングされている
いずれも現行製品では
831デフォルトの名無しさん
垢版 |
2020/08/04(火) 10:47:29.79ID:DzQriKoF
6809の0-255あたりのやつのことかな
832デフォルトの名無しさん
垢版 |
2020/08/04(火) 10:48:39.15ID:DzQriKoF
まあ同じことなんだろうけど
「CPUのレジスタがメモリ空間にマッピングされている」
というより
「メモリ空間がCPUのレジスタにマッピングされている」
というイメージ
2020/08/04(火) 11:41:48.61ID:WjyA4gdt
イメージって何か表現してるようで何も言ってないに等しい
2020/08/04(火) 12:45:04.95ID:g9THIEhB
ttps://ednjapan.com/edn/articles/1908/28/news026_3.html
STMはレジスタとSRAMの構造が違うらしい
理由からすると多くのCPUが同じ事やってそう
2020/08/04(火) 13:23:59.89ID:9WSBhL2x
この板でイメージを厳密に技術用語で使わないやつは…
2020/08/04(火) 15:05:26.21ID:z2HwYjyf
>>830
> CPUのレジスタがメモリ空間にマッピング
て具体的にどうやるんだろ?と思って調べてみた。
CPUのアドレスバスを監視して、レジスタにアクセスがあったのを検知したら、
それにマップされてるメモリにも同じようにアクセスするってことをしてると。なるほど。
2020/08/04(火) 15:22:33.51ID:CK7AS0VE
>>836
そういうことではなく、レジスタをアドレス空間にマッピングしているCPUは、
例えば、アドレス空間の 0〜255 番地の部分をレジスタ専用に
して、CPUの外部のアドレスバスには信号が出ないようにしていることが多い。
そして、
mov [0],値
と書くと、r0 に「値」を書き込むようにCPUが設計されていて、
外部のDRAMなどには全く信号が送られないようになっている。
2020/08/04(火) 15:30:51.43ID:z2HwYjyf
>>837
そういうのもあるだろうけど、それは最初からそういう設計にしているからそう動くということだよね。
アドレス空間にある入出力領域は固定的である必要はないので、バスに出た信号をどう処理するかは
設計者が自由に決められるはず。なので、バスに出た信号をメモリだけに送ることもできるし、
CPUとメモリ両方に送ることもできる。用途に合わせればいいということかと。
2020/08/04(火) 15:34:19.50ID:CK7AS0VE
>>838
「レジスタをアドレス空間にマッピングしているCPU」
というのは、最初から設計されているCPUのことだと思うぞ。
実際、ポケコンのCPUもそんな感じだった。
2020/08/04(火) 16:20:06.60ID:z2HwYjyf
>>839
設計者が最初からそう設計したのならそうだろうね。
固定的である必要がないというのは、設計するとき設計者がどちらでも選べるという意味だよ。
2020/08/04(火) 19:31:24.43ID:aUyBUHRY
>>837
ああ、ずっと何の話をしてるのか分からなかったけど0ページの話ね。
2020/08/16(日) 16:21:04.44ID:Cqk7CoxF
>>839 アルディーノのCPUがそれだ。レジスタがメモリにマッピングされている。
2020/08/17(月) 08:09:56.01ID:tzd42ouk
LLVMが吐き出したx86-64アセンブラコードを入力とするツールを作りたいのですが
このアセンブラコードの文法に関する資料って何処にあるんでしょうか
ttps://llvm.org/docs/Extensions.html
ttps://sourceware.org/binutils/docs/as/
あたりにも各命令をどのように記述するかまでは載っていないように見えるのですが・・・
2020/08/17(月) 10:11:33.24ID:RiKJFl8Z
命令セットレベルの話ならインテルのマニュアルでも見ろとしか。
2020/08/17(月) 11:34:25.89ID:NVTg5S9X
>>843
Intelに大量の PDF マニュアルがあり、詳細に書いてある。
2020/08/17(月) 11:37:24.90ID:NVTg5S9X
>>843
LLVMツールの出力する、native の x86 や x64 のアセンブリコードは、
試してみる限り、masm 形式ではない。
見た目はgccの形式に似ている。
LLVMのarm版が出力したnativeアセンブリコードは、gccのgasが解釈して正しくobjファイル
までアセンブルできたことがある。
x86 や x64 の場合は、そこまでは試していない。
847843
垢版 |
2020/08/17(月) 12:59:34.65ID:WGW93JMF
ぶっちゃけパーサーをどう作るかって所なのですが

>>844-845
そうなのですが
1.CPUのマニュアルの命令表記とアセンブラの命令表記は例外なく一致するのか
 基本的にはマニュアル通りで良さそうですが表記に揺れがあった場合困る
2.リファレンスはAMDかIntelか
 この命令セットを設計したのはAMDだし処理系の対応もAMD64が先行していたはず
あたりはイマイチはっきりしないです

>>846
吐かれるアセンブラコードはGASベースで独自のディレクティブが追加されているように見えますね
2020/08/18(火) 01:12:29.19ID:xqTakpBf
>>847
命令表記は、8バイトのオペランド(や型)を表すのにdqwordとowordで表す
2つの流儀がある。
さらに、mmwordを使う流儀もあるが、浮動小数点演算のx87の文化では
浮動小数点でも専用の型名は無くて、dwordでfloat、qwordでdoubleを扱う
流儀があった。
そこにxmmやmmxのためだけにmmwordを持ってきた意図やセンスは
賛否が分かれるところだと思う。
2020/08/18(火) 01:28:37.97ID:xqTakpBf
>>847
x64のリファレンスは、原則的にAMDで、AMDにも詳しいマニュアルがある。
命令表記は、絶対アドレス addr に対する間接参照で、昔は、[addr]と
表記していたものが、x64だと、マシン語レベルでは絶対アドレスを埋め込まずに、
ripからの相対アドレスrel_addrを用いて、[rip+rel_addr]のような意味になっている
があるが、アセンブラレベルでそれを表記する時、どうするかと言う問題がある。

masmだと昔から、
mov eax,MyWork1
・・・
ret
MyWork dd 1234
と書いてきた。普通のアセンブラなら、
mov eax,[MyWork1]
・・・
ret
MyWork: dd 1234
と書くところを。
しかし、rip相対になった場合、
mov eax,[rip+MyWork]
と書くと意味に合わないし、かと言って、
mov eax,[rip+rel MyWork]
と書くのも長くなる。意味的には、Masmだと
mov eax,MyWork
なのだが、マシン語レベルでは、絶対アドレス/相対アドレスのどちらで表現されるか、
明確に表すことはできなくなるジレンマがある。
2020/08/21(金) 15:25:03.93ID:EskYTmRE
destにメモリを指定できる命令ってパイプラインをストールさせやすいように思うけどそんな事はないの?
x64だと
ADD r/m64,r64
みたいなの
2020/08/21(金) 20:30:50.01ID:+dwilF/E
確かにストールしやすいとは言えるが影響度合いはプロセッサ次第で、そういう命令を持ったプロセッサはちゃんと考慮した設計がされている。

例えばOut of Order実行を行うプロセッサはパイプラインに結果書込み待ちをするキューを持ったステージがあって、メモリ書き込み前に後続の命令を実行可能だから単純にストールはしない。

前後の命令に依存があればストールするのはレジスタ相手でも同じことだし、命令でロードとモディファイとストアを分けても実行する内容は同じなのだから、結局はプロセッサアーキテクチャ毎に最適化が必要なことには変わりがない。
2020/08/22(土) 00:25:14.47ID:Rco6UMRM
インテル(R) 64 アーキテクチャーおよび IA-32 アーキテクチャー最適化リファレンス・マニュアル
を良く呼んだら書いてあったわ
> 一般的に、各命令を構成するマイクロオペレーション(μOP)の数を考慮し、単一マイク
> ロオペレーション(μOP)の命令、4 マイクロオペレーション(μOP)未満の単純な命令、
> マイクロシーケンサー ROM が必要な命令の順で優先して、命令を選択すると良い。
> 〜
> ・複数のマイクロオペレーション(μOP)からなる一連の命令を分割できない場合は、
>  同等の異なる命令シーケンスに分割する。例えば、読み出し−変更−書き込み命令は、
>  読み出し−変更命令 + ストア命令に分割すると、高速化が可能である。この手法を利
>  用すれば、新しいコードシーケンスが元のコードシーケンスより大きくなった場合で
>  も、パフォーマンスが向上する。
らしいのでADD m64,r64みたいな命令はパフォーマンス上のデメリットがあるから使用を控えた方が良さそう
2020/08/29(土) 02:13:33.36ID:kcJTulzj
x64命令の動作を確認するのに対話式にアセンブル&実行&レジスタの確認が出来るツールとかないかな?
各値を変えながら試行錯誤したいけどソース書いてアセンブルしてデバッガに読み込んでステップ実行してだと手間すぎる

今MULのフラグの更新動作がAMDの資料を見てもIntelの資料を見てもググってももよく判らない
2020/08/29(土) 17:42:02.36ID:CDQjtNyx
>>853
フラグ類は、言葉で説明が難しいので、擬似コードで説明されている Intel の資料が
どこかにあるはず。
2020/08/29(土) 18:05:14.09ID:CDQjtNyx
>>853
Intel® 64 and IA-32 Architectures
Software Developer’s Manual
Volume 2A:
Instruction Set Reference, A-M

-------------------------------------------------
[MUL—Unsigned Multiply]
・・・
Flags Affected
The OF and CF flags are set to 0 if the upper half of the result is 0; otherwise, they
are set to 1. The SF, ZF, AF, and PF flags are undefined.
2020/08/29(土) 18:39:05.44ID:kcJTulzj
>>855
その文章は確認していてAMD64のドキュメントにも
>If the upper half of the product is non-zero, the instruction sets the carry flag (CF) and overflow flag
>(OF) both to 1. Otherwise, it clears CF and OF to 0.
と似たような記述があるんだけど双方の資料に書いてある"upper half"がどの部分を示しているのか判らない
演算結果の上半分が入るDレジスタの事?
2020/08/29(土) 19:05:00.05ID:CGaweZC2
>>856
Intelの日本語マニュアルには処理の疑似コードが載ってる。
これによると、上半分というのは、各命令で使うレジスタサイズの上半分とわかる。
8,16,32bitそれぞれ場合によって上半分の長さが変わるのでそう書くしかない。
だから64bitの場合の上半分は上位32bitになる。

操作
IF (NumberOfOperands = 1)
 THEN IF (OperandSize = 8)
  THEN
   AX ← AL ? SRC (* signed multiplication *)
   IF AL = AX
    THEN CF ← 0; OF ← 0;
    ELSE CF ← 1; OF ← 1;
   FI;
  ELSE IF OperandSize = 16
   THEN
    DX:AX ← AX ? SRC (* signed multiplication *)
    IF sign_extend_to_32 (AX) = DX:AX
     THEN CF ← 0; OF ← 0;
     ELSE CF ← 1; OF ← 1;
    FI;
   ELSE (* OperandSize = 32 *)
    EDX:EAX ← EAX ? SRC (* signed multiplication *)
    IF EAX = EDX:EAX
     THEN CF ← 0; OF ← 0;
     ELSE CF ← 1; OF ← 1;
  FI;
FI;
2020/08/29(土) 19:47:52.94ID:cC8g9MrB
upper half of the product だから乗算結果の上半分だ。
疑問の余地は無いと思うがな…
2020/08/29(土) 20:22:30.40ID:GYyhmMZY
CPU emulator Unicorn
https://www.unicorn-engine.org/
860デフォルトの名無しさん
垢版 |
2020/08/30(日) 01:05:43.21ID:BjChy3oe
IF sign_extend_to_32 (AX) = DX:AX
 THEN CF ← 0; OF ← 0;
 ELSE CF ← 1; OF ← 1;
FI;

これだと符号拡張したものと比較しているから、言葉による説明と違っている。
基本的に、mulは、符号無しの整数に対する掛け算なのだが。
2020/08/30(日) 01:11:49.03ID:BjChy3oe
>>857
それは、mul(符号無し掛け算)ではなく、imul(符号付掛け算)の擬似コードで、
英語版でも、同じような擬似コードが書いてあり、言葉による説明は、
次のようになっている:
Flags Affected
For the one operand form of the instruction, the CF and OF flags are set when signif-
icant bits are carried into the upper half of the result and cleared when the result fits
exactly in the lower half of the result. For the two- and three-operand forms of the
instruction, the CF and OF flags are set when the result must be truncated to fit in the
destination operand size and cleared when the result fits exactly in the destination
operand size. The SF, ZF, AF, and PF flags are undefined.
2020/08/30(日) 01:22:29.16ID:BjChy3oe
ちなみに、同じビット数の2つの整数の掛け算は、結果の内、掛ける前の整数の
ビット数の部分に限定した部分だけを見れば、符号付き掛け算と符号無し掛け算
で結果が変わらない。
一方、imulは、2オペランド以上のものは、結果のビット数が、掛ける前と同じ。
そして、mulは、2オペランド以上のものが用意されて無い。
これは、最初に述べた性質から、imulとmulで、2オペランド以上の場合では、
結果が変わらなくなってしまうため、imulだけで、符号無し掛け算にも対応できる
ためである。
863デフォルトの名無しさん
垢版 |
2020/08/30(日) 14:10:51.87ID:GgAZZaQa
https://www.youtube.com/watch?v=1EqyId5U8zA
https://www.youtube.com/watch?v=HOx7R3rgaTs
https://www.youtube.com/watch?v=M3x5J4jUYrc
https://www.youtube.com/watch?v=4ly0dPogeXY
https://www.youtube.com/watch?v=7EbNp1pDRPk
2020/08/30(日) 14:26:36.90ID:EVylyaDc
>>863
昔は大学教授しかこういう講義してなかったが、今は若い女の子が講義してくれるのかw
いい時代になったな
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況