[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 2chのread.cgiへ]
Update time : 02/24 11:23 / Filesize : 211 KB / Number-of Response : 985
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

アセンブラ… (゜□゜) ↑アッー!↓



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
それだけの情報で何かわかると思ってんのか。
せめてエラーメッセージくらい貼れよ。






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<211KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef