1read 100read
2011年10月1期プログラムアセンブリ言語最強伝説
TOP カテ一覧 スレ一覧 削除依頼 ▼
・ 次のスレ
画像ビュアー D言語をはじめるにあたって C#,C#の宿題片付けます。 C言語をやりたいんですが
アセンブリ言語最強伝説
1 :08/01/10 〜 最終レス :11/08/26 すべてのプログラムは最終的に機械語に変換されてから実行される。 よって機械語と1対1に対応しているアセンブリ言語はどんなものでも書けることになる。 ゆえにアセンブリにできないことはない。
2 : 60FE
3 : で?
4 : 今頃汎用PCの機械語がチューリング完全なことに気付くなよ
5 : 何をいまさら言っているんだ。
6 : CPUに出来ないことはできない
7 : 現在は必ずしも最強ではない JITのようにCPUに合わせた最適化が出来ない
8 : >>1 √ ̄ヽ--ヘ / ☆ ヽ 0く━=ニニ二> //(●) (●) \ / ヘ (__人__) | ■■ 自宅警備員へお知らせ! ■■ /ヽノ彡,,.. .|∪| / / 丿,, /\ヽノ/ゝ 丶 2008年1月11日午前6時(日本時間)より (  ̄jヽ,/_l ヽ 「2ちゃんねる」が12時間にわたって停止 \ ____ ̄{。 _____ } します。自宅警備を強化し待機せよ。 ヽ、,,_, {---} }。 {---} j http://www.maido3.com/server/
9 : nihonngo
10 : コンパイラぐらい書けよ
11 : 今日友達と雑談してたんだけど、 「俺はwikiができる前からwikiと同じものを作って使ってたんだぜ」 って言ったんだよ。 そしたらなぜか、wikipediaを作ったのか、すげーな、って言われちまったよ。 で、wikiについて説明してもwikipediaと同じだと思い込んでるらしく、 一般人ってなんで物知らずなんだろう、 と思ってしまった俺のほうがやっぱりおかしいんだろうか?
12 : >>7 俺の脳の方が凄いと思うよ よって、アセンブリ最強
13 : >>7 馬鹿? 機械的な最適化が貧弱だからアセンブラで書くんだろうが。
14 : >>6 CPUで腕立て伏せしてみろよ
15 : IA64をハンドアセンブルしてる俺様は最凶
16 : まあ、使う人間側のリソースが無限大と仮定すれば最強というか、同等だろうな。
17 : 最強伝説… アセンブリ言語が死んで終わるって話だな。
18 : >>! で? コードためしにアップしてよ
19 : mov ax,1 mov ah,3
20 : >>18 >>!
21 : スキルによって性能がバラバラ過ぎてアセンブラなんか使えない
22 : 昔>>1 見たいな事言って高級言語プログラマたちに物申したアセンブリプログラマがいたよね
23 : >>7 自己最適化させればいいだけだろ
24 : 低級脳には低級言語がお似合いだぜ
25 : どんな分野で働いてるの?
26 : WEBアプリ
27 : 最強だが汎用性がない
28 : "最強"の定義が不明瞭な件はどう説明するのか
29 : なんとアセンブラを使えばJavaバイトコードも出力できます!
30 : アセンブリでOSを作れるの?
31 : 作れます。ごく簡素なOSなら、アセンブラで書いたほうが手っ取り早いくらいです。
32 : 作ってみたい・・・ どうやったら作れますか?
33 : >>32 適当なワンボードマイコンの開発環境一式を入手して、只管マニュアルを読む。 それに関わる情報をWebなりなんなりで入手する。 入手した情報を元に試行錯誤を繰り返す。 諦めて既存(あるいはサンプル)のOSのソースを読む。 利用できるところは利用して更に試行錯誤する。 挫けて開発環境一式を仕舞い込んでなかったことにする。
34 : >>1 最後まで書ききれる根性があればの話だがな。
35 : >>32 割と最近に30日でOS作るとかいう本が出てたから、ネットや書店で買ってそれをやってみればいいよ 雰囲気とかつかめると思う 実用のOSとは程遠いだろうけど ひげぽんという人は2chで質問しながらモナOS作ったぞ
36 : HOW TO 本を紹介すんのかよ・・・
37 : いいんじゃね どうせbootローダかFATあたりで飽きるだろ
38 : なんでOSを作りたいかを明確にしないと挫折する気が
39 : アセンブリ言語でメモリの参照をするにはどうすればいいんですか?
40 : >>39 ロードする。
41 : 入れる、出す 押す、引っ張る 裏返す、交換する 増やす、減らす 足す、引く ずらす、回す 削る、重ねる 比べる 飛ぶ、繰り返す 呼ぶ、戻る なんだ覚えることはこれだけか
42 : イン・アウトまで読んだ
43 : 覚えることはたった8つだ。 > ポインタをインクリメントする < ポインタをデクリメントする + ポインタが指す値をインクリメントする - ポインタが指す値をデクリメントする . ポインタが指す値を出力する , 1バイトを入力してポインタが指す値に代入する [ ポインタが指す値が0なら、対応する ] までジャンプする ] ポインタが指す値が0でないなら、対応する [ にジャンプする
44 : 4つのもある Hコマンドは文字列"Hello, world!"を出力する。 Qコマンドはプログラムのソースコードを出力する(参考:自己出力プログラム)。 9コマンドは『99 Bottles of Beer』(アメリカの数え歌で、プログラミングの例題でよく利用される)の歌詞を出力する。 +コマンドはアキュムレータをインクリメント(1だけ増やす)する。
45 : EX4B START LD GR0,=0 LD GR1,=0 LOOP1 CPA GR1,NUM JZE FIN ADDA GR1,=1 LD GR2,GR1 LD GR3,=0 LOOP2 ADDA GR3,GR1 SUBA GR2,=1 JNZ LOOP2 ADDA GR0,GR3 JUMP LOOP1 FIN ST GR0,TOTAL RET NUM DC n TOTAL DS 1 END の結果はどうなりますか??
46 : EX4B START LD GR0,=0 LD GR1,=0 LOOP1 CPA GR1,NUM JZE FIN ADDA GR1,=1 LD GR2,GR1 LD GR3,=0 LOOP2 ADDA GR3,GR1 SUBA GR2,=1 JNZ LOOP2 ADDA GR0,GR3 JUMP LOOP1 FIN ST GR0,TOTAL RET NUM DC n TOTAL DS 1 END の結果はどうなりますか??
47 : GNU as が受け付けるアセンブリや gcc -S が出力するアセンブリに関する質問はどのスレでやればいいの? アーキテクチャは x86 や x86_64 でいいんだけど…
48 : 取り敢えずここでどうぞ。
49 : 次のプログラムの空欄を埋めて、メモリに格納されたデータの最大値を求めるプログラムを完成させてください。ちなみに空欄とはうえの3つの;の所を指しています。 EX4C START ; ; ; FIN ST GR1,MAX ;最大値をメモリに格納 RET NUM DC 10 ;データの個数 DATA DC 60,80,70,50,90 DC 40,50,80,100,90 MAX DS 1 ;最大値格納用領域 END
50 : gcc -S のコンパイル結果で . から始まるキーワードの意味がことごとく分からないんだけど 何の資料を漁ればいいんだろうか? .LFE14: .size main, .-main .section .eh_frame,"a",@progbits .Lframe1: .long .LECIE1-.LSCIE1 .LSCIE1: .long 0x0 .byte 0x1 .string "zR" .uleb128 0x1 .sleb128 -8 .byte 0x10 .uleb128 0x1 .byte 0x3 .byte 0xc .uleb128 0x7 .uleb128 0x8 .byte 0x90 .uleb128 0x1 .align 8 .LECIE1: .LSFDE1: .long .LEFDE1-.LASFDE1 .LASFDE1: .long .LASFDE1-.Lframe1 .long .LFB13 .long .LFE13-.LFB13 .uleb128 0x0
51 : >>50 gccとgas
52 : >>51 いあそうなんだけど info gas とか info gcc とか見れば分かるの?
53 : 訊く前に見るだろ,普通
54 : uleb128以外は見た瞬間に判るだろ
55 : どこで聞いていいか分かりませんけど、 WCASLUについての問題です。 アドレスx,x+1,x+2の内容をそれぞれアドレスy,y+1,y+2に格納するプログラムを完成せよ。 が分からないので教えてください。 習ったコマンドはLD,LAD,ST,DC,DSくらいです。 自分の考えで作ったのは アドレスx,x+1,x+2の内容をそれぞれGR0,GR1,GR2に格納したものです。 これを使って作れないですかね・・・ よろしくお願いします。 START LAD GR7,0 LD GR0,X,GR7 LAD GR7,1,GR7 LD GR1,X,GR7 LAD GR7,1,GR7 LD GR2,X,GR7 RET X DC 10,20,30 END
56 : >>55 です。 自己解決しました。
57 : (x86で)1命令でeaxの値に1を加算する方法を4つ挙げよ みたいな問題を先輩に出されたんだが、2つしかわからん。 add eax,1 inc eax の他に何があるだろう?
58 : 3. lea 4. -1をsub かなあ。
59 : なるほど、 lea eax,[eax+1] sub eax,-1 か。 thx
60 : C/C++/Javaやそのほかの言語も全てCPU命令を基にした アセンブラで出来てるんだから、 どんな複雑なAPIも結局はその組み合わせでしかないと思って アセンブラの勉強を始めたら、 ノイマンモデルからやり直しになっちゃった('A`) でもこういうのは楽しいね。
61 : またそういうことを
62 : IDAの使い方を日本語学びたいです。
63 : どうも、井田です。
64 : 前スレ http://pc12.2ch.net/test/read.cgi/tech/1172916032/
65 : なんとも厨くさいスレタイだけど、ここを使うしかないか
66 : いちおう「アセンブラ」ってスレも過去あったんだけどね。 Part13 が即死して放置されてる。 Part13.1 で立て直す?
67 : 有効利用で行きましょうよ。
68 : >>66 せめてプログラム板では アセンブラではなく 正しいアセンブリ表記にしようぜ
69 : 何がどう正しいんだ? アセンブリ言語の処理系がアセンブラだろ?
70 : >>69 assembly languageと書かれることが多いし、一般的にその方が正しいと思う人が 多いと思うが、IBMの社員はassembler languageって言うんだよな。
71 : アセンブリっていうと言語っぽいが、アッセンンブリーというと自動車の部品みたい
72 : アッセンブル、アッセンブリは組み立てや実装の時に使うな。
73 : >>69 それが常識だよな っていうか英語がわかればそのまんまだし >>70 さすがIBM社員 プログラム知識はまるで駄目だな
74 : IBMの用語は妙だったりすることはあるが、 方言ってだけでプログラミングと関係はないだろう。
75 : CASLはアセンブラ言語
76 : 質問です。自力で解決しようと努力しましたが、万策尽きました…。 5日以上PC-9801の前に張り付いて、アタマがおかしくなってきました。 2レスに分けますが、識者の方、よろしくお願いします。マジで台湾料理屋で腹壊しましたOrz 【行ないたいこと】 PC-9801のサウンドBIOSを任意のRAM領域にコピーしたい。PC-9801(26K互換FM)サウンドBIOSの アドレス等は一意であり、セグメント:オフセットアドレス表記で、 0cc00h:2e00h の場所から 16kbの領域を占有する。2e00hから最初の3ワードは、0001h、0000h0、00d2hとなっており、これの 検出の可否でサウンドROMの存在を確認できる。 【やってみたこと】 PC-9801RS21(80386SX 16MHz 6.6MB RAM)上のNASM 2.06rc10にて、以下のような方針で アッセンブルしてみた。転送先の初期化済みバッファ(00h x 8バイト)をsbuffとして確保し、 rep movsb命令でサウンドROM BIOSの最初の6バイトを転送してみた。その後DOSへの復帰前に word [es:0cc00:2e00h+4]と00d2hが一致することまでは確認済み。ただ、word [es:sbuff+4]と 00d2hがcmpで一致しないんです。ここが問題。 【特記事項】 DOS 6.2のEMM386.EXEによりEMSメモリのページフレームがC0000hから確保されるので、 現状では実行および検証はリアルモードで何も組み込まない状態(F5起動)で行なう必要がある。 EMS対応は将来の課題である。なお、上記PC-9801RS21に標準ではFM音源は存在しないが、 互換ボードにて検証している(FM音源として、正常に機能し、拙作ツール・ゲーム等にて音も鳴る)。
77 : 実際のコードです。 ; PC-9801 26K compatible Sound BIOS copy tiny program ; Programmed by Yamato_Damashii 2009-06-19 for NASM 2.06rc10 [Bits 16] org 100h ; COM program start: push es push ds mov ax, 0cc00h ; Start of Segment Address of Sound BIOS mov es, ax push es pop ds mov bx, 2e00h ; Start of Offset Address of Sound BIOS lea si, [es:bx] lea di, [sbuff] mov cx, 8 rep movsb ; 一応movsbに(rep movsw 4を使いたいが安全のため) CompareWithOriginal: cmp word [es:bx+4], 00d2h jne FailedCpyRom ; これは通過する。当たり前か。 cmp word [es:sbuff+4], 00d2h jne FailedCpyRom ; ;ここで失敗。根本的に勘違いしているのだろうか…。上の[es:sbuff+4]と00d2hの 比較を取っ払えば、「成功しました」と判断される。ちなみに、EMS配下で実行すると暴走する ;以下、成功・失敗のメッセージ表示、POP DS/POP ES/終了処理など。 section .data ... times 8 db 0
78 : プログラムをこれから始めようと思っているのですが、まず 何からはじめたら良いですか?
79 : es:sbuffが何処を指しているか理解しろ
80 : 基本的なことから教えてください。
81 : アセンブラで勉強したいなら、 最初はシンプルなCOMファイルでの勉強がおすすめ しかし、環境構築が大変かもしれn
82 : >>79 すいません、 section .data sbuff: times 8 db 0 の間違い。 で、ちょうどCで char sbuff[8]; としたみたいなものです。確保したsbuffが実際にメモリ上のどこにあるかは判らないです。 判らないのは、Cでも同じでしょう。MASMだと dup/db系の擬似命令で行なうのだと思いますが。
83 : セグメントレジスタの値をトレースすればわかると思う。
84 : >>83 なるほど。やってみます。あと、TASM(BCC 日本語版 v3.1付属)でも 同様のコードを書いてみようと思います。アドバイスありがとうございました。 Tracing the value of the segment registers, right? Thx !!
85 : アセンブラってすげー簡単だよな。 Cを20年勉強しても使えるようになれなかったけど アセンブラは一週間もかからず使えるようになった。
86 : はい、嘘つきが湧きました。
87 : 使えるようになっただけで使いこなせてはいないんだろ
88 : むしろC言語を20年かけて覚えられない方が 本当だったら感心するわ
89 : おまいら釣られすぎだろ
90 : アセンブリというよりマシン語での事なんだけど IA32でのJcc系列に対する2Eまたは3Eのプリフィクス・コードってどんな意味があるの? 実際に動かしてみても動作には影響しないよね? デベロッパ・マニュアルに書いてあったを見てから気になってしまって
91 : >>90 分岐予測のヒント
92 : 結局、レジスタレベルでの違いは無いという事ですかね。 難しい。
93 : 2E/3Eって、セレクタのプレフィックスじゃね? (i286まではセグメントオーバーライドプレフィックスつってた奴)
94 : >>93 今もsegment override prefixと言ってるような気がするが。 で本題だが、そのprefix byteは普段はそういう意味なんだが、 分岐命令の前にくるとヒント情報として解釈されるという… 泥沼泥沼
95 : 間接ジャンプ時は通常通りsegment override 2E+Jccの時は条件が成立しない確率が高い事をCPUに知らせるためのヒント 3E+Jccの時は条件が成立する確率が高い事をCPUに知らせるためのヒント 他の分岐命令との組み合わせは予約済みとIntel 64 and IA-32 Architectures Software Developer's Manual Volume 2A: Instruction Set Reference, A-Mにちゃんと書いてある どのCPUから有効かなどの情報はないが
96 : 16ビットと32ビットのニーモニック/機械語の対応って同じなんでしょうか? windowsのdebugコマンドでは mov eax,1みたいなのが使えないので これは16ビットのアセンブラってことですよね
97 : 386以上のCPUなら16bitリアルモードでもEAXは使える DEBUG.EXEは元々DOS用のデバッガだから対応してないだけ
98 : すいません、先日はありがとうございました。まだ未解決ですが(--; ところで、入門書・入門サイトの類いの冒頭にかならずと云っていいほど 載っている"Hello, World!"のDOS画面表示プログラムですが、 大半の入門書、また実際のコードを見ても、流れは ・dxレジスタにメッセージ文のあるオフセットアドレスを代入 ・AH=09H / INT 21Hのfunction callにより、コンソールに表示 となっていますが、ほとんどのケースで mov dx, offset err_msg ; [MASM表記] mov dx, err_msg ; [NASM表記] ですね。先日PC-98の小物ツールのソースを読んでいたら、dxレジスタへのアドレス代入に lea dx, [err_msg] ; [NASM表記] となっているものがありました。実際にアッセンブルすると1バイト余分に食ってしまい、 たとえばAH=09Hファンクションが4箇所あれば、4バイト分実行バイナリ(COMファイル)が 大きくなってしまっています。この場合、mov dx, offset ではなく、lea命令で代入するのは、 擬似命令のoffsetを使いたくない、という理由ではないですよね??ご教示ください。 あとエラーメッセージやUsageの表示に、AH=40H/BX=0001Hのfunction callを用いる利点と欠点を ご教示ください。数バイト分バイナリが大きくなってしまうのですが、意味が無いでしょうか??
99 : 追記申し訳ない。 AH=40H / BX=0001H でのコンソール出力は、ファイルハンドラを用いて 書き出していたり、戻り値の判定等で、AH=09Hのそれとは厳密さの点で異なるという 理解で大丈夫でしょうか?
100read 1read
1read 100read
TOP カテ一覧 スレ一覧 削除依頼 ▲
・ 次のスレ
画像ビュアー D言語をはじめるにあたって C#,C#の宿題片付けます。 C言語をやりたいんですが