1 名前:デフォルトの名無しさん [2006/05/24(水) 01:43:34 ] アセンブラ全般に関するスレッドです。 【前スレ】 アセンブラ… ヽ(゚∀゚)ノフォーウ! pc8.2ch.net/test/read.cgi/tech/1132761638/ 過去ログは>>2 辺り
441 名前:デフォルトの名無しさん mailto:sage [2006/08/30(水) 10:08:45 ] >>440 わかっているくせに
442 名前:デフォルトの名無しさん mailto:sage [2006/08/30(水) 19:27:08 ] >>441 キョン君のこと好きなんでしょ
443 名前:デフォルトの名無しさん mailto:sage [2006/08/30(水) 20:12:51 ] でも象さんの方がもっと好きです
444 名前:デフォルトの名無しさん mailto:sage [2006/08/30(水) 23:55:52 ] にら
445 名前:デフォルトの名無しさん mailto:sage [2006/08/30(水) 23:58:34 ] れば
446 名前:デフォルトの名無しさん mailto:sage [2006/08/31(木) 00:01:32 ] かゆ…
447 名前:デフォルトの名無しさん mailto:sage [2006/08/31(木) 00:06:38 ] うまい、うますぎる。
448 名前:デフォルトの名無しさん mailto:sage [2006/08/31(木) 01:43:30 ] 風が語りかけます。
449 名前:デフォルトの名無しさん mailto:sage [2006/08/31(木) 06:09:19 ] アッー!
450 名前:デフォルトの名無しさん mailto:sage [2006/08/31(木) 11:47:38 ] 十万行アセンブラ
451 名前:デフォルトの名無しさん mailto:sage [2006/08/31(木) 14:04:48 ] おえーおえー
452 名前:デフォルトの名無しさん [2006/08/31(木) 19:25:35 ] eax:edx の内容を mm0 に転送するにはどう書いたらいいんでしょうか?
453 名前:・∀・)っ-○◎●新世紀ダンゴリオン ◆DanGorION6 mailto:sage [2006/08/31(木) 23:18:23 ] movd mm0, eax movd mm1, edx punpckldq mm0, mm1
454 名前:デフォルトの名無しさん [2006/09/01(金) 08:32:02 ] VC6 で アセンブラの pmovmskb 命令を使用するにはどうしたらいいんでしょうか?
455 名前:デフォルトの名無しさん [2006/09/01(金) 08:47:59 ] つ[VC2005 Express]
456 名前:デフォルトの名無しさん mailto:sage [2006/09/01(金) 08:57:19 ] 2500バイト未満のMessageBoxのMZってどうやって作るんですか?
457 名前:デフォルトの名無しさん mailto:sage [2006/09/01(金) 09:44:06 ] >>456 アセンブラでMessageBox呼び出しだけでどうやったら2499バイトを超える事ができるのかが逆に疑問だ
458 名前:デフォルトの名無しさん mailto:sage [2006/09/01(金) 09:56:15 ] 表示するメッセージが2500バイト以上なんだろw
459 名前:デフォルトの名無しさん mailto:sage [2006/09/01(金) 10:38:37 ] それだ!
460 名前:デフォルトの名無しさん [2006/09/08(金) 11:39:40 ] gas/i386で pushl %ds こういう命令が書かれてたとき、 スタックポインタに加算される値は2?それとも4?
461 名前:デフォルトの名無しさん mailto:sage [2006/09/08(金) 12:14:16 ] 4に決まってるだあ
462 名前:デフォルトの名無しさん mailto:sage [2006/09/08(金) 12:29:38 ] さんくすこ
463 名前:デフォルトの名無しさん mailto:sage [2006/09/20(水) 19:19:17 ] 『独習アセンブラ』で、今日からやりだした超初心者なんですけど、 x86系Linuxのnasmで ”1”の文字 一文字表示しようと思うのですが、 $ nasm -f elf hajime.asm $ ld -s -o hajime hajime.o でアセンブルもリンクも問題なくできるのですけど、 $ ./hajime [Enter] $ セグメンテーション違反です って表示され叱られてしまいました! どなたかご教示願いないでしょうか。 ソースは以下のようになってます。nasmは、 nasm-0.98.39を使ってます。 global _start _start: mov eax, 31h ; 文字 "1" push eax ; スタックにバッファを設定 mov eax, 4 ; 出力(sys_wrigte) mov ebx, 1 ; ファイルハンドル(1=標準出力) mov edx, 1 ; 1文字出力することを指定 mov ecx, esp ; 書き込むバッファ int 0x80 ; 出力する pop eax
464 名前:デフォルトの名無しさん mailto:sage [2006/09/20(水) 20:15:23 ] プログラムの終端でのエラーではないでしょうか。 最後にプログラム終了の命令を追加してみてください。 mov eax, 1 ; sys_exit mov ebx, 0 ; 終了ステータスコード int 0x80
465 名前:デフォルトの名無しさん [2006/09/20(水) 21:10:58 ] >>464 早速のご教示、ありがとうございます。 書かれている命令を追加してみましたが、結果は変わりませんでした。 『独習アセンブラ』に書かれている、次のサンプル「Hallo assembler」の方はキチンと表示 されるのに一番最初のサンプルコードがトラブってしまって、まいってます!
466 名前:( ^ω^)飛来ブーン [2006/09/20(水) 21:23:16 ] あげ
467 名前:デフォルトの名無しさん mailto:sage [2006/09/20(水) 21:29:56 ] linux nasm>Google で最初に出るサイトのasm05.htmlに似たようなのがある push eaxの前にpusha、pop eaxの後にpopaを入れてみてはどう?
468 名前:デフォルトの名無しさん mailto:sage [2006/09/20(水) 21:58:02 ] >>467 pusha、pop を入れてみましたが、結果は、まったく変わりません。 コードを書き足しているのにまったく変わらないというのも 何か、おもしろいですね。
469 名前:デフォルトの名無しさん mailto:sage [2006/09/20(水) 22:08:54 ] pusha、popa は不要。 global _start _start: mov eax, 31h ; 文字 "1" push eax ; スタックにバッファを設定 mov eax, 4 ; 出力(sys_wrigte) mov ebx, 1 ; ファイルハンドル(1=標準出力) mov edx, 1 ; 1文字出力することを指定 mov ecx, esp ; 書き込むバッファ int 0x80 ; 出力する pop eax mov eax, 1 ; sys_exit mov ebx, 0 ; 終了ステータスコード int 0x80 で動作したよ。nasm-0.98 と nasm-0.98.38 で確認。
470 名前:463 mailto:sage [2006/09/20(水) 22:30:17 ] >>469 家では、やはり「 セグメンテーション違反です」が出てしまいます orz 先ほども書きましたが、次のサンプルコードの「Hello assembler」は順調に アセンブルもリンクも 実行もウマクいくんですけど … nasm-0.98.38 をgetして、コンパイルし直してみます。 みなさん、Thanks
471 名前:デフォルトの名無しさん mailto:sage [2006/09/20(水) 22:54:40 ] int 0x80 を int 0x08 とタイプミスしてました、な〜んてことはないよね? いや、恥ずかしながら俺がそうだった。 見つけたときは全身脱力したよ。俺の1週間は何だったんだってね。
472 名前:デフォルトの名無しさん mailto:sage [2006/09/20(水) 22:58:24 ] > 全身脱力 全身脱毛に見えた
473 名前:463 mailto:sage [2006/09/20(水) 23:28:07 ] >>471 私もint 0x08をサンプルの「Hello assembler」の方でやってしまいました。 これやると、「 セグメンテーション違反です」がモロ出るんですよね。 今、 nasm-0.98.38 をgetしてきましたが、今度は、nasmのコンパイルが通らない! 泥沼に嵌まりこんでしまいました。 orz
474 名前:デフォルトの名無しさん mailto:sage [2006/09/20(水) 23:38:48 ] >>473 ttp://prdownloads.sourceforge.net/nasm/nasm-0.98.39-1.i386.rpm?download $ rpm -Uvh nasm-0.98.39-1.i386.rpm
475 名前:デフォルトの名無しさん mailto:sage [2006/09/20(水) 23:47:42 ] $ apt-get install nasm
476 名前:デフォルトの名無しさん mailto:sage [2006/09/21(木) 02:47:09 ] >>473 nasmのコンパイルが通らないとは nasm自体のソースコードがコンパイルできないということですか? でしたら>>474 ,475などで解決できると思うのですが。 それともnasmのインストールは完了していて、サンプルコードがアセンブルできない ということですか?
477 名前:463 mailto:sage [2006/09/21(木) 06:40:38 ] >>476 おはようございます。 私の場合は、nasmをソースからコンパイルしてinstallしています。 nasm-0.98.39.tar.bz2を展開してコンパイルして使いだしていたのですが、 nasm-0.98.38を使ってる人>>469 でのアセンブリのソースコードが問題なく アセンブルが通るということなのでnasm-0.98.38.tar.bz2をゲットしてコンパイル したという訳なんです。
478 名前:463 mailto:sage [2006/09/21(木) 12:37:21 ] お騒がせいたしました。自己解決しました。 ソース↓ section .data ; セグメンテーション違反回避 global _start _start: mov eax, 31h ; 文字 "1" push eax ; スタックにバッファを設定 mov eax, 4 ; 出力(sys_wrigte) mov ebx, 1 ; ファイルハンドル(1=標準出力) mov edx, 1 ; 1文字出力することを指定 mov ecx, esp ; 書き込むバッフ int 0x80 ; システムコール,出力する mov eax, 0ah ; 0ah push eax ; mov eax, 4 ; は mov ebx, 1 ; 改 mov edx, 1 ; 行 mov ecx, esp ; 用 int 0x80 ; システムコール,改行する pop eax ; eaxの回収 mov eax, 1 ; sys_exit mov ebx, 0 ; 終了ステータスコード int 0x80 ; システムコール,終了する
479 名前:デフォルトの名無しさん mailto:sage [2006/09/21(木) 13:53:05 ] それは駄目。 .dataセクションにはグローバル変数等を配置することになっているので、 そこにコードを記述することはできない。 コードを配置するのは.textセクション。 スタックにバッファを置くために2回pushしているが、1回しかpopしていない。 それから改行を出力するために苦労した痕が見受けられるが、次のように すればプログラムを短縮できる。 mov eax, 0x0a31 push eax mov eax, 4 mov ebx, 1 mov edx, 2 mov ecx, esp int 0x80 pop eax
480 名前:デフォルトの名無しさん [2006/09/22(金) 02:03:54 ] フロッピーからデータの読みだしについてです。 シリンダ0番、セクタ2番のプログラムを0x8000に読みだして実行 したいのです。 最後のJMPで*を付けると実行出来ないのですが、理由を教えて下さい。 MOVW $0x800, %AX MOVW %AX, %ES MOVB $0x00, %CH MOVB $0x02, %CL MOVB $0x00, %DH MOVB $0x00, %DL MOVB $0x02, %AH MOVB $0x01, %AL INT $0x13 JMP *0x8000
481 名前:デフォルトの名無しさん mailto:sage [2006/09/22(金) 03:38:12 ] 環境や前提条件をまず示してくれ。話はそれから。 おそらくブート時のロード処理だと見当はつくが。 或いは逆アセしてみて意図したコード(0x8000への絶対ジャンプ)に きちんと変換されたかを確認するとか。
482 名前:デフォルトの名無しさん mailto:sage [2006/09/22(金) 07:27:25 ] *0x8000だと、0x8000番地にある16ビットの値をアドレスとして処理する。 0x8000番地に飛ばすならjmp $0x8000が正解だと思う‥‥
483 名前:482 mailto:sage [2006/09/22(金) 07:52:23 ] >>480 のコードをちょっと修正。文法からGASを使っていると仮定。 バッファのアドレスを指定するときはBXレジスタも設定しないと駄目かと。 セグメント指定しているなら、セグメント間ジャンプで飛ばした方が確実。 MOVW $0x800, %AX MOVW %AX, %ES MOVW $0, %BX ; ES:BX = 0x800:0x0 MOVB $0x00, %CH MOVB $0x02, %CL MOVB $0x00, %DH MOVB $0x00, %DL MOVB $0x02, %AH MOVB $0x01, %AL INT $0x13 LJMP $0x800,$0
484 名前:デフォルトの名無しさん mailto:sage [2006/09/22(金) 12:32:15 ] >>481-483 サンクス。 >>481 すいません。 OS:FreeBSD6.1 アセンブラ:GCC その他:ld、objcopy エミュレータ:bochs 作っている物:ブートの最初の512byteのプログラム >>482 jmp $0x8000だとコンパイルエラーになります。 www.gnu.org/software/binutils/manual/gas-2.9.1/html_chapter/as_16.html の Absolute (as opposed to PC relative) call and jump operands must be prefixed with `*'. If no `*' is specified, as always chooses PC relative addressing for jump/call labels. を見て絶対アドレスでJMPする場合「*」が必要なのかなと思いました。
485 名前:デフォルトの名無しさん mailto:sage [2006/09/22(金) 13:08:06 ] >>482 「*」を付けた際の動作は、御指摘の通りでした。 解決できました。 ありがとうございました。
486 名前:463 ◆RMO61H2xHE mailto:sage [2006/09/22(金) 20:27:49 ] >>479 ご教示、ありがとうございます。とても助かりました。 今度は、こんな問題で引っかかっています。 eHllo, World としたいのですけど Helelo, Worldとなってしまいます! section .data; データセクションの定義 messagedb'Hello, World', 0Ah lengthequ$ -message; 文字の長さ section .text global _start _start: movedx, length; 文字列の長 movecx, [message] ; 以下の3行でmsgとmsg+1の内容を入れ換える xchgecx, [message+1]; mov[message], ecx; movecx, message; 出力する文字の指定 movebx, 1; ファイルハンドル(1=標準出力) moveax, 4; 出力(sys_wrigte) int0x80; システムコール,出力する moveax, 1; sys_exit movebx, 0; 終了ステータスコード int0x80; システムコール,終了する
487 名前:デフォルトの名無しさん [2006/09/22(金) 21:03:09 ] GNU asについて質問です。 lss 20+4(%esp), %esp と、ESPとSSに1命令で値をつめてるコードがあったのですが、 この20+4()ってのはどういう意味なんでしょうか?
488 名前:デフォルトの名無しさん [2006/09/22(金) 21:11:12 ] MMX の質問です pand mm0, mm1 を実行し結果がゼロになっても、ゼロフラグが立たないようです。 ゼロかどうかをチェックするにはどうしたらいいんでしょうか?
489 名前:463 ◆RMO61H2xHE mailto:sage [2006/09/22(金) 21:13:04 ] スペースが無視されたみたいなので、もう一回送ります。 section .data ; データセクションの定義 message db ' Hello, World ', 0Ah length equ $ -message ; 文字の長さ section .text global _start _start: mov edx, length ; 文字列の長 mov ecx, [message] ; 以下の3行でmsgとmsg+1の内容を入れ換える xchg ecx, [message+1] ; mov [message], ecx ; mov ecx, message ; 出力する文字の指定 mov ebx, 1 ; ファイルハンドル(1=標準出力) mov eax, 4 ; 出力(sys_wrigte) int 0x80 ; システムコール,出力する mov eax, 1 ; sys_exit mov ebx, 0 ; 終了ステータスコード int 0x80 ; システムコール,終了する eHllo, World としたいのですけど Helelo, World と表示されます!
490 名前:487 mailto:sage [2006/09/22(金) 22:01:16 ] コンパイルされたものをobjdumpでのぞいたら、 lss 0x18(%esp),%esp こういう風に変換されてました。 よく調べもせずに質問してすみませんでした。
491 名前:デフォルトの名無しさん mailto:sage [2006/09/22(金) 22:12:08 ] >>489 mov cl, [message+2] xchg cl, [message+3] mov [message+2], cl
492 名前:デフォルトの名無しさん mailto:sage [2006/09/22(金) 22:56:07 ] なんか 春だな・・・
493 名前:463 ◆RMO61H2xHE mailto:sage [2006/09/22(金) 22:56:18 ] >>491 ありがとうございます。 eHllo, Worldとなりました。アセンブリって意外とレジスタの動きが分かりやすいん ですね。 本や、ネットで検索しながらやってるんですけど、Linuxのnasmで 初心者に分かりやすい解説は、殆んどないんで困ってました。
494 名前:デフォルトの名無しさん mailto:sage [2006/09/22(金) 23:18:49 ] どっかにnasm本家のマニュアルの日本語訳があったはずだが。 あれで十分よ
495 名前:デフォルトの名無しさん mailto:sage [2006/09/22(金) 23:19:53 ] ってかmasmはMS公認で無料になったか。 イイジダイダナー
496 名前:・∀・)っ-○◎●新世紀ダンゴリオン ◆DanGorION6 mailto:sage [2006/09/23(土) 05:38:45 ] >>488 MMX演算はフラグレジスタを更新しない。 いちど汎用レジスタに転送してから比較する必要がある。 0かどうかだけを判定するだけなら、たとえば packssdw mm0, mm0 movd eax mm0 test eax, eax
497 名前:デフォルトの名無しさん mailto:sage [2006/09/23(土) 18:56:59 ] Z80ですけど DAAってハーフキャリーは0になるの?それとも変化するの?どっち?
498 名前:デフォルトの名無しさん mailto:sage [2006/09/23(土) 20:05:47 ] 変化する
499 名前:デフォルトの名無しさん mailto:sage [2006/09/26(火) 21:57:47 ] Hello, Worldを10回表示して改行したいんですけど、 下記のソースを弄ってみましたが、よく分からないので教えて頂けないでしょうか。 section .data msg db 'Hello, World', 0ah len equ $ -msg section .text global _start _start: mov eax, 4 ; 出力 mov ebx, 1 ;(1=標準出力) mov ecx, msg ; mov edx, len ; 文字列出力 int 0x80 ; 出力 doit: dec ecx ; ecxをデクリメントする jecxz endquit ; ecxがゼロならジャンプ jmp doit ; doitへジャンプ endquit: mov eax, 1 ;(sys_exit) mov ebx, 0 ; 終了ステータスコード int 0x80 ; 終了
500 名前:デフォルトの名無しさん mailto:sage [2006/09/26(火) 22:49:24 ] >>499 それじゃ一回だけ表示された後、しらばく後かすぐに終了するだろ。 int 0x80 ; 出力 doit: dec ecx ; ecxをデクリメントする jecxz endquit ; ecxがゼロならジャンプ jmp doit ; doitへジャンプ このdoit以下何もやっていないと同じだぜ? なぜecxをデクリメントして0になったら終了になるん?何目的だ? たぶんint0x80は文字列表示機能だと仮定するなら、 ediにでも0xaを入れておいて、 dec edi jnz _start ← ゼロじゃなけりゃジャンプっての にすればええ。
501 名前:499 mailto:sage [2006/09/26(火) 23:28:28 ] >>500 > それじゃ一回だけ表示された後、しらばく後かすぐに終了するだろ。 その通りなんです。弄っているうちに わけわからなくなってしまい、 1回だけ表示するプログラムに戻したものを書き込みました。 >499 の投稿は下記のDOSのプログラムをLinux上で jecxz を使って同じような動作を 再現できないか試行錯誤の最中だったんです。 ; DOS プログラム bits 16 org 0x100 mov ah, 9 ; 文字列出力指定 mov dx, msg ;出力する文字列 mov cx, 10 ; cxレジスタの値を10にする doit: int 21h dec cx ; cxを1だけ減らす jcxz endquit ; cxがゼロならendquitへ jmp doit ; doitへジャンプ endquit: mov ah, 4ch mov al,0 int 21h msg db "Hello, World", 0dh, 0ah,"$"
502 名前:デフォルトの名無しさん mailto:sage [2006/09/26(火) 23:44:57 ] システムコール呼ぶときecxレジスタ使ってるだろ? そんくらい気ずかん?(´・ω・`)
503 名前:デフォルトの名無しさん mailto:sage [2006/09/27(水) 01:45:08 ] >>501 答えは分かるがあえて書かない。自分で考える事が上達には大事だしな。 先ほど書いたようにdiあるいはsiをcxの代わりにカウンタとし、 dec di jnz また文字列出力する場所 ってな感じにするのが良い。 あとint21hの後のレジスタの値は保障できないと考えた方が一応はいいと思うから、 doitの位置を変えた方が確実だと思う。
504 名前:デフォルトの名無しさん [2006/09/27(水) 09:36:16 ] x86CPUで、32ビットの値を3倍するとき、 x = x * 3; と、 x = (x<<1) + x; はどちらが高速なんですか?
505 名前:デフォルトの名無しさん mailto:sage [2006/09/27(水) 10:02:43 ] >>504 スループットは上の方がいいが、 レイテンシは下の方がいい。 CPUによるけど。 どちらが速いかは周りの処理にもよる。 でも、x86ならこれが一番速いよ。 lea x,[x*2+x]
506 名前:デフォルトの名無しさん mailto:sage [2006/09/27(水) 15:00:54 ] ていうか、いまどきのコンパイラは 3倍するのはleaに最適化してくれますよ。
507 名前:・∀・)っ-○◎●新世紀ダンゴリオン ◆DanGorION6 mailto:sage [2006/09/27(水) 22:23:36 ] Pen4だとこれでも速かったりwww mov edx, eax add eax, eax add eax, edx
508 名前:デフォルトの名無しさん mailto:sage [2006/09/28(木) 00:52:21 ] >>507 シフトが add の 8 倍遅い変態 CPU を持ち出すのは反則だと思いまつ。
509 名前:デフォルトの名無しさん mailto:sage [2006/09/28(木) 01:18:15 ] ペン4のALUは糞すぎるなw
510 名前:・∀・)っ-○◎●新世紀ダンゴリオン ◆DanGorION6 mailto:sage [2006/09/28(木) 01:23:14 ] 依存関係を高いクロックによって解決するという手法は全てが間違いだった訳じゃないけど クロックを重視したデータキャッシュが小さすぎたりパイプラインが長すぎたり 熱すぎたりで、全体としてマイナス要素が大きかったのが敗因ですな。
511 名前:デフォルトの名無しさん [2006/09/30(土) 18:11:57 ] スタックを使って A B と表示させようと思うのですけど、ウマクいきません!? ご教示 お願いできないでしょうか。 section .text global _start _start: movdl, 0x41 ; "A" push dx call putchar pop dx mov dl, 0x42 ; "B" push dx call putchar pop dx mov eax, 1 ; sys_exit mov ebx, 0 ; 終了ステータスコード int 0x80 ; システムコール,終了する putchar: ; スタックの文字を出力する サブルーチン push esp mov ebp, esp sub esp, 0x40 ; ローカルスタックスベース mov ebx, [ebp+4] ; 最初のパラメータ mov dl, bl mov eax, 4 ; sys_write mov ebx, 1 ; ファイルハンドル(1=標準出力) mov ecx, esp ; 書き込むバッファ mov edx, 2 ; 文字出力することを指定 int 0x80 ; システムコール,出力する mov esp, ebp ; sub esp,0x40を取り消す pop esp ret
512 名前:デフォルトの名無しさん mailto:sage [2006/09/30(土) 18:27:46 ] 32bitモードでdxレジスタなんか使うなよ・・・ あと最初のパラメタは[ebp+4]じゃなくて[ebp+8]だボケ
513 名前:ボケ [2006/09/30(土) 19:15:48 ] >>512 早速のご教示ありがとうございます。 ご指摘のdxをedxとし[ebp+4]を[ebp+8]に直してやってみたのですけど、 結果は変わらず、何も表示されなくて ただ改行されただけでした。 Cの参考ソースはけっこうありますけど、アセンブルってほとんどないですね!
514 名前:デフォルトの名無しさん mailto:sage [2006/09/30(土) 20:05:55 ] >>513 最後に0x0aも出力してみれ。
515 名前:デフォルトの名無しさん mailto:sage [2006/09/30(土) 21:58:20 ] >mov ecx, esp ; 書き込むバッファ ここ間違っているのでは 既に40引いてしまっているのに・・・
516 名前:デフォルトの名無しさん mailto:sage [2006/09/30(土) 22:04:24 ] lea ecx,[ebp+8]とかじゃね?
517 名前:デフォルトの名無しさん mailto:sage [2006/09/30(土) 22:17:03 ] これはひでえ。釣り…なのか…?まあいいや。 putcharの先頭部分は push ebp ; espじゃねーぞ mov ebp, esp の間違い。それに伴ってretの前も pop ebp に修正。 sub esp, 0x40 では 0x40 も引く必要ない。0x4で十分。 「最初のパラメータ」コメントの次の mov dl, bl は何やってんのか意味不明。 ここは mov [ebp-4], ebx に変更。 putcharというからには出力文字数は1文字だろ。mov edx, 1 に修正。
518 名前:デフォルトの名無しさん mailto:sage [2006/09/30(土) 22:34:25 ] > Cの参考ソースはけっこうありますけど、アセンブルってほとんどないですね! だったらC言語で書いてみるべし。 /* putchar2.c */ #include <unistd.h> void putchar2(int ch) { write(1,&ch,1); } int main(void) { putchar2('A'); putchar2('B'); } そしてこいつを -S スイッチつけてコンパイルしる。 $ gcc -S putchar2.c コンパイラがどんなコードを吐くか、自分のものと見比べるべし。 最適化オプションも併せて指定するといいかもな。
519 名前:デフォルトの名無しさん mailto:sage [2006/09/30(土) 22:37:26 ] gccの最適化は最初は知らないほうがいいんじゃないかw
520 名前:デフォルトの名無しさん mailto:sage [2006/09/30(土) 22:40:35 ] どうして?ちょっとだけでいいから教えて・・
521 名前:デフォルトの名無しさん mailto:sage [2006/09/30(土) 22:48:43 ] そしてICCとか最近のVC++で最適化コンパイルしてしまって余計混乱すると。
522 名前:デフォルトの名無しさん mailto:sage [2006/09/30(土) 22:53:44 ] こんなガリガリのコードじゃたいして最適化できねぇw putchar2はwriteをコールするだけだから関数の存在が消えてしまう可能性はあるが。 >>520 高度な最適化コンパイラは凡人の考えの及ばぬような超変形型ロジックを組むことがあるから。
523 名前:ボケ mailto:sage [2006/09/30(土) 22:59:17 ] >>517 釣できるほどのウデがあればいいんですけど… 貴方の仰る通り、>511の投稿には誤りがたくさんありました。 言われた通りにやったら AB と表示されました! 改行はしないみたいですけど、 改行は組めますので、後は簡単です。 Thanks
524 名前:デフォルトの名無しさん mailto:sage [2006/09/30(土) 23:37:48 ] >>522 ふ〜ん
525 名前:デフォルトの名無しさん mailto:sage [2006/10/01(日) 01:50:05 ] >>522 コンパイラ程度の最適化が超変形? じゃあ人が書いたコードは読めねぇなw
526 名前:デフォルトの名無しさん mailto:sage [2006/10/01(日) 02:10:08 ] いや、人間様がそれ以上にド汚い変形かますことができるのも確かだが、 きょうびのコンパイラが超変形かますのは事実だろ。 何を噛み付いてるんだ。 カルシウム足りないのか。
527 名前:・∀・)っ-○◎●新世紀ダンゴリオン ◆DanGorION6 mailto:sage [2006/10/01(日) 02:25:38 ] i *= 32; を add eax, eax; add eax, eax; add eax, eax; add eax, eax; add eax, eax; に展開するコンパイラとかな。
528 名前:デフォルトの名無しさん [2006/10/01(日) 02:30:21 ] そんな大した事無いレベルの最適化でグダグダ言うなよ
529 名前:デフォルトの名無しさん mailto:sage [2006/10/01(日) 02:39:09 ] VC++やICCの定数除算の最適化はなかなかエグかった気がするが
530 名前:デフォルトの名無しさん mailto:sage [2006/10/01(日) 03:04:16 ] 漏れはVC2005のたらい回し関数でたまげた。
531 名前:デフォルトの名無しさん mailto:sage [2006/10/01(日) 03:36:33 ] >>527 GCCでは無数にある最適化オプション組み合わせていくら頑張ってもシフトだった。 -O0ですらシフトだったw VC++のリリースコンパイルでもシフトだから、それが最善じゃないのか?
532 名前:デフォルトの名無しさん mailto:sage [2006/10/01(日) 05:26:38 ] mov eax,dword 051eb851fh imul ecx sar edx,byte 005h mov eax,edx shr eax,byte 01fh add edx,eax; / 100 これとか実行してみるまで何やってるかわからなかった(VC6)。
533 名前:デフォルトの名無しさん mailto:sage [2006/10/01(日) 05:38:03 ] >>527 いや、それ普通。 VCのそれは、シフトが異常に遅い某CPUに配慮したものと思われ。 多分だけど。
534 名前:デフォルトの名無しさん mailto:sage [2006/10/01(日) 09:07:13 ] P○n4は*32でもシフトより加算の方が早いのか?w
535 名前:デフォルトの名無しさん mailto:sage [2006/10/01(日) 09:27:21 ] >>534 ちょっと上くらい読めや>507-509
536 名前:・∀・)っ-○◎●新世紀ダンゴリオン ◆DanGorION6 mailto:sage [2006/10/01(日) 14:54:18 ] Pen4ではshlのレイテンシは4クロック、addは0.5クロック 依存関係チェインが深い場合は加算を繰り返した方ほうが早い VCじゃなくて、ICCの-QxWとか-QxNとかのPen4専用オプションだったような >>532 除算はクロック数やたらかかるから定数積算とシフトに置き換えるのは常套手段
537 名前:デフォルトの名無しさん mailto:sage [2006/10/01(日) 17:29:21 ] 常套手段て…そういう裏技があるのなら標準でALUにそのロジックを積んで もらった方がどれだけわかりやすいことか。 あるいは除算命令でこのシーケンスと同じμop生成するとか。 書きたいことはまだあるけどこれ以上はちょっとスレ違いになるので遠慮しよう。
538 名前:デフォルトの名無しさん mailto:sage [2006/10/01(日) 17:53:12 ] いや、除算を他の演算に置き換えるロジックってすげー大変なんだが。 何で割るかによって全く違うロジックになるから。 そんなもんにトランジスタ突っ込む余裕なんかない
539 名前:デフォルトの名無しさん mailto:sage [2006/10/01(日) 18:33:31 ] >>532 は>>529 と繋がっていたのか、気づかなかった。 定数除算限定で、しかも最適化のタイミングはコンパイル時じゃないといけない 程度に複雑なアルゴリズムなのか。 随分と頓珍漢なことカキコんじまったな(恥
540 名前:デフォルトの名無しさん mailto:sage [2006/10/04(水) 23:19:27 ] テキストエディッタで.asmファイルを作成してコマンドプロンプトでアセンブルしようと思ったのですがうまくいきません。 ml〜コマンドは合ってるはずなのですが。 知恵をください。 XPSP2です
541 名前:デフォルトの名無しさん mailto:sage [2006/10/04(水) 23:23:42 ] >>540 それだけの情報で何かわかると思ってんのか。 せめてエラーメッセージくらい貼れよ。