645 :
デフォルトの名無しさん:2014/09/29(月) 00:56:30.26 ID:RKEDgsOw
GCCの吐いたコード見てアセンブラがわかった気になる本みたいだけど、あんま意味はないと思う。
実行環境が身近にないPowerPCとかその他アーキテクチャとか数がたくさんあっても無意味。
いまどきだったら VC++ Express のインラインアセンブラとか使うのがお手軽かつ効果も身近に感じれて
いい気がするが。
はじめてi486 のかまち氏ご推薦だって
かわいそうに、集団いじめにあってるね
651 :
デフォルトの名無しさん:2014/09/29(月) 09:36:48.07 ID:NL6Qfls1
ツイッターで騒いでるヤツラ見てるとほんとニワカが多いなと実感する。
コンパイラの出力見てコードの評価するのなんて業務でコンパイラ言語使ってりゃ日常の行為だろうに。
↑
2chも同じだということを自分で証明しているw
大手系の投稿記事よりはましなこと書いてたような
vs2013でyasmのソースコードデバッグできないのはどうしたらいいんだろう?
以前は-g cv8でできた気がしたけど、2012でもだめで、2008だったからかな
656 :
655:2014/10/10(金) 00:03:18.91 ID:EfaI1XmC
vs2008を引っ張り出しきてインストールしたら、yasmのソースコードデバッグも可能で
ちゃんとブレークポイントも設定できた
2013でもローカルシンボルのアドレスは読み込んでるんだけどなぁ
657 :
デフォルトの名無しさん:2014/10/10(金) 12:27:08.25 ID:553xVF6m
VCは64-bitインラインアセンブラできないんでしょ?
インラインアセンブラにこだわる理由もない
デバッグ情報が変わったのか、asmファイルでブレークポイントを設定しても
無効になっちゃうんだよ
これは使いにくい
masmなら大丈夫なんだけどね
660 :
デフォルトの名無しさん:2014/11/04(火) 17:11:16.93 ID:8a1BiHkJ
8086はデータ転送命令はmoveとexchangeしかないと思うのですが、
80486になるとload effective addressという命令が加わっています。
今までmove命令で書けていたものに、load effective address命令を加える必要はあるのでしょうか。
moveとload effective addressは別物でしょうか
8086の頃からあるわけだけど、利点としては
・普通のアドレッシング表現から、そのアドレスにアクセスするのでなく
そのアドレスそのものが得られるので便利
・P5以降とかだと、可能な限りどんな命令でも1クロックで実行できるよう
頑張ってるので、アドレス計算用にたくさん乗ってる加算器を有用に
使って、数個の数の足し算と4倍、みたいな計算が高速にできる
とか。
663 :
デフォルトの名無しさん:2014/11/04(火) 17:59:26.43 ID:obX3t5pP
等価じゃないのに
664 :
デフォルトの名無しさん:2014/11/04(火) 18:34:18.92 ID:8a1BiHkJ
ありがとうございます。マニュアルを読むようにします
CASLUのRPUSH,RPOPがわからないのですが、メインルーチンでRPUSH、RPOPする理由を教えてください。
サブルーチン呼び出しでレジスタの値を退避し、その処理から抜けるときに復帰するのはわかるのですが、
メインルーチンが呼ばれてプログラムが始まるときにレジスタの値をスタックに退避し、抜けるときに復帰するのはスタートアップルーチンと何か関係があるのでしょうか
RETで終了するならそのプログラムもサブルーチンてことだから、レジスタを
退避/復帰する理由は他のサブルーチンと同じ。
オススメのアセンブラ入門サイト教えてくださいお願いします
あ、x86です
>>669 やはり最終的にはintelのサイトに行き着くんですね、ありがとうございます
<main+0> push rbp
<main+1> mov rbp,rsp
<main+4> mov eax,0x0
<main+9> mov DWORD PTR [rbp-0x4],0x0
<main+16> pop rbp
<main+17> ret
もとのプログラムはint main(){return 0;}をディスアセンブルしたものなのですが、
eaxにはリターン値0がロードされるのはわかるのですが、
mov DWORD PTR[rbp-0x4],0x0が何の処理なのかわかりません
使ってるコンパイラとコンパイルオプションは?
clangです
コンパイルオプションは-gのみです
Cygwin64上のclang version 3.4.2 (tags/RELEASE_34/dot2-final)で
hoge.c:
int main()
{
return 0;
}
を
$ clang -S hoge.c
したら
main:
pushq %rbp
movq %rsp, %rbp
pushq %rax
callq __main
movl $0, -4(%rbp)
xorl %eax, %eax
addq $8, %rsp
popq %rbp
ret
になったから結果が違うな。movl $0,-4(%rbp) はされるが。
$ clang -O2 -S hoge.c
最適化ありでコンパイルすると
main:
pushq %rbp
movq %rsp, %rbp
callq __main
xorl %eax, %eax
popq %rbp
ret
になったから movl $0,-4(%rbp) が意味ないことは確か。
ちなみにmain()でない関数なら最適化なしでも結果変わらんかった。
int hoge()
{
return 0;
}
$ clang -S hoge.c
hoge:
pushq %rbp
movq %rsp, %rbp
xorl %eax, %eax
popq %rbp
ret
$ clang -O2 -S hoge.c
hoge:
pushq %rbp
movq %rsp, %rbp
xorl %eax, %eax
popq %rbp
ret
$ clang -O2 -fomit-frame-pointer -S hoge.c
hoge:
xorl %eax, %eax
ret
>>675 ありがとうございます
意味がないということがわかりました
678 :
片山博文MZ ◆T6xkBnTXz7B0 :2014/12/25(木) 22:21:21.82 ID:gEw73of1
IEEE754-2008の浮動小数点数をx86アセンブラで実装出来る人、此処に居ますか?
あげ
そんなの金次第
682 :
デフォルトの名無しさん:2014/12/27(土) 22:56:25.54 ID:u+dBZrZs
仮に、A1111,B1101 として精度4桁とすると、
和差は、指数部の大きい方へ合わせる
1111
00001101 → 0
指数の差が4桁以上あると、下は0と同じになる
仮に指数を、A50,B20とすると、
積は両指数の和 → 50 + 20 = 70
除は両指数の差 → 50 - 20 = 30
683 :
682:2014/12/28(日) 10:12:28.37 ID:/YZxn3dB
これらをシフト・マスク演算などを使って、
Cで書いて、アセンブラで出力すれば?
でも、ちゃんとステータスレジスタのフラグが立つかな?
aaa/daaとかの命令は結局どういう用途で存在しているんだ...?
調べてもよくわからん(多分それだけ使われないんだろうが)
687 :
デフォルトの名無しさん:2015/02/01(日) 19:33:48.31 ID:+Sv3xZC2
fpuが外付けな大昔
Z80のフローティングライッブラリをx86に移植して
三角関数もテーブルを使って近似値を求める方法で実装したことあるけど
今の時代、知的好奇心を満たす以外になにか意味ある?
三角関数の精度はFPUの付いたPCで計算した結果と摺り合わせて確認した
どっちが速かった?
689 :
デフォルトの名無しさん:2015/02/01(日) 20:53:10.36 ID:+Sv3xZC2
なにと比較するのかと言う意味なら比較対象がない
当時のN88BASIC(86)との比較ではインタープリタ対マシン語(アセンブラ)なので
オーバーヘッドが少ない分自分で移植したライブラリの方が早かった(FPU無しの倍精度)
内部は80ビットフローティングの精度に対応する為に化数部を128ビット指数部を16ビットで計算後
80ビットフォーマットに丸めた
x64って天国だよなx86と比較すると
紙に印刷したプログラム探せば出てくると思うw
>>687 0度〜45度をテーブル実装するの?それとももっと狭くていいの?
691 :
デフォルトの名無しさん:2015/02/02(月) 04:57:44.05 ID:j5MISSAc
>>690 忘れたけどたぶんそれくらい
もしかすると90度分かもしれなけど
テーブルの形式は計算精度が必要だったので
近似値に収束する形だったと思う(もう覚えていない)
三角関数の比率が必要な場面は今はFPUに依存できる
あらかじめ化数128指数16ビットの浮動小数点ライブラリで精度の高めな
近似値導出用テーブルを作ってそれを使ってtan-1(うろ覚え)を求めた後で三角関数を計算してた
利用目的で必要な計算精度も異なるので工夫しようぜ
三角関数の粗い比率だけなら64ビット整数で簡単に導出可能
とりあえず「仮数部」を単語登録した
693 :
デフォルトの名無しさん:2015/03/10(火) 01:21:00.65 ID:HHYC72Cw
PICでのC言語プログラム(上側)をアセンブラ言語(下側)へと書き直したのですが上手く動いてくれません
http://codepad.org/STGr8jeE http://codepad.org/p74NS78p プログラムの内容は8つのLEDのうち一つが光っており、
RB0のスイッチを押すたびに光る場所がひとつずつシフトしていくというものです
そして、このプログラム内でチャタリング対策を行っています。
Cの方は上手く動いてくれましたが、アセンブラの方は56行目でどうしてもスキップが有効になりCount_Loopから抜け出せない状況に陥ってしまいます
ステップオーバーで調べてみたところWregや物理スイッチの反応には問題なさそうだったので
Switch_Countが怪しいと睨んでいます(原因は分かりませんが)
どなたか原因の究明をお願いします