アセンブラ初心者スレッド 2©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
チープなやつは大体どれも変態だよ
C言語で記述不可能なのもあるから
PICは変態な中でもまだマシな方 PICは命令数が少ないから大好き
アセンブラは慣れれば問題ない 日本では特に間違って伝わってるからなぁ
想像するのがC言語やスクリーンエディタ機能組み込まれてた頃のBASICのGOTOっていう 古臭くて役にも立たない話をするのが大好きで、LARGEADDRESSAWAREやキャリーフラグで
大爆死した誰かさんがしれっと戻って来てるのか? GOTOがというより抽象化に関する教育の不足が問題なんじゃ
昨今のプログラミング教育も本質が見えているようには見えない 歪んだ教育のせいで
ループ内で意地でも
continue, break, goto
を使わない人がいる
その為、
無駄な変数を使ったり
ループ条件が複雑になったり
本末転倒 breakにラベル指定出来なかったのはCの設計ミスやろ 多重ループはgotoで抜ける
って事だろうけどね
gotoはラベル名を考えるのが面倒
break 2;
で2段階breakが出来ると良い >>679
N88-BASICのような時代は、行番号があったからラベル名を考える必要が
なく楽だった。MASMの場合は、プロシージャローカルのラベル名が
使えたので、lab1:, lab2: のようにしておくと楽だった。
Cの場合、見た目的に「ラベルが浮く」現象が起きるのも問題。 BASICの場合、
1000 xxx
1010 if xxx > xxx then 1200
1020 xxx
1030 goto 1300
1200 xxx
のように書けて至って楽だったし、見た目も綺麗に書けた。
アセンブラの場合も
xxx proc near
mov yyy,zzz
lab1:
call aaa
lab2:
dec ecx
jnz bbb
xxx endp
のように命令の前には tab(0x09) 付けされ、ラベルと区別が付き易いのでとても
綺麗に書けた。ところがCの場合は、ラベルと命令の見た目のバランスが悪いので
問題となった。構造上の汚さよりもその問題の方が大きい。 >>680
@@:
jmp @b
jmp @f
も便利
Cで「ラベルが浮く」?
ラベルに慣れてないだけでは? ラベルはインデントを1個左にずらす
case文と同じように >>683
こんな感じですか?
{
{
ラベル名1:
if ( xxx < yyy ) {
普通の文1;
ラベル名2:
普通の文2;
}
}
} caseって用途は限定されてるけど、飛び先ラベルそのものよな? アセンブラは元々CPUに寄せてるのが普通で、人間に合わせるなんてこと考えてません。
人間がわかりやすいようにしたければマクロで補うなり、プリプロセッサ作るなどして工夫すればいいんですよ。 PICくらいで非人道的とか
もっと変態CPUはいくらでもあるってのに >>692
でもね、プロセッサ変わる度に覚え直すのは面倒だしつらいだろ。
面倒なものや難しいものをそのまま力業で押し通そうとするのはやっぱり頭悪いやり方。
賢い人なら、もっと頭使って少しでも使いやすく、わかりやすく変えていくもんだと思うんだよね。 >>696
Cが対応しているプロセッサならそれ使えばいいけど、同じ処理をアセンブラで書くのとCで書いたのでは実行ファイルのサイズが大きく違う。
Cは余計なランタイムルーチンがリンクされて無駄に太る。Cで書いてもアセンブラで書くのとほとんど同じサイズになる処理系があればその方が良い。
そして、なければ作るしかない。覚えにくいニーモニックを頑張って覚えるくらいなら、そういう処理系を作ることに労力を使ったほうがいいんじゃないかな。 今時マイコンですら結構な容量のフラッシュROMを積んでいるし
高級言語に由来するフットプリント増が問題になるケースは少ないと思うが
高いリアルタイム性が要求されたり重い処理をするケースはアセンブラで書く場合がある >>697
需要がないプロセッサは作らない
それだけ
変態アーキテクチャは理由があってそうなってる訳だし
普通のCPUならC/C++で使いやすいように整備されてる
Cランタイムサイズが問題になるCPUだと
ランタイムも小さく出来るのが普通
(printf、malloc を使わないなど) 8bitCPUにFlashROM 32KBにRAMが1KB、広すぎて天国のようだ 68000君は居ないようだな。残念だ
C言語も神が作ったのではない、breakやcontinueがどこに飛ぶのか分からん時はある。
入門書を信じ込んだ狂信者、原理主義者のような、痛い目に会ってない素人は結構いる。 >>704
> breakやcontinueがどこに飛ぶのか分からん時はある。
そんな経験はないなあ。普通はCの仕様通りに動く。
Cの仕様通りに動かないとしたらそのCコンパイラのバグだと思いますよ。
もし本当にわけがわからない動作をしたときはテストプログラムを書いてどう動くか調べたり
アセンブラソース出力して見てみればいい。 ソースを追う気がなくなるからわからなくなるって意味だろ 素朴な疑問なんだが逆アセンブラのラベルってどうやって生成されるの?
レジスタ間接ジャンプのジャンプ先アドレスなんて実行してみないと判らないような・・・ PEヘッダ内にあるImage baseとかじゃね win32の場合だけど >>705
>そんな経験はないなあ。普通はCの仕様通りに動く。
多重ループ脱出やifやなんやらのネストでどこに行くか分からなくなる事は無かったんか
Cの経験浅い人は、そういうことが分からないんだろうな。 インデントがぐちゃぐちゃなパターンは昔はよく見た。viのせいだろうな。 >>709
複雑なものを複雑なままコードにするからそうなる。
多重ループと言ってもせいぜい2重か3重だし、それ以上深いループになるようなコードだったら
そもそも考え方が悪いからシンプルになるように書き直す。中身をサブルーチンに追い出して、
ループ構造と脱出が一目でわかるようにしても良い。
ifのネストも同様に、細部の条件を洗い出してパラメータを変えて呼び出すだけで動くようにする。
そうすればif文を見なくていいしそれぞれ1行で呼び出せる。
とにかくできるだけ構造がシンプルでわかりやすくなるように工夫することだよ。 >>709
そのためにC言語にはgoto文があるわけだが
別にスパゲッティプログラム書くためにあるわけじゃないぞ 究極の変態ってどんな感じなんだろうな
パズル的で面白そうだが… まったくの初心者なのですが、アセンブリ言語を理解できるようになりたいです。
入門サイトなどを探しても自分が探しているCPUを取り扱っている物は見つかりませんでした。
まだCPUの仕組みもよく理解していないような状態なので、種類に拘らずそのような入門サイトなどで勉強した方がいいのでしょうか。
一通り学習を終えた後、別のCPUの言語でもすぐ対応できますか?
iosアプリのリバースエンジニアリング をしてみたいと思っているのでarm64のコードを理解できるようになりたいです。(用語などの使い方が間違っていたらすみません。) 情報処理資格の教科書から、始めた方がよい。
CASL 2 という仮想アセンブラもある
仮想アセンブラとは、各メーカーごとの実際のアセンブラではなくて、抽象的なもの
仮想アセンブラでは、LLVM が最も有名 動機を当ててやるか。ゲームを改造して無双したいのだろう。
だがそんなの対策済みで無駄なことだ。 実プロセッサのアセンブラを学ぶのに仮想アセンブラって役立つか?
LLVMなんてレジスタ数無制限だしスタック無しでも処理を書けるだろ
実際のプロセッサでそれは現実的ではないしスタック操作はボトルネックにもなっている MPUそのものは仮想でもエミュがあってそこそこ実用になるなら良いんじゃない? 比べるのもアレだけど
極端な話 BrainF*ck も仮想みたいなもんだろ コンパイラにアセンブラ出力させてみた結果
8bitのアセンブラが簡単なんて嘘
Cソース
https://pastebin.com/bWfLhn8Y
8bit MSX-C Ver1.1 アセンブラ出力
https://pastebin.com/Bzt3fFaX
16bit Turbo-C Ver1.5 アセンブラ出力
https://pastebin.com/y82ifpxs
64bit Ubuntu 18.04 x86_64 gcc-7.4.0 アセンブラ出力
https://pastebin.com/PTuEv5uL
64bit Ubuntu 20.04 ARM64 gcc-9.3.0 アセンブラ出力
https://pastebin.com/9N4eKWeg ちなみにgccでは
int func01() __attribute__((noinline,noclone));
とやってインライン展開を抑制してます >>724
Cのintは16bitだから、8bit CPUではint変数を2回に分けて転送しないといけない。
複雑になって当然。 単純な命令しかなくて命令数も圧倒的に少ない8bit
複雑な命令がたくさんあって命令数も1000を越える64bit >>726
8bit整数を扱うだけで済む処理なら簡単だが、8bitを超える可能性がある処理だと途端に面倒になる。
8bitなんてすぐ溢れる。 簡単さだったら新しいCISCに分があるんじゃね
ttps://uploader.purinka.work/src/17167.png
R0はスタックポインタ。呼び出し規約の都合上引数の一部が
スタックに積まれている以外はamd64と同じ感じか
同じ8bitでも8051とAVRじゃ大分違うと思う 命令を覚える命令を使うのが簡単か
同じ機能を実現するのが簡単か
で結果が180度違う 8bitCPUのソフトエンジニア
64bitCPUのソフトエンジニア
どちらがより多くの知識や経験が必要か
一般的には64bitの方が必要 本当はわかっていて、ちょっと言い合いたいだけだろうな >>731
規模が小さいなら64bitでも簡単。Intel系なら命令も上位互換だからほぼ同じ命令が使える。 IA-32よりAMD64の方が簡単なんじゃないか説(汎用レジスタの本数的に) 8bitが簡単と言われるのは命令の数が限られてるのと、簡単なことしかしないから
64bitでもよく使われる限られた命令だけ使って、8bitと同じことをやれば
8bitよりも簡単
実際は周辺や割り込みコントローラなんかもリッチになるので大変だけどね
Arduinoみたいにそのあたりを意識しないなら64bitの方が8bitよりも簡単 >>739
Arduinoだと普通はArduino IDE使うからほぼCで書けるよね
わざわざアセンブラ使うかな それ言い出したら
そもそも普通はアセンブラなんか使わん アセンブラでしか書けない特殊処理(特殊命令、特殊レジスタへのアクセスなど)
速度やリソースのチューニング
趣味 まあ趣味だな。Cで書けない処理をアセンブラで書けたら「やった」て気になるしな。 それはアセンブラでしか書けない特殊処理ではなくて? 趣味だからどういう処理でも自分が満足できればそれでいいんじゃね?
簡単な処理から始めてだんだん難しい処理に挑戦するのも面白いし 組み込みで非標準的な実装をしたい場合はアセンブラを使ったりするな 仮にアセンブラの本を書くとして、その題材になにを選ぶか、アセンブラだからこそできる!というナイスな題材がほとんど思いつかないのです… 思いつかないってことは、本当にやりたいと思ってないってことだろうな。
たとえば部屋で飼ってる猫の様子を出先から監視したいと思ったらArduinoとカメラユニットを組み合わせて
スマホから見られる制御ソフトを作るだろう。 >>749
それはアセンブラだからこそできる、という題材ですか? スタートアップコードの記述
OS作成
くらいじゃね? パフォーマンス系なら
DSP制御とか
リアルタイム系の重い処理とか ペリフェラルAとペリフェラルBを同期させて動かしたいなんて場合はアセンブラの使用を検討する えらい抽象的だな
タイミングにシビアなのはコンパイラに依存しないようにアセンブラで書くってのはある
もちろんシビアな部分だけ >>747
これも抽象的で何の実装だかさっぱりわからん >>748
やっぱり、SIMD命令とか組み込みだとDSP命令を使いたい時とかじゃないの? 最近ではSIMDやDSP命令はCの文法で記述出来るのが普通
もちろんガチガチのチューニングはアセンブラが一番だから
結局チューニングという範疇 >>750
俺は「アセンブラだからこそ」という制限など付けていない。そういう制限はあんたが勝手に付けたものだ。
作りたいものを作る。それが趣味だ。
違うと思うなら自分で考えてアセンブラだからこそというものを作ればいい。 >>753
趣味なんだから適すかどうかは関係ない。適さないと思うなら作らなければいい。
人それぞれだ。 趣味ならアセンブラを使う理由なんて何でも良い
でもどうせならアセンブラを使うことでメリットが何かしら得られる方が良い
そのメリットは大きい方が良い
と思うのは普通かと >>761
趣味は一般的なメリットなんか考えてたらできない。
鉄ヲタなんか、自分で電車運転したいためだけにパソコンのシミュレータを自作してる。
それも20年もかけて作って値段は0。タダで配ってる。金銭的なメリットはゼロだ。
窓から見える信号機や駅のデータも手間暇かけて現地に行ってパソコンのデータに変換してる。
運転席の計器類やすれ違う電車のモデルやデザイン、色まで正確に再現してる。
とてもこれだけの手間に見合うメリットがあるとは思えない。
でもこれだけの無駄をしてもやりたいのが趣味なんだよ。
鉄ヲタがアセンブラを使うとしたら、電車が動くスピードが少し遅く感じるから本物と同じくらい反応を早くしたいと
思ったらすぐ使うだろう。とにかくやりたいからやる。それ以外のことは考えないのが趣味だよ。 再現性がメリット
ならそれでいいじゃん
アセンブラを使うことで
高速化とか
リソースの節約とか
それもメリット
高速化もせず
リソースも変わらず
質が落ちる
だと何のためのアセンブラ? amd64+Linuxでアセンブラを始めたのですが、スタックの状態を勘違いしてのバグや
システムコール時のレジスタの退避し忘れのバグ等に悩まされてます
スタックの利用状況を分かりやすく表示してくれたり、レジスタの状態をチェックしてくれたり
するような、統合開発環境みたいなのはありませんでしょうか ■ このスレッドは過去ログ倉庫に格納されています