アセンブラ初心者スレッド

このエントリーをはてなブックマークに追加
645デフォルトの名無しさん:2014/09/29(月) 00:56:30.26 ID:RKEDgsOw
いまどきこんなの出ましたけど

熱血! アセンブラ入門
http://www.shuwasystem.co.jp/products/7980html/4180.html
646デフォルトの名無しさん:2014/09/29(月) 02:16:32.88 ID:NJr46rSn
GCCの吐いたコード見てアセンブラがわかった気になる本みたいだけど、あんま意味はないと思う。
実行環境が身近にないPowerPCとかその他アーキテクチャとか数がたくさんあっても無意味。

いまどきだったら VC++ Express のインラインアセンブラとか使うのがお手軽かつ効果も身近に感じれて
いい気がするが。
647デフォルトの名無しさん:2014/09/29(月) 02:29:34.31 ID:NJr46rSn
648デフォルトの名無しさん:2014/09/29(月) 08:16:03.37 ID:wd4qvqdb
はじめてi486 のかまち氏ご推薦だって
649デフォルトの名無しさん:2014/09/29(月) 08:26:09.14 ID:xSX/Gj/Z
かわいそうに、集団いじめにあってるね
650デフォルトの名無しさん:2014/09/29(月) 08:31:28.14 ID:NJr46rSn
>>648
目次しか見てないで推薦もないと思うが。

https://twitter.com/tkmc/status/516132413710163969
> 『熱血! アセンブラ入門』http://www.shuwasystem.co.jp/products/7980html/4180.html
> この目次を見たら買わないわけにいかない。

https://twitter.com/tkmc/status/516148086553321472
> 3日前に注文して昨日が発売日らしいのにまだ来ないなぁ。と思ったらAmazonは発売日が9/30って
> 書いてある。
651デフォルトの名無しさん:2014/09/29(月) 09:36:48.07 ID:NL6Qfls1
この本の著者は初心者や初学者を対象に微妙にずらしてくる

12ステップで作る組込みOS自作入門
http://www.amazon.co.jp/dp/4877832394/
対象マシンがH8/3069F

開発ツールを使って学ぶ! C言語プログラミング
http://www.amazon.co.jp/dp/4839951497/
初心者の方でも気軽に学習可能なように、必要開発ツールが
インストールされたLinux(CentOS)の仮想マシン(VM:Virtual Machine)
イメージをサポートサイトで無償配布します。「Oracle VM VirtualBox」
や「VMware Player」上に読み込めばすぐ学習をスタートできます。
- amazon紹介より -
652デフォルトの名無しさん:2014/10/01(水) 03:50:57.56 ID:PMHBFBS+
ツイッターで騒いでるヤツラ見てるとほんとニワカが多いなと実感する。
コンパイラの出力見てコードの評価するのなんて業務でコンパイラ言語使ってりゃ日常の行為だろうに。
653デフォルトの名無しさん:2014/10/01(水) 21:40:35.62 ID:RRxwqEFU

2chも同じだということを自分で証明しているw
654デフォルトの名無しさん:2014/10/01(水) 23:25:07.36 ID:XzaO0iHc
大手系の投稿記事よりはましなこと書いてたような
655デフォルトの名無しさん:2014/10/02(木) 08:07:44.77 ID:vok4PHmT
vs2013でyasmのソースコードデバッグできないのはどうしたらいいんだろう?
以前は-g cv8でできた気がしたけど、2012でもだめで、2008だったからかな
656655: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インラインアセンブラできないんでしょ?
658デフォルトの名無しさん:2014/10/10(金) 12:43:13.70 ID:aGA3C1dn
インラインアセンブラにこだわる理由もない
659デフォルトの名無しさん:2014/10/11(土) 00:20:30.24 ID:JSe/b624
デバッグ情報が変わったのか、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は別物でしょうか
661デフォルトの名無しさん:2014/11/04(火) 17:43:18.58 ID:4tbMiHmM
662デフォルトの名無しさん:2014/11/04(火) 17:56:50.54 ID:99dxtSJ/
8086の頃からあるわけだけど、利点としては
・普通のアドレッシング表現から、そのアドレスにアクセスするのでなく
 そのアドレスそのものが得られるので便利
・P5以降とかだと、可能な限りどんな命令でも1クロックで実行できるよう
 頑張ってるので、アドレス計算用にたくさん乗ってる加算器を有用に
 使って、数個の数の足し算と4倍、みたいな計算が高速にできる
とか。
663デフォルトの名無しさん:2014/11/04(火) 17:59:26.43 ID:obX3t5pP
等価じゃないのに
664デフォルトの名無しさん:2014/11/04(火) 18:34:18.92 ID:8a1BiHkJ
ありがとうございます。マニュアルを読むようにします
665デフォルトの名無しさん:2014/11/09(日) 14:24:01.21 ID:bui++2v4
CASLUのRPUSH,RPOPがわからないのですが、メインルーチンでRPUSH、RPOPする理由を教えてください。
サブルーチン呼び出しでレジスタの値を退避し、その処理から抜けるときに復帰するのはわかるのですが、
メインルーチンが呼ばれてプログラムが始まるときにレジスタの値をスタックに退避し、抜けるときに復帰するのはスタートアップルーチンと何か関係があるのでしょうか
666デフォルトの名無しさん:2014/11/09(日) 14:41:08.70 ID:6OcI07Hk
RETで終了するならそのプログラムもサブルーチンてことだから、レジスタを
退避/復帰する理由は他のサブルーチンと同じ。
667デフォルトの名無しさん:2014/11/14(金) 21:44:40.20 ID:Q09MuRKV
オススメのアセンブラ入門サイト教えてくださいお願いします
668デフォルトの名無しさん:2014/11/14(金) 21:45:49.11 ID:Q09MuRKV
あ、x86です
669デフォルトの名無しさん:2014/11/14(金) 21:57:13.86 ID:ssh0hRKq
670デフォルトの名無しさん:2014/11/14(金) 22:31:57.52 ID:Q09MuRKV
>>669
やはり最終的にはintelのサイトに行き着くんですね、ありがとうございます
671デフォルトの名無しさん:2014/11/15(土) 09:37:48.59 ID:nFEuZMwr
<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が何の処理なのかわかりません
672デフォルトの名無しさん:2014/11/15(土) 14:21:10.02 ID:yIj5KxcO
使ってるコンパイラとコンパイルオプションは?
673デフォルトの名無しさん:2014/11/15(土) 14:52:03.23 ID:nFEuZMwr
clangです
コンパイルオプションは-gのみです
674デフォルトの名無しさん:2014/11/15(土) 15:53:32.81 ID:yIj5KxcO
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) はされるが。
675デフォルトの名無しさん:2014/11/15(土) 15:56:22.72 ID:yIj5KxcO
$ clang -O2 -S hoge.c

最適化ありでコンパイルすると

main:
    pushq  %rbp
    movq  %rsp, %rbp
    callq  __main
    xorl  %eax, %eax
    popq  %rbp
    ret


になったから movl $0,-4(%rbp) が意味ないことは確か。
676デフォルトの名無しさん:2014/11/15(土) 16:01:50.53 ID:yIj5KxcO
ちなみに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
677デフォルトの名無しさん:2014/11/15(土) 19:20:54.59 ID:nFEuZMwr
>>675
ありがとうございます
意味がないということがわかりました
678片山博文MZ ◆T6xkBnTXz7B0 :2014/12/25(木) 22:21:21.82 ID:gEw73of1
IEEE754-2008の浮動小数点数をx86アセンブラで実装出来る人、此処に居ますか?
679デフォルトの名無しさん:2014/12/25(木) 22:33:47.28 ID:gEw73of1
あげ
680デフォルトの名無しさん:2014/12/25(木) 22:35:18.35 ID:P9hgzX+u
そんなの金次第
681デフォルトの名無しさん:2014/12/25(木) 22:37:17.19 ID:P9hgzX+u
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
683682:2014/12/28(日) 10:12:28.37 ID:/YZxn3dB
これらをシフト・マスク演算などを使って、
Cで書いて、アセンブラで出力すれば?

でも、ちゃんとステータスレジスタのフラグが立つかな?
684片山博文MZ ◆T6xkBnTXz7B0 :2014/12/28(日) 11:45:17.05 ID:0W4dp9Sf
>>682-683
よく考えたら、x86で作るのは意味なかった。ごめんね。
685 ◆hL51veKlRE :2015/02/01(日) 18:55:41.71 ID:JsXnXzTS
aaa/daaとかの命令は結局どういう用途で存在しているんだ...?
調べてもよくわからん(多分それだけ使われないんだろうが)
686デフォルトの名無しさん:2015/02/01(日) 19:01:49.03 ID:rGGapq8A
>>685
お前がBCD演算を理解してないだけ
687デフォルトの名無しさん:2015/02/01(日) 19:33:48.31 ID:+Sv3xZC2
fpuが外付けな大昔
Z80のフローティングライッブラリをx86に移植して
三角関数もテーブルを使って近似値を求める方法で実装したことあるけど
今の時代、知的好奇心を満たす以外になにか意味ある?
三角関数の精度はFPUの付いたPCで計算した結果と摺り合わせて確認した
688デフォルトの名無しさん:2015/02/01(日) 20:06:24.91 ID:s/hXDQXD
どっちが速かった?
689デフォルトの名無しさん:2015/02/01(日) 20:53:10.36 ID:+Sv3xZC2
なにと比較するのかと言う意味なら比較対象がない
当時のN88BASIC(86)との比較ではインタープリタ対マシン語(アセンブラ)なので
オーバーヘッドが少ない分自分で移植したライブラリの方が早かった(FPU無しの倍精度)
内部は80ビットフローティングの精度に対応する為に化数部を128ビット指数部を16ビットで計算後
80ビットフォーマットに丸めた
x64って天国だよなx86と比較すると
紙に印刷したプログラム探せば出てくると思うw
690デフォルトの名無しさん:2015/02/01(日) 22:17:09.61 ID:e1RPi5xm
>>687
0度〜45度をテーブル実装するの?それとももっと狭くていいの?
691デフォルトの名無しさん:2015/02/02(月) 04:57:44.05 ID:j5MISSAc
>>690
忘れたけどたぶんそれくらい
もしかすると90度分かもしれなけど
テーブルの形式は計算精度が必要だったので
近似値に収束する形だったと思う(もう覚えていない)
三角関数の比率が必要な場面は今はFPUに依存できる
あらかじめ化数128指数16ビットの浮動小数点ライブラリで精度の高めな
近似値導出用テーブルを作ってそれを使ってtan-1(うろ覚え)を求めた後で三角関数を計算してた
利用目的で必要な計算精度も異なるので工夫しようぜ
三角関数の粗い比率だけなら64ビット整数で簡単に導出可能
692デフォルトの名無しさん:2015/03/08(日) 10:52:34.09 ID:/s2hhMUc
とりあえず「仮数部」を単語登録した
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が怪しいと睨んでいます(原因は分かりませんが)
どなたか原因の究明をお願いします
694デフォルトの名無しさん