トップページ⇒tech
553コメント156KB

アセンブリ言語最強伝説

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2008/01/10(木) 17:03:37
すべてのプログラムは最終的に機械語に変換されてから実行される。
よって機械語と1対1に対応しているアセンブリ言語はどんなものでも書けることになる。
ゆえにアセンブリにできないことはない。
0153デフォルトの名無しさん2009/08/01(土) 15:13:13
>>151
最後の行、論理シフトだから「等価」と違うと思うよ。
0154デフォルトの名無しさん2009/08/01(土) 17:17:53
>>151
解説ありがとうございます
>>152
CPUはCore2 DuoのE8600を使っています
0155デフォルトの名無しさん2009/08/01(土) 18:30:47
データシートは熟読するものじゃねえと思うデスよ。
あれは辞書と同じで使いつつ覚えるもの。
0156デフォルトの名無しさん2009/08/01(土) 20:23:06
メモリ構造とアルゴリズムを直接リンクできる唯一の言語
0157デフォルトの名無しさん2009/08/01(土) 20:25:59
>>156
言っちゃ悪いが意味不明だ。
0158デフォルトの名無しさん2009/08/01(土) 20:30:46
いくらアセンブリ言語と言えども、それ自身が入出力をすることはできない。
できるのは、OSに指示を出すだけだ。またはハードウェアに。
0159デフォルトの名無しさん2009/08/01(土) 20:33:33
データシート熟読するのは組み込み系のプロセッサだろう。
0160デフォルトの名無しさん2009/08/01(土) 20:41:21
>>158 のほうが意味不明だな

>>156 はスレッデッドコードみたいな技法のことを言いたいんだろうか?
0161デフォルトの名無しさん2009/08/01(土) 20:48:46
なんだそれw
超エスパーだなw
0162デフォルトの名無しさん2009/08/02(日) 13:55:35
アセンブリでOSのAPI使えんの?
0163デフォルトの名無しさん2009/08/02(日) 13:56:41
当然出来る。
0164デフォルトの名無しさん2009/08/02(日) 14:07:04
>>162
int割り込みでコンソールIOってのが一番分りやすい例かも。
アセンブリ言語以外の言語でいうAPIとはかなり毛色が違うが、これもAPIの一種…というかAPIの元ネタだよな。

Windowsとかでも、カーネルモードへの入り口としてSYSENTERって形で残ってる。
ラッピングされてて普通は触らないというか触れないが。
0165デフォルトの名無しさん2009/08/02(日) 14:55:07
今時のOSなら単純にcallすればいい。
0166デフォルトの名無しさん2009/08/02(日) 14:59:09
Linuxだとsyscall番号と引数をレジスタに設定してint 0x80で
システムコールを発行できる。
0167デフォルトの名無しさん2009/08/02(日) 15:04:39
>>166
それって何の意味があるの?
callと比べて
0168デフォルトの名無しさん2009/08/02(日) 15:12:54
callと比べる意味ってどこにあるの?
0169デフォルトの名無しさん2009/08/02(日) 15:18:11
>>167
>それって何の意味があるの?
そうゆう決まりになってるから
0170デフォルトの名無しさん2009/08/02(日) 15:21:02
>>167
callだとlibcをリンクしないといけないだろ。
少しは自分の頭で考えろよ。
0171デフォルトの名無しさん2009/08/02(日) 15:31:21
ああ納得w
linuxのABIは酷いからな
それらに影響されたくなかったわけか
0172デフォルトの名無しさん2009/08/02(日) 17:08:26
スタティックリンク前提の方が醜くね?
0173デフォルトの名無しさん2009/08/02(日) 17:09:50
だからそう言ってるのか。
0174デフォルトの名無しさん2009/08/02(日) 17:49:30
linux板住人も酷すぎる
0175デフォルトの名無しさん2009/08/02(日) 22:17:55
int で呼んでるのは別にLinuxだけじゃないんだが
0176デフォルトの名無しさん2009/08/02(日) 22:26:52
でもlinuxが酷いことに変わりはないよね
0177デフォルトの名無しさん2009/08/02(日) 22:45:13
元々BIOSからしてint呼び出しになってたし
DOSもそうだった。

386BSDは確かコールゲート経由だったが
それ以外は多くがintだな。
今は結構sysenterになってるみたいだが。

例えばNT系のWindowsも、システムコールはint2Eだという話を聞いた覚えがある。
信憑性は知らんが。

その手のシステムコール呼び出しを
POSIXならopen()というAPI、Win32ならCreateFile()というAPIとして公開している、という点では皆同じ。
0178デフォルトの名無しさん2009/08/03(月) 00:31:18
ToolBoxはAライントラップだったっけ。
0179デフォルトの名無しさん2009/08/03(月) 01:47:42
酷いって何が酷いんだ?馬鹿じゃないの?
0180デフォルトの名無しさん2009/08/03(月) 02:04:21
NTのint2Eの呼び出し
http://www.ctyme.com/intr/rb-4249.htm

NT/2Kなら、これで直接呼び出すことも出来るはず。
パラメータの説明が無いから殆どは無理だろうけどね。
sysenterに移行したXP以降でもint2Eのインターフェースが残っているかは知らない。
0181デフォルトの名無しさん2009/08/03(月) 02:36:18
XPはsysenterをサポートしてないCPUでも動くっぽいからint 2Eはサポート
してるはず。

LinuxでもCPUに応じてsysenterやsyscallを使える。
0182デフォルトの名無しさん2009/08/05(水) 06:24:33
NOPさん
今日は何をするのかな〜

「ウホホホホウホ」
おやおや
ゴン太くん
今日も張り切ってますね


0183デフォルトの名無しさん2009/08/06(木) 21:12:03
>>166,167,168

これって、カーネル2.25辺りまでしか使えないのでは?
カーネル2.30ではこの仕様ではないですよね?


>Linuxだとsyscall番号と引数をレジスタに設定してint 0x80で
>システムコールを発行できる。
0184デフォルトの名無しさん2009/08/06(木) 22:21:17
いつのまにそんなすごいバージョンのカーネルが出たの?
0185デフォルトの名無しさん2009/08/07(金) 01:34:01
システムコール使えなかったらどうやってカーネルモードとユーザーモードの橋渡しするんだよ…
ロクな事にならねぇぞ
0186デフォルトの名無しさん2009/08/07(金) 01:39:59
その「システムコール」とsyscallは意味がちょっと違う。
0187デフォルトの名無しさん2009/08/07(金) 03:03:32
>>183
アホか?使えるに決まってるだろ。使えないと思う理由は何だ?
0188デフォルトの名無しさん2009/08/22(土) 18:58:58
書いた本人ですら理解しかねるようなアセンブリコードで
オープンソースとか嫌がらせ以外のなにものでもないよ
0189デフォルトの名無しさん2009/08/22(土) 19:39:38
ageるのは馬鹿ばかりだな
0190デフォルトの名無しさん2009/08/22(土) 20:58:04
>>188
おっとGNUやLinuxの悪口はそこまでだ。
0191デフォルトの名無しさん2009/08/23(日) 03:13:42
アセンブラはソースにインデントがないから楽だよなあ。
インデントのある言語は、そこで俺の思考も一緒にインデント
されてしまうから、思考が続かないんだ。
0192デフォルトの名無しさん2009/08/23(日) 05:23:37
大抵は思考を分割しないと内容を把握し辛いからインデントしたり関数分割するのだと思うが、191は分割が苦手な変わりに直線的に広大な範囲を把握できるって事なのか…?
それはそれで凄いのだろうが、書いたソースを読みたくないな。
0193デフォルトの名無しさん2009/08/23(日) 05:37:29
改行のないレスも読みたくないな
0194デフォルトの名無しさん2009/08/23(日) 05:44:09
>>191は配置転換でいきなりPythonを使わされることになったコボラー
0195デフォルトの名無しさん2009/08/23(日) 07:11:47
BASIC−アセンブラとやってきて、現在はコボラーだけどね。
COBOLも、制御構造が導入されてから読みにくくなった。
インデントが多くなったし、外PERFORMでやたらと処理を外出しするので
飛んでから戻ってくるのが大変だ。
やっぱアセンブラだね。
アセンブラが主流の開発現場ってどういうのがあるんだろう。
天職に転職したい、なんちて。
0196デフォルトの名無しさん2009/08/23(日) 07:38:04
アセンブラもインデントする
外出しもする
0197デフォルトの名無しさん2009/08/23(日) 09:27:27
>>195
4bitCPUとかならアセンブラが主流。
つうかそれ以外の選択肢がない。
0198デフォルトの名無しさん2009/08/23(日) 09:41:41
AVRでgccバリバリ使ってますが
最適化-Osは結構アホなのでインラインアセンブラも使います
0199デフォルトの名無しさん2009/08/23(日) 11:01:26
>>195
 外出ししないのはBrainF*ckくらい
0200デフォルトの名無しさん2009/08/23(日) 14:30:22
アセンブラって外出しする構文あったっけ?
BASICで言うGOTOはあるが、GOSUBはないよね?
0201デフォルトの名無しさん2009/08/23(日) 14:43:34
CALLとかBSRとか
命令単体で無くても組み合わせでつくれるだろ
0202デフォルトの名無しさん2009/08/23(日) 14:45:20
>>200
お前アセンブリプログラミングしたことないだろ
GOSUBどころか関数呼び出しが出来るアセンブリ言語なんていくらでもある
0203デフォルトの名無しさん2009/08/23(日) 15:00:26
ホントかよ。
6502と68000をやっていたが、
戻り先を指定しないRETURN的な
構文はなかったような気がするぞ。
今のCPUは違うのか。

世の中の言語が俺に合わせてくれないなら、
自分で作るしかないな。
インデント禁止、分岐はラベル指定ジャンプのみ、
構造化なし、オブジェクト指向なし、ソース分割禁止、
変数はアルファベット一文字のみの俺言語を。
やってみるぜ!
0204デフォルトの名無しさん2009/08/23(日) 15:06:04
どちらもRTSというニーモニックでサブルーチンから戻る命令があるだろ?
おまえは何をやってきたんだ。
0205デフォルトの名無しさん2009/08/23(日) 15:09:17
これだからコボラーは・・・
0206デフォルトの名無しさん2009/08/23(日) 15:15:21
失礼だろうと思って書かなかったが、端にも棒にも掛からないくらいのアホでしたか。
しかもコボラ・・・

>>197
あと、ICカードレベルの極端に制約のある組み込み系と、カスタムLSI/CPUがある系もアセンブリ言語が結構必要な気がするんだが。
前者はメモリ容量と演算速度の制約があるから付加機能を持たせたかったらアセンブリ言語ナシだときつそうだし、後者はカスタムした命令セットの操作に必要になってくるだろう。
・・・インラインで済むかもしれないが。
0207デフォルトの名無しさん2009/08/23(日) 15:27:38
やはりコボラーは馬鹿なんだな
関数呼び出しも知らずに仕事でコーディングしてたと思うとぞっとするわ
0208デフォルトの名無しさん2009/08/23(日) 15:34:24
ハードウェアスタックがないのはIBMメインフレームの特徴だしな。
そっち方面一筋だったとしたらしょうがないかもしれない。
いちじるしく不幸だと思うが。
0209デフォルトの名無しさん2009/08/23(日) 16:39:36
>>203
これ、コボラですらないだろ。
煽りたがりの嘘つき中学生。
0210デフォルトの名無しさん2009/08/23(日) 17:05:40
>>203は煽りか、やっぱり。いい年したオヤジが「俺が」「やってみるぜ!」

…自分の親父と同世代だとすると、吐き気がするw
0211デフォルトの名無しさん2009/08/23(日) 17:45:44
>>204
RTS、調べてみたらあるね。
俺のいた職場では教えてくんなかった。なぜだろう。
まあどのみち使わないからいいんだけど。
では、これから理想の俺言語を作るからさらばだ。
C言語を勉強して、言語仕様を設計して・・・20年はかかるかな。
いいライフワークになりそうだ。
0212デフォルトの名無しさん2009/08/23(日) 18:00:12
> 俺のいた職場では教えてくんなかった。なぜだろう。
> まあどのみち使わないからいいんだけど。

んなわけねーだろ
0213デフォルトの名無しさん2009/08/23(日) 18:56:16
上司部下そろって向上心も技術力も無い職場だった、と。

やはりコボラは害にしかならないのですねー・・・
0214デフォルトの名無しさん2009/08/23(日) 19:49:35
関数ではなくてプロシージャと呼んで欲しい。
0215デフォルトの名無しさん2009/08/24(月) 02:56:49
元々は返却値があるのを関数、無いのは手続き/プロシージャ とか呼んでたよね。
(Fortranの時代) cでvoid型も関数と言うようになってから、関数と手続きの区別が曖昧に
なってきた。オブジェクト指向が登場して手続き型言語が叩かれるようになり、手続きという
単語そのものも嫌われるようになっていった。 くくり出しの概念自体は一緒なのにね。
0216デフォルトの名無しさん2009/08/24(月) 03:14:08
関数のvoidはvoid型を返す関数なんだよヴォケ
0217デフォルトの名無しさん2009/08/24(月) 08:24:26
昔の参考書とか、あと現在でも大学の一般教養レベルだとCのmain関数が

void main(void){
とか
main(){

で始まってたな。これって、86系アセンブラだとah=43h/int 21hのDOSファンクションコールで
alの値を指定しないのと、本質的に同じだよね。これはアセンブラの場合、容量とかの
都合で指定しなかったのか、戻り値をDOSに返すのはどうでもよかったのか?
いまでもアセンブラ解説サイトの大御所でたまに散見される。
0218デフォルトの名無しさん2009/08/24(月) 08:34:49
今時プロシージャとか使いたがる奴は確実にオッサン
0219デフォルトの名無しさん2009/08/24(月) 10:24:48
DOSへ返す戻り値は重要じゃないな。バッチファイルでエラーコード見て分岐とか
ほぼ使わないし。連続して処理を繰り返すなら復旧可能なエラーでプログラム終了
させてDOSへ戻るなんて馬鹿馬鹿しい。続行不可能なエラーならエラーコード吐いた
ってOSが後始末してくれるわけじゃないし。自前で後始末しなけりゃいけないなら、
エラー処理もプログラム内でやって、続行不可能になったらエラーメッセージ吐いて
abortした方がいい。

というか、正常終了で0を返さないと誤動作する糞OSってあんの?
0220デフォルトの名無しさん2009/08/24(月) 10:55:35
>>217
Cで返り値の型を省略したら普通は整数型として扱われる
02212172009/08/24(月) 11:31:30
>>219
というか、
mov ah, 4ch
int 21h

とするのと、
mov ax, 4c00h
int 21h

とするのとで、ものすごく手間とかバイト数が増えるわけでも実行クロックが増えるわけでも
ないのに、alの値を省略するのが理解できない。「洗練されたコード」を目指すにせよ
そうでないにせよ。他のルーチンはちゃんと書いてるのに、最後いきなりahのみ
ぶち込んでOSに戻るのか、と。DOSが糞かどうかより、後先考えてなかったのかな?

「立つ鳥あとを…」派より「あとは野となれ…」の人が多かったのか、
実はAX=4C00H派は普通にいたのか。

Cの場合はANSIがらみだよね。ANSI以前の参考書で正常終了時のmain関数の戻り値を
return 0;
でDOSに戻すコードはあまりなかった、自分のみた範囲では。
0222デフォルトの名無しさん2009/08/24(月) 11:54:35
元々数学の意味では副作用がないのが関数なんだから、
最初から用語の意味はブレてたんだよ。

void main は、

仕様書読まずに教科書を書くバカがいた、でファイナルアンサー。
少なくともANSI以後については。
0223デフォルトの名無しさん2009/08/24(月) 11:57:33
アセンブリ言語系の話題のサイトで見かけるのは、
そういう人たちはC言語の仕様をどうでもいいと思ってる
(仕様なんかどうでもいい、コンパイラの動いた結果が全て)
という人がいるせいかもしれない。
0224デフォルトの名無しさん2009/08/24(月) 12:46:04
数学のfunctionは函数だから、関数はぜんぜん違う物だと思えばいい。
っていう意見もあった。
逆にC言語の話してるのに函数だって譲らない人もいた。
ま、いろいろ。
0225デフォルトの名無しさん2009/08/24(月) 13:01:59
そのロジックだとHaskellとその近辺は函数型言語
Lispとかは関数型言語という使い分けができるな。
0226デフォルトの名無しさん2009/08/24(月) 13:04:03
スレ違いもいい加減にしろ
0227デフォルトの名無しさん2009/08/24(月) 17:26:50
参照しないんだから値は不定でいい。
だからmov ah, 4chでいい。
0228デフォルトの名無しさん2009/08/24(月) 19:55:57
DOS使ってた頃はERRORLEVELやmakeで参照しまくりだったがなぁ
0229デフォルトの名無しさん2009/08/24(月) 19:57:33
>>219
誤動作はしないが、一々警告が出るOS(正確にはGUI型コマンドインタプリタ)は実在した。
0230デフォルトの名無しさん2009/08/24(月) 19:57:44
DOSだとかジジイばっかりだな
0231デフォルトの名無しさん2009/08/24(月) 20:02:03
>>227
だったらいっそ int 20h か ret でいいじゃない。
0232デフォルトの名無しさん2009/08/24(月) 20:55:41
>>217
int main(void)
は正しいだろうけど
void main(void)
はとても有名な間違いで、本来は違反じゃなかったか
それに型省略は暗黙でintってのが(C++には無いけれど)Cには有ったはず
>>218
MSDNでもそこかしこにプロシージャという単語やその名残が有ると思うんだが
でも関数の方が呼びやすいのでそう読んでる自分
>>219
Makeとかその辺の奴に食わせる場合は戻り値必須。
コンパイラとかもちゃんと値返してるんだぞ
>>221
void mainとか、C「言語」とかと同じで、間違いの文化の中に居るのさ〜
0233デフォルトの名無しさん2009/08/24(月) 21:22:40
>>232
> void main(void)
> はとても有名な間違いで、本来は違反じゃなかったか
つc99
0234デフォルトの名無しさん2009/08/24(月) 22:16:57
でも型を規約で無意味に強制されると
無限ループで戻らない処理では論理が破綻するからやめてほしい。
戻らないんだから値は返しようがない。
0235デフォルトの名無しさん2009/08/24(月) 22:30:15
void main(void){
 int a=0;
 printf("%d", a);
}

このときのALはprintfの戻り値
0236デフォルトの名無しさん2009/08/24(月) 23:44:49
>>233
C++では、「return 0; の省略」は許されるけど、
「void main()」が許されているわけじゃない、というのは俺も知ってる。

C99はよく知らないけど、
C++とは違って void main() も許されるようになったのか?
0237デフォルトの名無しさん2009/08/24(月) 23:50:21
少なくとも、その間違いを喧伝していた絶頂期にはC99は存在しない。

>>235
実際やればそうなることが多い気はするけれど、保証動作では無いような・・・
0238デフォルトの名無しさん2009/08/25(火) 03:07:13
俺、組み込みばかりだから void main(void) がもう刷り込まれちゃってるよ。
出るのはmainからじゃなくて、電源断がNMIにつながってるときだけだし。
0239デフォルトの名無しさん2009/08/25(火) 07:36:08
>>238
組み込みならスタートアップ指定するだろ
mainなんてわざわざ呼んでたら復帰アドレス分のスタックがもったいない
0240デフォルトの名無しさん2009/08/25(火) 07:45:01
printfの戻り値w
0241デフォルトの名無しさん2009/08/25(火) 07:56:14
まあcall mainじゃなくてjmp mainだよな
大抵のスタートアップコードはアホだから修正が必要だ
0242デフォルトの名無しさん2009/08/25(火) 08:01:59
 stack+1してからcallmain
0243デフォルトの名無しさん2009/08/25(火) 08:18:54
bra _main
0244デフォルトの名無しさん2009/08/25(火) 09:20:32
関数の戻す型は、関数の脱出処理だけでなく、
関数の呼び出し処理にも関係がある。

だから、戻らない関数だから関係ない、とは言えない。
0245デフォルトの名無しさん2009/08/25(火) 10:10:59
PICのスタックは8段しかない
0246デフォルトの名無しさん2009/08/25(火) 11:47:28
8bitなPICでC言語を使うのが間違っているような気がしないでもない。
0247デフォルトの名無しさん2009/08/25(火) 12:22:55
kwsk
0248デフォルトの名無しさん2009/08/25(火) 12:32:14
PIC18やAVRなら実用的だよ
PC16以下は死んでいい
0249デフォルトの名無しさん2009/09/22(火) 16:01:47
HALT ?
0250デフォルトの名無しさん2009/09/22(火) 16:03:41
nop
nop
nop
nop
.
.
.
0251デフォルトの名無しさん2009/09/23(水) 14:43:34
最終的に機械と同化してしまい
こちらの世界に戻れなくなるぞ
0252デフォルトの名無しさん2009/09/23(水) 16:48:40
  mov eax,cr0
  or eax,1
  mov cr0,eax
  jmp @@tengoku
@@tengoku:
■ このスレッドは過去ログ倉庫に格納されています