1 :
デフォルトの名無しさん :
2008/01/10(木) 17:03:37 すべてのプログラムは最終的に機械語に変換されてから実行される。 よって機械語と1対1に対応しているアセンブリ言語はどんなものでも書けることになる。 ゆえにアセンブリにできないことはない。
60FE
3 :
デフォルトの名無しさん :2008/01/10(木) 18:22:58
で?
今頃汎用PCの機械語がチューリング完全なことに気付くなよ
何をいまさら言っているんだ。
CPUに出来ないことはできない
現在は必ずしも最強ではない JITのようにCPUに合わせた最適化が出来ない
>>1 √ ̄ヽ--ヘ
/ ☆ ヽ
0く━=ニニ二>
//(●) (●) \
/ ヘ (__人__) | ■■ 自宅警備員へお知らせ! ■■
/ヽノ彡,,.. .|∪| /
/ 丿,, /\ヽノ/ゝ 丶 2008年1月11日午前6時(日本時間)より
(  ̄jヽ,/_l ヽ 「2ちゃんねる」が12時間にわたって停止
\ ____ ̄{。 _____ } します。自宅警備を強化し待機せよ。
ヽ、,,_, {---} }。 {---} j
http://www.maido3.com/server/
9 :
デフォルトの名無しさん :2008/01/10(木) 20:54:42
nihonngo
コンパイラぐらい書けよ
11 :
デフォルトの名無しさん :2008/01/10(木) 22:51:27
今日友達と雑談してたんだけど、 「俺はwikiができる前からwikiと同じものを作って使ってたんだぜ」 って言ったんだよ。 そしたらなぜか、wikipediaを作ったのか、すげーな、って言われちまったよ。 で、wikiについて説明してもwikipediaと同じだと思い込んでるらしく、 一般人ってなんで物知らずなんだろう、 と思ってしまった俺のほうがやっぱりおかしいんだろうか?
>>7 俺の脳の方が凄いと思うよ
よって、アセンブリ最強
13 :
デフォルトの名無しさん :2008/01/10(木) 23:08:44
>>7 馬鹿?
機械的な最適化が貧弱だからアセンブラで書くんだろうが。
IA64をハンドアセンブルしてる俺様は最凶
まあ、使う人間側のリソースが無限大と仮定すれば最強というか、同等だろうな。
最強伝説… アセンブリ言語が死んで終わるって話だな。
18 :
デフォルトの名無しさん :2008/01/11(金) 17:58:32
>>! で? コードためしにアップしてよ
19 :
デフォルトの名無しさん :2008/01/11(金) 18:25:50
mov ax,1 mov ah,3
20 :
デフォルトの名無しさん :2008/01/11(金) 18:37:04
スキルによって性能がバラバラ過ぎてアセンブラなんか使えない
22 :
デフォルトの名無しさん :2008/02/22(金) 10:10:55
昔
>>1 見たいな事言って高級言語プログラマたちに物申したアセンブリプログラマがいたよね
24 :
デフォルトの名無しさん :2008/05/03(土) 21:45:49
低級脳には低級言語がお似合いだぜ
25 :
デフォルトの名無しさん :2008/05/06(火) 13:18:26
どんな分野で働いてるの?
WEBアプリ
最強だが汎用性がない
"最強"の定義が不明瞭な件はどう説明するのか
なんとアセンブラを使えばJavaバイトコードも出力できます!
アセンブリでOSを作れるの?
作れます。ごく簡素なOSなら、アセンブラで書いたほうが手っ取り早いくらいです。
作ってみたい・・・ どうやったら作れますか?
>>32 適当なワンボードマイコンの開発環境一式を入手して、只管マニュアルを読む。
それに関わる情報をWebなりなんなりで入手する。
入手した情報を元に試行錯誤を繰り返す。
諦めて既存(あるいはサンプル)のOSのソースを読む。
利用できるところは利用して更に試行錯誤する。
挫けて開発環境一式を仕舞い込んでなかったことにする。
>>1 最後まで書ききれる根性があればの話だがな。
>>32 割と最近に30日でOS作るとかいう本が出てたから、ネットや書店で買ってそれをやってみればいいよ
雰囲気とかつかめると思う
実用のOSとは程遠いだろうけど
ひげぽんという人は2chで質問しながらモナOS作ったぞ
HOW TO 本を紹介すんのかよ・・・
いいんじゃね どうせbootローダかFATあたりで飽きるだろ
なんでOSを作りたいかを明確にしないと挫折する気が
アセンブリ言語でメモリの参照をするにはどうすればいいんですか?
41 :
デフォルトの名無しさん :2008/06/05(木) 10:58:55
入れる、出す 押す、引っ張る 裏返す、交換する 増やす、減らす 足す、引く ずらす、回す 削る、重ねる 比べる 飛ぶ、繰り返す 呼ぶ、戻る なんだ覚えることはこれだけか
イン・アウトまで読んだ
覚えることはたった8つだ。 > ポインタをインクリメントする < ポインタをデクリメントする + ポインタが指す値をインクリメントする - ポインタが指す値をデクリメントする . ポインタが指す値を出力する , 1バイトを入力してポインタが指す値に代入する [ ポインタが指す値が0なら、対応する ] までジャンプする ] ポインタが指す値が0でないなら、対応する [ にジャンプする
4つのもある Hコマンドは文字列"Hello, world!"を出力する。 Qコマンドはプログラムのソースコードを出力する(参考:自己出力プログラム)。 9コマンドは『99 Bottles of Beer』(アメリカの数え歌で、プログラミングの例題でよく利用される)の歌詞を出力する。 +コマンドはアキュムレータをインクリメント(1だけ増やす)する。
45 :
デフォルトの名無しさん :2008/06/29(日) 21:37:35
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 :
デフォルトの名無しさん :2008/06/29(日) 21:45:58
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 の結果はどうなりますか??
GNU as が受け付けるアセンブリや gcc -S が出力するアセンブリに関する質問はどのスレでやればいいの? アーキテクチャは x86 や x86_64 でいいんだけど…
取り敢えずここでどうぞ。
49 :
デフォルトの名無しさん :2008/06/30(月) 22:18:05
次のプログラムの空欄を埋めて、メモリに格納されたデータの最大値を求めるプログラムを完成させてください。ちなみに空欄とはうえの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 :
47 :2008/07/01(火) 01:33:53
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 いあそうなんだけど
info gas とか info gcc とか見れば分かるの?
訊く前に見るだろ,普通
uleb128以外は見た瞬間に判るだろ
どこで聞いていいか分かりませんけど、 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
(x86で)1命令でeaxの値に1を加算する方法を4つ挙げよ みたいな問題を先輩に出されたんだが、2つしかわからん。 add eax,1 inc eax の他に何があるだろう?
3. lea 4. -1をsub かなあ。
なるほど、 lea eax,[eax+1] sub eax,-1 か。 thx
C/C++/Javaやそのほかの言語も全てCPU命令を基にした アセンブラで出来てるんだから、 どんな複雑なAPIも結局はその組み合わせでしかないと思って アセンブラの勉強を始めたら、 ノイマンモデルからやり直しになっちゃった('A`) でもこういうのは楽しいね。
またそういうことを
IDAの使い方を日本語学びたいです。
63 :
デフォルトの名無しさん :2009/06/15(月) 23:18:48
どうも、井田です。
なんとも厨くさいスレタイだけど、ここを使うしかないか
いちおう「アセンブラ」ってスレも過去あったんだけどね。 Part13 が即死して放置されてる。 Part13.1 で立て直す?
有効利用で行きましょうよ。
>>66 せめてプログラム板では
アセンブラではなく
正しいアセンブリ表記にしようぜ
何がどう正しいんだ? アセンブリ言語の処理系がアセンブラだろ?
>>69 assembly languageと書かれることが多いし、一般的にその方が正しいと思う人が
多いと思うが、IBMの社員はassembler languageって言うんだよな。
アセンブリっていうと言語っぽいが、アッセンンブリーというと自動車の部品みたい
アッセンブル、アッセンブリは組み立てや実装の時に使うな。
>>69 それが常識だよな
っていうか英語がわかればそのまんまだし
>>70 さすがIBM社員
プログラム知識はまるで駄目だな
IBMの用語は妙だったりすることはあるが、 方言ってだけでプログラミングと関係はないだろう。
CASLはアセンブラ言語
76 :
大和魂 ◆TLCPn.jaa2 :2009/06/19(金) 18:00:18
質問です。自力で解決しようと努力しましたが、万策尽きました…。 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音源として、正常に機能し、拙作ツール・ゲーム等にて音も鳴る)。
実際のコードです。 ; 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 :
PENELOPE :2009/06/19(金) 18:07:54
プログラムをこれから始めようと思っているのですが、まず 何からはじめたら良いですか?
es:sbuffが何処を指しているか理解しろ
80 :
PENELOPE :2009/06/19(金) 18:11:24
基本的なことから教えてください。
アセンブラで勉強したいなら、 最初はシンプルなCOMファイルでの勉強がおすすめ しかし、環境構築が大変かもしれn
>>79 すいません、
section .data
sbuff:
times 8 db 0
の間違い。
で、ちょうどCで
char sbuff[8];
としたみたいなものです。確保したsbuffが実際にメモリ上のどこにあるかは判らないです。
判らないのは、Cでも同じでしょう。MASMだと dup/db系の擬似命令で行なうのだと思いますが。
セグメントレジスタの値をトレースすればわかると思う。
>>83 なるほど。やってみます。あと、TASM(BCC 日本語版 v3.1付属)でも
同様のコードを書いてみようと思います。アドバイスありがとうございました。
Tracing the value of the segment registers, right? Thx !!
アセンブラってすげー簡単だよな。 Cを20年勉強しても使えるようになれなかったけど アセンブラは一週間もかからず使えるようになった。
はい、嘘つきが湧きました。
使えるようになっただけで使いこなせてはいないんだろ
むしろC言語を20年かけて覚えられない方が 本当だったら感心するわ
おまいら釣られすぎだろ
アセンブリというよりマシン語での事なんだけど IA32でのJcc系列に対する2Eまたは3Eのプリフィクス・コードってどんな意味があるの? 実際に動かしてみても動作には影響しないよね? デベロッパ・マニュアルに書いてあったを見てから気になってしまって
結局、レジスタレベルでの違いは無いという事ですかね。 難しい。
2E/3Eって、セレクタのプレフィックスじゃね? (i286まではセグメントオーバーライドプレフィックスつってた奴)
>>93 今もsegment override prefixと言ってるような気がするが。
で本題だが、そのprefix byteは普段はそういう意味なんだが、
分岐命令の前にくるとヒント情報として解釈されるという…
泥沼泥沼
間接ジャンプ時は通常通り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から有効かなどの情報はないが
16ビットと32ビットのニーモニック/機械語の対応って同じなんでしょうか? windowsのdebugコマンドでは mov eax,1みたいなのが使えないので これは16ビットのアセンブラってことですよね
386以上のCPUなら16bitリアルモードでもEAXは使える DEBUG.EXEは元々DOS用のデバッガだから対応してないだけ
すいません、先日はありがとうございました。まだ未解決ですが(--; ところで、入門書・入門サイトの類いの冒頭にかならずと云っていいほど 載っている"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を用いる利点と欠点を ご教示ください。数バイト分バイナリが大きくなってしまうのですが、意味が無いでしょうか??
追記申し訳ない。 AH=40H / BX=0001H でのコンソール出力は、ファイルハンドラを用いて 書き出していたり、戻り値の判定等で、AH=09Hのそれとは厳密さの点で異なるという 理解で大丈夫でしょうか?
その程度の内容でleaを使うかmovを使うかは、ただの趣味の問題程度。 leaのほうが[bx+si+10]とかそういう指定もできるので応用がある。 ファンクションコールはMS-DOSの話になるが、「厳密さの点で異なる」という 言葉の意味がよくわからない。
>>98 エラーメッセージに、AH=09H / INT 21H
を使わないのは、エラー系は標準出力以外を使う文化が
あるからじゃないかな。
この場合の厳密さ、ってなんだろうね。 09Hは標準出力に送信する、終端は'$'。 40Hは出力先をファイルハンドルで指定する、出力するデータのサイズも指定する。 両者は別物。
>>100 回答ありがとうございます。
leaを使うか、mov offsetの組み合わせでアドレス代入するかは、趣味程度の違いなんですね。
そうか、leaだと、確かにご指摘のようなパターンの応用も利きますね。
ところで後段、
mov ah, 9
lea dx, [err_msg]
int 21h
とすると、リターンコードがありません。しかし、
mov ah, 40h
mov bx, 0001h
mov cx, err_msglen
mov dx, err_msg
int 21h
section .data
err_msg: db 'An error has occured.', 0dh, 0ah, '$'
err_msglen equ $ - err_msg
としますと、実行後axレジスタに戻り値が格納され、各種判定に用いることが出来るということで、
「厳密」という表現を用いました。例えが不適切かも知れませんが、Cで云うところの
puts("An error has occured."); と、書式付き出力命令である
fprintf(stderr, "An error has occured.\n"); と対比可能ではないかな、と思いまして。
# int 20hでプログラム終了という太古のソースは、さしずめ void main(void){}で、DOSへの
# 戻り値のない、現在で云うANSI C非準拠のコードと同じでしょうかね。
# 80年代後半くらいから、ほとんどは mov ax, 4c00h / int 21hですよね。
>>98 Usageやエラーは標準エラー出力に出さないと、出力をリダイレクトした時に困るから。
>>101-102 被りました。すみません。もう一度MASM本とソースを読み返してみます。
>>104 まさに、stderr相当の話ですね。いまMASM本のP.157で確認しました。
どなたか教えてください… sub $2,$1,$1 lw $4,100(0) L1: add $2,$4,$2 addi $4,$4,-1 beq $4,$0,L1 sw $2,104($0) End: このプログラムをN番地から実行を開始した時、実行される命令の番地、それにより変化する汎用レジスタの名称、 変化後の値を知りたいのですが、途中までしかわかりません。 実行開始時、100番地から始まる4バイトには、整数10が格納されているとします。 順番 実行される命令の番地 変化する汎用レジスタ等の名称 変化後の値 の順に… 1 N $2 0 2 N+4 $4 10 3 N+8 $2 10 4 N+12 $4 9 5 N+16 6 N+8 7 N+12 8 N+16
108 :
デフォルトの名無しさん :2009/07/09(木) 22:38:15
ageます
宿題なら自分でやれ
>>109 すいません
sub $2,$1,$1
lw $4,100($0)
L1: add $2,$4,$2
addi $4,$4,-1
beq $4,$0,L1
sw $2,104($0)
End:
1 N $2 0 2 N+4 $4 10 3 N+8 $2 10 4 N+12 $4 9 5 N+16 6 N+8 $2 20 7 N+12 $4 8 8 N+16
>>109 C/C++はあるのになんでアセンブリは宿題スレないんだろうな
最近習いだしたが先生に聞いてさっぱりも分からないのに課題出されて泣きそうだよ
泣くほどのことじゃないだろう。 理解できるまで、何回も考えてから、 解き方を質問すればいいだけ。 答えだけ知りたいなら、 誰かあらわれるまでまってりゃいい。
>>112 違わなくて、ループしないから困っているのです…。
理解できるまで、何回も考えてから、解き方を質問してます。
だれか、頭のいい方…
>>113 それMIPSのコードだろ?SPIM使って実行すればすぐ分かるだろうが
118 :
デフォルトの名無しさん :2009/07/09(木) 23:42:07
PC-98って今も売っていますか?
スパム・・じゃねぇえ
どう考えてもbeqじゃなくてbneqだろ。そうすれば1から10までの総和計算になるから 意味が通る。それだけは最低教授に確認しろ。 ちなみにSPIMはMIPS32シミュレーターの名前だ。
121 :
120 :2009/07/09(木) 23:50:45
bneqじゃなくてbneだったか。
>>120 bneが≠だとすると値はそれぞれどんどん離れていき・・
$2 $4
0 10
10 10
10 9
19 8
27 7
でも符号が反転してどこかで終わるかな?
123 :
120 :2009/07/10(金) 00:03:32
>>122 お前相当な馬鹿だな。どこの大学だ?
$4が0になったときに終わるだろうが。
>>123 あああ気付いて書き込もうと思ったら間に合わなかったあああ
ありがとうございます。
最近彼氏と別れたからあなたに惚れそうです。
125 :
120 :2009/07/10(金) 00:06:57
>>124 俺は馬鹿は嫌いだ。ついでに女は間に合ってる。
>>125 さすが、彼女がいる男って優しいんだよな;;
大学は明治でした。ほんとサーセンww
馬鹿な女の魅力を知らないとは。。。 だから124は俺がもらっていきますね
124を読んでも「彼氏と別れた」とあるだけだ。女とは限らないぞ。 アッーみたいな。
女は間に合ってる、と言ってるな。
やはり120はガチホモか。
>>120 やらないか?
アルファベットの小文字と大文字の範囲をXORでくっつける技があったと思うんだけど 忘れてしまった。どうやるかわかる人いる?
A - Z = 0100 0001 - 0101 1010 a - z = 0110 0001 - 0111 1010 C = c xor 0010 0000
どもども!
えっと、それだと、 大文字と小文字を入れ替えるだけじゃない?
くっつけるってどういう意味? 0x41-0x5A + 0x61-0x7A を 0x00-0x33 にするっていうこと?
135 :
デフォルトの名無しさん :2009/07/30(木) 17:58:56
それだともともとアルファベットの小文字と大文字の範囲はくっついてるんじゃないか
質問者です。解答を信じてちゃんと中身まですぐに確認しなかったのだけども
>>135 これです。ありがとう。
1文字の入力してキャラクタコードを2進数と16進数で表示するコードを作りたいのですがここからわからなくなりました ご教授お願いします Code segment Code ends Data segment Data ends Stack segment stack Stack ends Data segment Data ends Stack segment stack dw 100h dup(?) Stack ends Code segment assume cs:Code,ds:Data,ss:Stack Main proc near mov ax,Data mov ds,ax Main_LOOP:
139 :
138 :2009/07/30(木) 19:52:31
mov ah,01h int 21h cmp al,0Dh je Main_EXIT push ax mov dl,' ' ;区切り用に空白を表示する mov ah,02h ; int 21h pop ax push ax call BIN2BIN pop ax call BIN2HEX jmp Main_LOOP Main_EXIT: mov ax,4C00h ;return to MS-DOS int 21h ; Main endp
;キャラクタコードを2進数で表示する変換サブルーチン BIN2BIN proc near mov bl,al mov cx,8 B2B_1: shl bl,1 mov dl,00h ; adc dl,30h mov ah,02h int 21h ; loop B2B_1 mov dl,'b' ;表示した2進数の最後にbを表示する mov ah,02h ; int 21h ; mov dl,' ' ;区切り用に空白を表示する mov ah,02h ; int 21h ; ret BIN2BIN endp
pop ax mov dl,ah ; mov ah,02h ; int 21h ; loop B2H_2 mov dl,'h' ;表示した16進数の最後にhを表示する mov ah,02h ; int 21h ; mov dl,' ' ;区切り用に空白を表示する mov ah,02h ; int 21h ; ret BIN2HEX endp Code ends end Main
142 :
138 :2009/07/30(木) 20:00:20
すいません、
>>141 と
>>142 の順番を間違って貼ってしまいました
正しくは
>>138-140 →
>>142 →
>>141 の順です
;キャラクタコードを16進数で表示する変換サブルーチン
BIN2HEX proc near
mov cx,0
mov dl,16 ;基数=16
B2H_1:
mov ah,00h
div dl ;AX÷16=AL…AH
cmp ah,10 ;値は10以上か?
jae B2H_3 ;
add ah,30h ;AH+30h=AH(数字)
jmp B2H_4
B2H_3:
add ah,37h ;AH+37h=AH(英文字)
B2H_4:
push ax
inc cx
cmp al,0
jne B2H_1
B2H_2:
x86は門外漢だけど暇だから書いてみた。石の指定が無かったので8086で。 .model small .8086 assume CS:Code, DS:Data, SS:Stack Data segment para 'DATA' TBLHEX db '0123456789ABCDEF' ;16進表現の変換テーブル STRTOP db ' ' STRBIN db '00000000b ' ;表示用バッファ2進表現部分 STRHEX db '00h', 0Dh, 0Ah, '$' ;表示用バッファ16進表現部分 Data ends Stack segment stack dw 100h dup(?) Stack ends GetChr macro ;1文字入力 mov ah, 01h int 21h endm PutStr macro string ;文字列表示 mov dx, offset string mov ah, 09h int 21h endm
;プログラム Code segment word 'CODE' org 100h ;メインプロシージャ ;1文字入力->2進表現への変換->16進表現への変換->表示を改行が入力されるまで繰り返す Main proc near mov ax, Data mov ds, ax @@: GetChr cmp al, 0Dh je @F push ax call CHR2BIN pop ax call CHR2HEX PutStr STRTOP jmp @B @@: mov ax, 4C00h int 21h Main endp
;文字コード->2進表現に変換しバッファへ格納 CHR2BIN proc near uses bx di mov cx, 8 xor di, di mov bx, offset STRBIN @@: shl al, 1 mov dl, 00h adc dl, 30h mov [bx + di], dl inc di loop @B ret CHR2BIN endp N2H macro dst:req;テーブル参照して4bit値の16進表現を取り出しバッファへ格納する mov si, ax mov bx, offset TBLHEX mov al, [bx + si] mov bx, offset dst mov [bx + di], al endm
CHR2HEX proc near uses bx si di xor ah, ah push ax xor di, di ;上位4bitを取り出して16進表現に shr al, 1 shr al, 1 shr al, 1 shr al, 1 N2H STRHEX ;下位4bitをとりだして16進表現に inc di pop ax and ax, 0Fh N2H STRHEX ret CHR2HEX endp Code ends end Main わからないところからの続きじゃなかったりする。ゴメンね。
有名な技だけど、ALの下位4ビットを16進に変換する方法 and al,0Fh cmp al,10 sbb al,69h das
お?楽でいいなぁ、これ。
>>146 ありがとうございます。
でもまだアセンブリ習い始めてすぐなのでshrとかがよくわかりません
できれば続きからはできませんか?
>>150 おひ(笑
>>149 shr = SHift Right。C言語やPerlの演算子だと >>=。
対象レジスタ(変数)の値を指定ビット数だけ右に移動させる。
あいだ左端には 0(ビット) を置いて行きます。
それからねー、a >> n は int(a/2**n) [** はべき乗] に等価なのだ。
>>149 てーかCPUによって使える命令は変わるから先にCPUを明示しろよ。
まぁ習うといってもアセンブリ言語ならではのプログラミングの癖さえ把握すれば、あとはデータシート落として熟読して終わりなんだが。
>>151 最後の行、論理シフトだから「等価」と違うと思うよ。
>>151 解説ありがとうございます
>>152 CPUはCore2 DuoのE8600を使っています
データシートは熟読するものじゃねえと思うデスよ。 あれは辞書と同じで使いつつ覚えるもの。
156 :
デフォルトの名無しさん :2009/08/01(土) 20:23:06
メモリ構造とアルゴリズムを直接リンクできる唯一の言語
いくらアセンブリ言語と言えども、それ自身が入出力をすることはできない。 できるのは、OSに指示を出すだけだ。またはハードウェアに。
データシート熟読するのは組み込み系のプロセッサだろう。
>>158 のほうが意味不明だな
>>156 はスレッデッドコードみたいな技法のことを言いたいんだろうか?
なんだそれw 超エスパーだなw
アセンブリでOSのAPI使えんの?
当然出来る。
>>162 int割り込みでコンソールIOってのが一番分りやすい例かも。
アセンブリ言語以外の言語でいうAPIとはかなり毛色が違うが、これもAPIの一種…というかAPIの元ネタだよな。
Windowsとかでも、カーネルモードへの入り口としてSYSENTERって形で残ってる。
ラッピングされてて普通は触らないというか触れないが。
今時のOSなら単純にcallすればいい。
Linuxだとsyscall番号と引数をレジスタに設定してint 0x80で システムコールを発行できる。
>>166 それって何の意味があるの?
callと比べて
callと比べる意味ってどこにあるの?
>>167 >それって何の意味があるの?
そうゆう決まりになってるから
>>167 callだとlibcをリンクしないといけないだろ。
少しは自分の頭で考えろよ。
ああ納得w linuxのABIは酷いからな それらに影響されたくなかったわけか
スタティックリンク前提の方が醜くね?
だからそう言ってるのか。
linux板住人も酷すぎる
int で呼んでるのは別にLinuxだけじゃないんだが
でもlinuxが酷いことに変わりはないよね
元々BIOSからしてint呼び出しになってたし DOSもそうだった。 386BSDは確かコールゲート経由だったが それ以外は多くがintだな。 今は結構sysenterになってるみたいだが。 例えばNT系のWindowsも、システムコールはint2Eだという話を聞いた覚えがある。 信憑性は知らんが。 その手のシステムコール呼び出しを POSIXならopen()というAPI、Win32ならCreateFile()というAPIとして公開している、という点では皆同じ。
ToolBoxはAライントラップだったっけ。
酷いって何が酷いんだ?馬鹿じゃないの?
XPはsysenterをサポートしてないCPUでも動くっぽいからint 2Eはサポート してるはず。 LinuxでもCPUに応じてsysenterやsyscallを使える。
182 :
デフォルトの名無しさん :2009/08/05(水) 06:24:33
NOPさん 今日は何をするのかな〜 「ウホホホホウホ」 おやおや ゴン太くん 今日も張り切ってますね
183 :
デフォルトの名無しさん :2009/08/06(木) 21:12:03
>>166 ,167,168
これって、カーネル2.25辺りまでしか使えないのでは?
カーネル2.30ではこの仕様ではないですよね?
>Linuxだとsyscall番号と引数をレジスタに設定してint 0x80で
>システムコールを発行できる。
いつのまにそんなすごいバージョンのカーネルが出たの?
システムコール使えなかったらどうやってカーネルモードとユーザーモードの橋渡しするんだよ… ロクな事にならねぇぞ
その「システムコール」とsyscallは意味がちょっと違う。
>>183 アホか?使えるに決まってるだろ。使えないと思う理由は何だ?
188 :
デフォルトの名無しさん :2009/08/22(土) 18:58:58
書いた本人ですら理解しかねるようなアセンブリコードで オープンソースとか嫌がらせ以外のなにものでもないよ
ageるのは馬鹿ばかりだな
>>188 おっとGNUやLinuxの悪口はそこまでだ。
アセンブラはソースにインデントがないから楽だよなあ。 インデントのある言語は、そこで俺の思考も一緒にインデント されてしまうから、思考が続かないんだ。
大抵は思考を分割しないと内容を把握し辛いからインデントしたり関数分割するのだと思うが、191は分割が苦手な変わりに直線的に広大な範囲を把握できるって事なのか…? それはそれで凄いのだろうが、書いたソースを読みたくないな。
改行のないレスも読みたくないな
>>191 は配置転換でいきなりPythonを使わされることになったコボラー
BASIC−アセンブラとやってきて、現在はコボラーだけどね。 COBOLも、制御構造が導入されてから読みにくくなった。 インデントが多くなったし、外PERFORMでやたらと処理を外出しするので 飛んでから戻ってくるのが大変だ。 やっぱアセンブラだね。 アセンブラが主流の開発現場ってどういうのがあるんだろう。 天職に転職したい、なんちて。
アセンブラもインデントする 外出しもする
>>195 4bitCPUとかならアセンブラが主流。
つうかそれ以外の選択肢がない。
AVRでgccバリバリ使ってますが 最適化-Osは結構アホなのでインラインアセンブラも使います
>>195 外出ししないのはBrainF*ckくらい
アセンブラって外出しする構文あったっけ? BASICで言うGOTOはあるが、GOSUBはないよね?
CALLとかBSRとか 命令単体で無くても組み合わせでつくれるだろ
>>200 お前アセンブリプログラミングしたことないだろ
GOSUBどころか関数呼び出しが出来るアセンブリ言語なんていくらでもある
ホントかよ。 6502と68000をやっていたが、 戻り先を指定しないRETURN的な 構文はなかったような気がするぞ。 今のCPUは違うのか。 世の中の言語が俺に合わせてくれないなら、 自分で作るしかないな。 インデント禁止、分岐はラベル指定ジャンプのみ、 構造化なし、オブジェクト指向なし、ソース分割禁止、 変数はアルファベット一文字のみの俺言語を。 やってみるぜ!
どちらもRTSというニーモニックでサブルーチンから戻る命令があるだろ? おまえは何をやってきたんだ。
これだからコボラーは・・・
失礼だろうと思って書かなかったが、端にも棒にも掛からないくらいのアホでしたか。
しかもコボラ・・・
>>197 あと、ICカードレベルの極端に制約のある組み込み系と、カスタムLSI/CPUがある系もアセンブリ言語が結構必要な気がするんだが。
前者はメモリ容量と演算速度の制約があるから付加機能を持たせたかったらアセンブリ言語ナシだときつそうだし、後者はカスタムした命令セットの操作に必要になってくるだろう。
・・・インラインで済むかもしれないが。
やはりコボラーは馬鹿なんだな 関数呼び出しも知らずに仕事でコーディングしてたと思うとぞっとするわ
ハードウェアスタックがないのはIBMメインフレームの特徴だしな。 そっち方面一筋だったとしたらしょうがないかもしれない。 いちじるしく不幸だと思うが。
>>203 これ、コボラですらないだろ。
煽りたがりの嘘つき中学生。
>>203 は煽りか、やっぱり。いい年したオヤジが「俺が」「やってみるぜ!」
…自分の親父と同世代だとすると、吐き気がするw
>>204 RTS、調べてみたらあるね。
俺のいた職場では教えてくんなかった。なぜだろう。
まあどのみち使わないからいいんだけど。
では、これから理想の俺言語を作るからさらばだ。
C言語を勉強して、言語仕様を設計して・・・20年はかかるかな。
いいライフワークになりそうだ。
> 俺のいた職場では教えてくんなかった。なぜだろう。 > まあどのみち使わないからいいんだけど。 んなわけねーだろ
上司部下そろって向上心も技術力も無い職場だった、と。 やはりコボラは害にしかならないのですねー・・・
関数ではなくてプロシージャと呼んで欲しい。
元々は返却値があるのを関数、無いのは手続き/プロシージャ とか呼んでたよね。 (Fortranの時代) cでvoid型も関数と言うようになってから、関数と手続きの区別が曖昧に なってきた。オブジェクト指向が登場して手続き型言語が叩かれるようになり、手続きという 単語そのものも嫌われるようになっていった。 くくり出しの概念自体は一緒なのにね。
関数のvoidはvoid型を返す関数なんだよヴォケ
昔の参考書とか、あと現在でも大学の一般教養レベルだとCのmain関数が void main(void){ とか main(){ で始まってたな。これって、86系アセンブラだとah=43h/int 21hのDOSファンクションコールで alの値を指定しないのと、本質的に同じだよね。これはアセンブラの場合、容量とかの 都合で指定しなかったのか、戻り値をDOSに返すのはどうでもよかったのか? いまでもアセンブラ解説サイトの大御所でたまに散見される。
今時プロシージャとか使いたがる奴は確実にオッサン
DOSへ返す戻り値は重要じゃないな。バッチファイルでエラーコード見て分岐とか ほぼ使わないし。連続して処理を繰り返すなら復旧可能なエラーでプログラム終了 させてDOSへ戻るなんて馬鹿馬鹿しい。続行不可能なエラーならエラーコード吐いた ってOSが後始末してくれるわけじゃないし。自前で後始末しなけりゃいけないなら、 エラー処理もプログラム内でやって、続行不可能になったらエラーメッセージ吐いて abortした方がいい。 というか、正常終了で0を返さないと誤動作する糞OSってあんの?
>>217 Cで返り値の型を省略したら普通は整数型として扱われる
221 :
217 :2009/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に戻すコードはあまりなかった、自分のみた範囲では。
元々数学の意味では副作用がないのが関数なんだから、 最初から用語の意味はブレてたんだよ。 void main は、 仕様書読まずに教科書を書くバカがいた、でファイナルアンサー。 少なくともANSI以後については。
アセンブリ言語系の話題のサイトで見かけるのは、 そういう人たちはC言語の仕様をどうでもいいと思ってる (仕様なんかどうでもいい、コンパイラの動いた結果が全て) という人がいるせいかもしれない。
数学のfunctionは函数だから、関数はぜんぜん違う物だと思えばいい。 っていう意見もあった。 逆にC言語の話してるのに函数だって譲らない人もいた。 ま、いろいろ。
そのロジックだとHaskellとその近辺は函数型言語 Lispとかは関数型言語という使い分けができるな。
スレ違いもいい加減にしろ
参照しないんだから値は不定でいい。 だからmov ah, 4chでいい。
DOS使ってた頃はERRORLEVELやmakeで参照しまくりだったがなぁ
>>219 誤動作はしないが、一々警告が出るOS(正確にはGUI型コマンドインタプリタ)は実在した。
DOSだとかジジイばっかりだな
>>227 だったらいっそ int 20h か ret でいいじゃない。
>>217 int main(void)
は正しいだろうけど
void main(void)
はとても有名な間違いで、本来は違反じゃなかったか
それに型省略は暗黙でintってのが(C++には無いけれど)Cには有ったはず
>>218 MSDNでもそこかしこにプロシージャという単語やその名残が有ると思うんだが
でも関数の方が呼びやすいのでそう読んでる自分
>>219 Makeとかその辺の奴に食わせる場合は戻り値必須。
コンパイラとかもちゃんと値返してるんだぞ
>>221 void mainとか、C「言語」とかと同じで、間違いの文化の中に居るのさ〜
>>232 > void main(void)
> はとても有名な間違いで、本来は違反じゃなかったか
つc99
でも型を規約で無意味に強制されると 無限ループで戻らない処理では論理が破綻するからやめてほしい。 戻らないんだから値は返しようがない。
void main(void){ int a=0; printf("%d", a); } このときのALはprintfの戻り値
>>233 C++では、「return 0; の省略」は許されるけど、
「void main()」が許されているわけじゃない、というのは俺も知ってる。
C99はよく知らないけど、
C++とは違って void main() も許されるようになったのか?
少なくとも、その間違いを喧伝していた絶頂期にはC99は存在しない。
>>235 実際やればそうなることが多い気はするけれど、保証動作では無いような・・・
俺、組み込みばかりだから void main(void) がもう刷り込まれちゃってるよ。 出るのはmainからじゃなくて、電源断がNMIにつながってるときだけだし。
>>238 組み込みならスタートアップ指定するだろ
mainなんてわざわざ呼んでたら復帰アドレス分のスタックがもったいない
printfの戻り値w
まあcall mainじゃなくてjmp mainだよな 大抵のスタートアップコードはアホだから修正が必要だ
stack+1してからcallmain
bra _main
関数の戻す型は、関数の脱出処理だけでなく、 関数の呼び出し処理にも関係がある。 だから、戻らない関数だから関係ない、とは言えない。
PICのスタックは8段しかない
8bitなPICでC言語を使うのが間違っているような気がしないでもない。
kwsk
PIC18やAVRなら実用的だよ PC16以下は死んでいい
249 :
デフォルトの名無しさん :2009/09/22(火) 16:01:47
HALT ?
nop nop nop nop . . .
251 :
デフォルトの名無しさん :2009/09/23(水) 14:43:34
最終的に機械と同化してしまい こちらの世界に戻れなくなるぞ
mov eax,cr0 or eax,1 mov cr0,eax jmp @@tengoku @@tengoku:
そこは天国なのか? つまらん壁はなくなるが、色々監視されて鬱陶しいことになったりするぞ。
そこでセグメントのリミットを4Gに設定して そのままリアルモードに戻ったところが本当の天国
シングルタスクが天国? マルチタスクの方が圧倒的に便利でしょ
>>255 リアルモードでマルチタスクができないって話は聞いたことないな
なんでいきなりシングル/マルチタスクの話を始めたのかと思えば なるほど、そーゆー恥ずかしい勘違いをしてる人だったのか。
ノンプリエンプティブかプリエンプティブかで、だいぶ話がかわるな。 あと、保護のある環境を天国と見るか、ない環境を天国と見るかは 意見の分かれるところだ。
259 :
デフォルトの名無しさん :2009/11/23(月) 13:16:47
保護のある環境だと機械語で書きにくそう
I/Oとかの特権命令を使いまくった何かを作りたいならそうかもしれないけど、 保護で落とされるのは、あらぬアドレスにアクセスしたとか、おかしな動作 だから、普通のコードを書くぶんにはたいして変わらないよ。
MASMからVC++用スタティックライブラリの関数を呼ぶ方法を教えてほしい
スタティックライブラリのアセブラソースをみる
pushしてfarcall
VC++が生成したASMファイルは↓で呼び出してるけどリンクできない 無理だったのであきらめた・・・ call ?function@namespace@@YAHXZ:PROC
GetProcAddresすればいいんじゃね?
まずは、extrnとかでちゃんと外部シンボルの宣言をしているか、ということ 次に、ちゃんとlibを指定しているか、ということ 後者は、コンパイラに#pragma comment(lib,..)を出力させて、 アセンブラディレクティブでどうなっているか確認することで アセンブラコードの内部で対応できるかもしれない。
バイナリいじって一時的に別名つけるとか。 たしか「?」とかはそうしないと無理だった気がする。
Mac 買ったら NASM が入ってた。 勿論 gas も入ってるけど、何か新鮮。
MacsBug for x86とかついてきそうだ。
懐かしいな…
tasm32でvc60とlinkできるぞ。objの形が違うとwarning出るけど。
masm32 nasm gas 学習用途ではどれがオススメですか? ちなみにターゲットはx86オンリーでdos、win、linuxあたりです。
あえてのnask
>>272 学習用途ならCASLに決まってんだろ!
linux含む時点でmasm32は消えるな 学習用途な時点で癖のあるgasは消えるな x86オンリーならx64なnasmは消えるな すると残るのは・・・やはりCASLしか無いね
asm80
277 :
デフォルトの名無しさん :2010/03/08(月) 05:38:16
機械語最強
>>272 正道に勝るもの無し。
MS純正のMASMとIntelが配布してるデベロッパーズマニュアルの組み合わせが一番良い。
どうしてもgasを使うなら.intel_syntaxディレクティブを「必ず」指定する事。
どうせならdosとlinuxを捨てなさい。現実的な選択肢とは言えないから。
279 :
デフォルトの名無しさん :2010/03/08(月) 10:22:30
マシン語やれよ x86ならオペコード表とModRMの使い方マスターするだけでかなり読み書きできるようになるから アセンブラの構文がどうとかみたいなどうでもいいことが気にならなくなる
機械語はできる前提のスレなんだが。
>>279 は今更何言ってんだ?
アセンブリ言語および機械語の総合スレが落ちて、そこらへんにあった それ系スレを適当に潰してる状況だというのに何を言うか。
∩_∩ 人人人人人人人人人人人人人人人人人人人人人人人人人人人人人 / \ /\ < なんだろう。 > | (゚)=(゚) | < > | ●_● | < > / ヽ < > | 〃 ------ ヾ | < > \__二__ノ YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
>>279 自分はそれに気付くまで大分遠回りしたわ…
先にマシン語をちょっと齧っておくと大分理解が速いよね。
>>275 NASM が x64 ってどういう事?
x86 でも使えるでしょ。
ようやく突込みが入ったか これで安心して死ねる
>>272 一つに絞らず、それぞれのプラットフォームで一番使われてる物を選んだ方が良いよ。
その意味で、Windows でやる時は masm を、Linux の時は gas を使うと良いと思う。
勉強がある程度進めばシンタックスの差は誤差である事に気付くと思うけど、どうしても
気持ち悪いと思ったら、その時に nasm を選択すると良いと思う。
誤差じゃねえよ!ニモニック自体違ってるじゃねえか!
またコンパイラ自作か!
普通のアセンブリのスレとかないみたいなんで、アセンブリのデバッグとか ここで聞いちゃっていいですか? C と一部アセンブリ (x86) で書かれたプログラムを gdb でデバッグしているのですが、 アセンブリ区間に入るとバックトレースが正しく表示されないことがよくあります。 おそらく、関数呼び出し (call やスタック操作の伴う jmp) でなく単純にラベルに jmp したりしている部分があるからだと思われます。 結果、プログラムの流れが追いづらいです。例えばアセンブリのどこかでコケてて gdb がそこで停止しても、どこから来たかがよくわかりません。 こういうのってうまいデバッグの仕方はあるんでしょうか。
そのコードは誰が書いたの?
>>288 lst と map みりゃわかるだろう。
>>288 アセンブラ部でダミースタックフレーム作ってみたら?
どうせ %ebp とか別用途で使っちゃってると思うけど。
>>288 アセンブルする時に -g (だっけ? デバッグ情報を出力する奴)を忘れてるんじゃないの?
あとはリリースビルドだから分かりにくいとか。
そして最終的には
>>290 。
293 :
288 :2010/05/28(金) 18:26:27
どうでもです。
>>289 他人が書いたのを修正しつつメンテしています。
>>290 えっと、アドレスとの対応関係がわからないというのではなく、プログラムの
「流れ」が分かりにくいと書いているのですが....
C で goto 使いまくりのコードだとデバッガで流れを把握しにくいですが、たぶん
自分の質問はそれと類似なのかなと....
あと、C の中からアセンブラのルーチンを呼び出すようなコードで、 gdb で
アセンブラ部分をステップ実行していると、ラベルを通過したときに一番トップの
フレームがそのラベル部分であるかのような表示になりますけど(よね?)、実際
にはそこでフレーム操作がなされているわけではないので、それを期にそれ以前
のフレームの表示がおかしくなる? ような気がしているのですがどうでしょう。
でそういう意味で
>>291 さんのヒントなどは参考になるかと思ったのですが、
いまさら一個一個スタックフレームを作るように書き直すのはしんどいw しそれに
その分効率も落ちるのかも(デバッグ終わったら消す? gcc の -fomit-frame-pointer?)
日本語でどうぞ
>>294 それは本当に日本語の問題なのかな...
仮に日本語として通じても結局うれしい回答は得られなさそうな感じがしているので
もういいかなというのもあるんですがw
アセンブラじゃ、gdb用のデバッグ情報が埋め込まれないから 何が起こってもしょうがないでしょ
asmに飛んできたときのスタックポインタから 積まれているアドレスを見て、lstとmap見て追えばいいよ。 とりあえず、gdb自身に期待してはいけない。
あのアセンブリ言語をやろうとしてるのですが MASMとNASM、始めるとしたらどっちがいいですか?
何するの?
masm
>>299 何するというよりもアセンブリ言語を覚えたいなと思いまして。
>>300 ありがとうございます。
両方やればいい 違いがわかる ついでに68系もやった方がいい
勉強するだけなら c のインラインasmでもいいんじゃね。 あるいは、debug.exeでもいいな。 a=100でgね。
>>302 両方ですか。がんばってみます。68系でやるとしたらおすすめとかありますか?
>>303 ありがとうございます。参考にさせてもらいます。
CPUのアーキテクチャを知ろうという目的を持つといい。 変数を演算=メモリからレジスタへロード・レジスタ演算・メモリへ書き戻し とかいう機構が見えてくる。
実用的な物を作るならMASM 学習目的ならNASMかGas
VC++の64bitはインラインアセンブラ捨てたからなあ 何でなんだろ?
>>305 ありがとうございます。目標ができました。
>>306 ひとまず、NASMとかdebug.exeをやっみて、馴れてきたらMASMという感じでやってみたいとおもいます。
309 :
デフォルトの名無しさん :2010/09/28(火) 20:26:51
CASLIIで数桁の数値を文字列として出力するPがいまひとつうまくゆかない PUSHPOPで格納呼び出しするんだけども アドレスおなじとこに格納しちゃう ちゃんとLADしてひとつ送っているはずなんだけども
310 :
デフォルトの名無しさん :2010/09/28(火) 20:29:19
少しかんがえてみます
ソースをうp
DSPLY START LD GR1,=321 LD GR6,TWO ST GR6,COUNT DIV10 LD GR0,ZERO DLOOP CPA GR1,TEN JMI DJUMP SUBA GR1,TEN ADDA GR0,ONE JUMP DLOOP DJUMP LD GR3,GR1 ADDA GR3,#0030 PUSH 0,GR3 CPA GR0,TEN JPL AFTER LD GR3,GR0 ADDA GR3,#0030 PUSH 0,GR3
POPPER LAD GR5,ANS ADDA GR5,ONE ST GR5,ANS CPA GR6,ZERO JZE OUTPUT SUBA GR6,ONE POP GR3 JUMP POPPER AFTER ADDA GR6,ONE LD GR1,GR0 ST GR6,COUNT JUMP DIV10 OUTPUT LD GR6,COUNT SUBA GR5,GR6 ST GR5,ANS OUT ANS,COUNT ONE DC 1 TWO DC 2 ZERO DC 0 TEN DC 10 ANS DC 0 ADDR DC 0 COUNT DC 3 END こんな感じです アスキー表示ながめてて、PUSHが良好に格納されてるのは確認しました POPがまずいみたいです あと再格納もへたっぴ
ソースを貼るときはcodepad使え
ア セ ン ブ ラ の 弱 点 縦 に 長 い
自己解決しつつあります 格納は完璧に321となりますた あとはPOPと再格納をしくじらないのみ
PUSHとPOPの関係がわかりづらすぎる きちんと対応が取れているのか? 321で成功しても他の数値で成功するのか疑問
や それはたぶんだいじょうぶ 今PUSHでなくやろうとして、領域確保がマイナス方向には無理と悟って 手書きで再考するとこです アスキーの挙動みつつ微調整しようと思います ロジックはそほど難が ないようなので(割り算の仕方とか 桁カウンターが甘いので詰めます
ラベリングしてない数値って割と我儘と知って前に進みました
#0030ってのはアスキーコードの数字文字列にしてねという期待なんですよ ところがCASLくんは#0030番地の値をロードしていたっぽいです
今 3 のみ出力されました 希望の光。
最大桁決まってんなら上から引いていくほうが 分かりやすくない? 最大 65535なら たとえば4927なら 10000を引いてみる→引けた回数→0を格納→次の処理に4927 1000を引いてみる→引けた回数→4を格納→次の処理に927 100を引いてみる→引けた回数→9を格納→次の処理に27 10を引いてみる→引けた回数→2を格納→7が余る→7を格納 これなら最大(桁数-1)*9回の引き算でできる
それ考えたんすよ しかし素数求数に使いたいんすこれ だもんでいずれはバイト長を無限に対応した桁を 扱えるルーチンでと思いまして 素数の思考ルーチンはもうできてるんす CASLの癖なのかマシン語ってそうなのか たかが数表示で こんなに手間取るとは。
となると最初から10進数で扱ったほうがいいね マシン語じゃ"hello world"すら大変だって
’A’と’B’を連結して AB と表示するのは書けたんで気をよくしてました あまいあまいおれ。
>>326の結果が 偶然(Aの直後にBを置いていたので とわかりました。まだまだ遠い道のりとなりますた
zipでupした方が早くね?
z、zipじゃ見ないからね!絶対見ないんだからね!勘違いしないでよね・・
ん、zipじゃ見ないな
yz1でたのむ
いまどき熱心にCASLをやってた人は完成したのかな?
CPUにはせすにみかはとかないはずなのにどうやってよぶの・
画面に出力する装置と繋がってるアドレスがあって、そこに書き込む
336 :
デフォルトの名無しさん :2010/10/14(木) 11:21:43
lea ecx, [eax + 128]と書かれていますが意味を教えてください。 add eax,128としGlobalAllocにeaxを引数で指定するのが分かりやすいと思うのですが なぜleaを使うのか、その第2オペランドの [eax + 128]の値の意味も教えてください。 ソースは以下です。 www.masm32.com/board/index.php?board=4;topic=1929.4 GetFileSizeでサイズを取得して、それより128バイト以上大きなメモリを GlobalAllocで確保するところです。
leaの方が速いから
invoke内部の型変換等でeaxとedxを使用する可能性があるため 実際には関係ない場合でもinvokeの引数にeaxとedxを使うのをさける人がいる
339 :
デフォルトの名無しさん :2010/10/14(木) 11:59:26
>>337 ,
>>338 ありがとうございます。
[eax + 128]というのを見ると予測不能な値のように思えてしまうのですが
これでファイルサイズ+128が確保できる理由が分かりません。
eaxはinvoke GetFileSize,[file_handle],NULLが完了したままで
ファイルサイズの値が入っていますよね?
たとえばファイルサイズが7バイトだったとしたら、7+128のポインタなんて
予測不能な値ではないですか?
ARMのようなRISC系だと ADD R0, R1, #128 みたいにロードとストア先のレジスタを別々に指定できるが、 x86のADDはロードストアが一緒なので、 結果をECXに代入したい場合でもADDを使うと MOV ECX, EAX ADD ECX, 128 としか書けない。これは命令長も増えるし遅い。 LEAの間接dispを使うとその辺を1命令で記述できる。 ステータスレジスタの影響から選択する場合もある。
昔はセグメントレジスタの値が影響した
344 :
デフォルトの名無しさん :2010/10/14(木) 19:37:51
>>340 コンピュータではなくて僕の方です。
以下と同様に見えました。
int i=7;
int *p = &i;
int yosokufunou = *(p + 128);
345 :
デフォルトの名無しさん :2010/10/14(木) 19:45:18
「WOLF RPGエディター」とは? ・高度なRPG開発が可能な、完全無料のゲーム作成ツールです。 ・雰囲気はRPGツクール2000に近い。RPGツクール2000で自作システムを作りこむ際に 不満だったところがいろいろ解消されていて、かなり自由度が高いです。ただし その分初心者には難しいかも。すでにツクール2000で自作システムを組むのに 慣れた人やRPGツクールでは物足りないけどプログラミングはちょっとという方にお勧め。 ・作成したゲームは自由に配布したり、コンテストに投稿することも可能。 また本ソフトを持たない人でもプレイ可能!ファイル暗号化も完備してるよ! ・要望、不満点、バグ報告などなど書き込みお願いします。今もどんどん進化中です。
346 :
デフォルトの名無しさん :2010/10/14(木) 20:12:31
>>341 確かに以下で意図は伝わりましたが間違っていましたね。
add eax,128
347 :
デフォルトの名無しさん :2010/10/14(木) 20:37:51
pic詳しいかたいませんかは
348 :
デフォルトの名無しさん :2010/10/14(木) 20:38:28
>>343 []はC言語のアドレス演算子に見えましたが、lea ecx, [eax + 128]は
C言語ユーザはmov ecx,(eax+128)のような視覚的なニュアンスで解釈してよいですか?
>>348 置き換えとか考えないで、leaの意味を考えましょう
寧ろ、lea ecx, & 128[eax]
352 :
デフォルトの名無しさん :2010/10/14(木) 22:45:45
>>350 leaはC言語のアドレス演算子だと思っていました。
.data?
buf1 db 512 dup(?)
.code
lea edi,buf1
これがp_str = &bufみたいなものだと思っていましたが、
lea ecx, [eax + 128]の場合はアドレスではなくて即値みたいなので
アドレスとは関係のない動作みたいに思いました。
353 :
デフォルトの名無しさん :2010/10/14(木) 23:07:11
>>351 MASMコンパイルで&がsyntax errorでした。
そうじゃなくて、Cとして解釈するなら& 128[eax]だってこと。
cから考えるんじゃなくて、asmから考えろ。 lea はCの〜とかっていう思考はいらない。
だな。Cさえよく判っていないようだし。
x86の命令体型はC言語を意識してないよ。
358 :
デフォルトの名無しさん :2010/10/14(木) 23:58:40
>>354 leaは変数のアドレス取得と、加算演算という2つの利用方法がある
という解釈でよいですか?
>>351 のイメージはつかめませんでした。
LEA (Load Effective Address)
[]が違うってのは迷うところ mov eax, [eax + 128] lea eax, [eax + 128]
361 :
デフォルトの名無しさん :2010/10/15(金) 00:55:35
[]もアドレス演算するためのものだと思っていました。 mov eax,7+2 と mov eax,[7+2] と mov eax,9 は同じですか?
使うx86のアセンブラがどう解釈するか調べないと intel形式は、あんまりみないからな、最近
>>361 mov eax, 7+2 ;eaxに9が代入 (アセンブラが7+2を計算するのでmov eax,9とマシンコードは同一)
mov eax,[7+2] ;eaxに9番地のメモリ内容が代入
mov eax, 9 ;eaxに9が代入
364 :
デフォルトの名無しさん :2010/10/15(金) 01:22:15
>>363 それを見ると[]はアドレス演算子に見えます。
9番地のメモリ内容は予測不能な値だと思いましたが
実際に動作させるとmov eax,[7+2]でeaxの値は9になりました。
9番地のメモリ内容が9だったのは偶然とは思えません。
365 :
デフォルトの名無しさん :2010/10/15(金) 01:31:22
アクセス違反で前の値が残ってるとか
366 :
デフォルトの名無しさん :2010/10/15(金) 01:44:00
>>365 そう考えたので
mov eax,0
mov eax,[7+2]
.if eax==9
、、、
と書いて9になっていることを確認しました。
じゃあ9なんじゃね
368 :
デフォルトの名無しさん :2010/10/15(金) 01:50:24
>>365 違いました。366ではだめですね。
アドレス9に0などを書き込むソースが分からないので実験できませんでした。
369 :
デフォルトの名無しさん :2010/10/15(金) 01:53:06
>>367 368にも書きましたが、勘違いな実験をしていました。
偶然の可能性は少しはあるわけです。
はっきり確認できたらよいですが。
それより、mov eax,[7+2]でeaxの値が9になることが
正常な結果であれば理由が知りたいです。
どんな環境(汗とか)でやってるのか、わからんのに
371 :
デフォルトの名無しさん :2010/10/15(金) 02:10:52
MASM32のml.exeでコンパイルしています。
mov dword ptr [9],0
373 :
デフォルトの名無しさん :2010/10/15(金) 03:30:10
>>372 ml.exeがエラーを表示しました。
immediate operand not allowed
下のようにしてもだめでした。
mov edx,0
mov dword ptr[9],edx
次のようにするとコンパイルできましたがアドレス9に0を代入する目的が果たせていません。
mov edx,dword ptr[9]
mov edx,0
mov eax,[7+2]
.if eax==9
mov edx, 9 mov dword ptr [edx], 0 ニーモニックを意識しなさい
375 :
デフォルトの名無しさん :2010/10/15(金) 04:28:16
>>374 ありがとうございます。
mov edx, 9
mov dword ptr [edx], 0
mov eax,[7+2]
コンパイルできました。実行するとエラーになりました。アドレス9は偶然、Windowsの
急所だったみたいで、Windowsがエラーダイアログを出して実行を阻止してくれました。
こうなったらmov eax,[7+2]とmov eax, 9が同一なのかをきちんとした定義で
知るしかないですね。教えてください。
もう教えることはありません ご立派に成長なされました
アセンブルリストを出すとか 逆アセするとか でわかるでしょ
win32環境なら、ddeb あたりで試せば?
判らんと思うよ。ろくに判っていないCに擬えようとしている限り。 leaの特殊性にちっとも気付いていない。
CASLで数値表示に挑んでいた者です 本日完成しました なかなか骨が折れました 命令語をよく把握していなかったのが原因でした
オールアセンブリ言語のプログラムで組んだ 最も容量のでかいプログラムってどれくらい? 俺は40kbくらいかな
約3trackか
AVRみたいなマイコンですらフルアセンブラで書く機会は非常に少ない インラインで済ましたりタイミング関係で一部モジュールで使う程度 ゴミカスのPICは知らないケドwwwww
MSXのゲームで32kくらいかな
全てを一人で書いたわけではないが、 ひとつのプロジェクトで1Mいくよ。
いつの話か知らんけど そんなアホなことしてる会社はもう潰れただろ
昔の情報家電はオールアセンブラも珍しくなかったよ。 FAXとかワープロとか、独自OSに独自GUIライブラリ構築なんてざらだった。
>>387 今も現役だよ。
まぁ知られていだろうが、
数十年続いてるし、世界トップシェア。
とはいえ、市場が限られているので、
外部に情報でないだろう。
ちなみにパチじゃないよ。
どうしてもアセンブラでないと書けないモジュールについては別として、 C言語に移行できない理由は?
は? Cにするメリットなんてないだろ?
392 :
デフォルトの名無しさん :2010/10/18(月) 13:31:14
お前が突然死んでもCできる奴がコード変更できるだろ
アセンブラよりCの方が簡単だと思ってるひとって
ま、簡単だろうな 第一圧倒的にプログラミングできる人間が多い おまえの業界は知らんけど
なんかソース貼ってからほざけよ アッセンブリソーーーースプリーーーーズ!!
そりゃ抽象化が全く理解できない奴にはアセンブラのほうが簡単だろうな。 「足し算を繰り返せばいいだけじゃん、掛け算なんてイラネ」とか言い出しそうな奴w
Cもアセンブラも同じくらい簡単なのは当たり前 どちらも並程度の知能すらなくても事足りる あえて比較するならCの方がCPU等を変えた時に確認すべき事が少なくて楽
398 :
388 :2010/10/18(月) 14:58:23
当時の家電業界は、誰かが積極的に(自分のプライベートの時間を消費して)アピールしない限り 何かを変えることなどできなかったと思われ。なんせ、アイコンデータもデザイナーの絵を方眼紙に写し取ってドットを数えてたし。 新機種開発の時こそそのチャンスなのだけれど、蓋を開けてみたらUI部分だけCに移行していて 従来機種からソースを流用している通信部分は(殆ど書き換えにも拘らず)アセンブラのままなんてことも。
>>390 その言い方をするなら、
基本的に、ほぼ全てがアセンブラでないと書けない、
ってことになるかな。
コーディング自体はCでも不可能ではないだろうが、
結局アセンブラを見ることになるから、
余計な手間が増えるだけになる。
普通、入出力をしてるとか、プロセッサの特殊なレジスタや機能を使ってるとか、 スタックを触ってるとか、そういうコードのことを「アセンブラでないと書けない」って 言うと思うの。
そういったコードも高級言語から生成したりするので余り関係ない
すんません、コイツは電電板のPICアセ爺だと思います 適当に相手しといてください
やです。
コード上げてくれよ 凄いやつなんだろ?
お断りします
406 :
デフォルトの名無しさん :2010/10/22(金) 00:15:49
APIでエラーが発生したら0以外を返すものをCALLした場合にCALLの次で TEST EAX,EAX とされていましたが、この式はEAXが0か0以外かを判定するのに使えるのですか? APIが0を返したならTEST EAX,EAXでZFが1になり、APIが1を返したなら EAX,EAXでZFが0になるのでしょうか?
test は、 and と同じ演算を行い 結果をフラグだけに反映させる。
APIとかの名前書いてcall するけど CPUに理解できるの?
DLL名+API名に見えるけどDLL名+エントリーナンバーじゃないかな
DLL名+エントリーポイントじゃないかな
CPUは理解などしない。ただフェッチしてデコードして実行するのみ。
実行してるかどうかもあやしいけどな
実行したくせにその結果を捨ててしまうそうじゃないですか、最近の CPU は。
OSが解釈してDLLの所定のアドレスにcallする
アセンブリ言語でプログラム作ろうとしても、 MS-DOSモードでの説明が多いようだが、 Win32の実行ファイルのフォーマットを理解 すると共に、それに合ったプログラミングっ てどうやって学習すればいいのか。
Win32API関数を使うプログラムなのに、何で先頭に 『This Program Cannot Be Run in DOS Mode.』 がないアセンブリコードなのか疑問だ。 Win32プログラムのアセンブリコードを、nasmとか masmで説明通りアセンブルしたはずなのに、なぜか エラー多発になったり訳わからんな。
> 『This Program Cannot Be Run in DOS Mode.』 それは実行ファイル生成時にリンカがくっつけるstubだから。
卒塔婆
それはサンスクリット語のストゥーパの漢語訳
420 :
デフォルトの名無しさん :2010/11/28(日) 22:13:15
スレチだと思うけどアセンブリ関連のスレあまり見つからなかったからココで聞く アセンブリ言語を学んでみたいんだけど 必要なものってコマンドプロンプトだけ? 一応OSはwindows7 64bitなんだけど・・・
debug コマンドで全て済ませるならそれでいい。 そんなやりかたでは、独学だと挫折するだけだと思うけど。 本屋か図書館で本を選んで、それに従うことを勧める。
Win7の64bit版にはdebug.exeなんて入ってねーよ
423 :
デフォルトの名無しさん :2010/11/29(月) 17:13:50
結局win7 64bitの場合どう学習すればいいの?
64ビットと32ビットの違いは理解してんの?
>>423 Visual C++ Expressに入ってるmlとか
他にも探せばタダで使えるアセンブラがいろいろあるだろ。
結局質問に答えられない屑ばかりだということか……
アセンブラを扱える知識があるのかどうかわからないのに、 答えがほしいだけでは...
Win64の本出てるよ、赤い表紙のやつ x86-64の本は見たことないな……
nasmならx86-64サポートしてるようだな
>>426 おまえ 2ch は初めてか?力抜けよ?
AMD64のVC++でインラインアセンブラが禁止されてしまった理由ってなんだろう? RDTSC命令なんて普通に使うと思うんだが
.NET普及のためか 64bitのアセンブラに対応するのが面倒だったか
こういうこと言うとお前がマヌケなのが悪いと言われるかもしれないが VMのある言語の方がいくつかのプレッシャー(メモリ管理、まずい命令など)が軽くなっていい SIMDを酷使することができないとか、性能的余裕がないとか コンピューターの仕組みを知る題材として学んでるだけだから関係ないとか そういうのはまあVM付きじゃ駄目かもしれない
動作周波数が上がったから、最適化のBUG取りするのが馬鹿らしくなっただけでしょ
437 :
デフォルトの名無しさん :2010/12/04(土) 23:11:18
アセンハマチ言語
438 :
デフォルトの名無しさん :2010/12/05(日) 02:04:35
lヽ ノ l l l l ヽ ヽ )'ーーノ( | | | 、 / l| l ハヽ |ー‐''"l / D | | |/| ハ / / ,/ /|ノ /l / l l l| l D ヽ l ・ i´ | ヽ、| |r|| | //--‐'" `'メ、_lノ| / ・ / | V l トー-トヽ| |ノ ''"´` rー-/// | V | | ・ |/ | l ||、 ''""" j ""''/ | |ヽl ・ | | D | | l | ヽ, ― / | | l D | | !! | / | | | ` ー-‐ ' ´|| ,ノ| | | !! | ノー‐---、,| / │l、l |レ' ,ノノ ノハ、_ノヽ / / ノ⌒ヾ、 ヽ ノハ, | ,/ ,イーf'´ /´ \ | ,/´ |ヽl | /-ト、| ┼―- 、_ヽメr' , -=l''"ハ | l ,/ | ヽ \ _,ノーf' ´ ノノ ヽ | | 、_ _ ‐''l `ー‐―''" ⌒'ー--‐'´`ヽ、_ _,ノ ノ  ̄ ̄ | /  ̄
>>435 Cimpiler Intrinicsの説明に書いてあるね。
If a function is an intrinsic, the code for that function is usually inserted inline, avoiding the overhead
of a function call and allowing highly efficient machine instructions to be emitted for that function.
An intrinsic is often faster than the equivalent inline assembly, because the optimizer has a built-in
knowledge of how many intrinsics behave, so some optimizations can be available that are not available
when inline assembly is used. Also, the optimizer can expand the intrinsic differently, align buffers
differently, or make other adjustments depending on the context and arguments of the call.
VCの場合、アセンブラのいくつかの命令をコンパイラ固有命令として組み込んであって、VCの中でそれを
使ってもらうとinline命令で書いた場合より速くなることがある。その理由は、コンパイラがオプティマイザが
個々の組み込み関数の挙動をよく知っていて最適化するようなコードを吐き出せるかららしい。
ただ、これはあくまでVC固有の機能だから他のコンパイラでは使えないし、移植する場合も面倒になる。
lヽ ノ l l l l ヽ ヽ )'ーーノ( | | | 、 / l| l ハヽ |ー‐''"l / A | | |/| ハ / / ,/ /|ノ /l / l l l| l A ヽ l ・ i´ | ヽ、| |r|| | //--‐'" `'メ、_lノ| / ・ / | S l トー-トヽ| |ノ ''"´` rー-/// | S | | ・ |/ | l ||、 ''""" j ""''/ | |ヽl ・ | | M | | l | ヽ, ― / | | l M | | !! | / | | | ` ー-‐ ' ´|| ,ノ| | | !! | ノー‐---、,| / │l、l |レ' ,ノノ ノハ、_ノヽ / / ノ⌒ヾ、 ヽ ノハ, | ,/ ,イーf'´ /´ \ | ,/´ |ヽl | /-ト、| ┼―- 、_ヽメr' , -=l''"ハ | l ,/ | ヽ \ _,ノーf' ´ ノノ ヽ | | 、_ _ ‐''l `ー‐―''" ⌒'ー--‐'´`ヽ、_ _,ノ ノ  ̄ ̄ | /  ̄
遅延ジャンプ直下のnopが笑える
>>439 インラインアセンブラも同じくらい移植性はどっこいどっこいだけどな。
移植がうんたら言うならVMな言語使うわけで C/C++は速く動けばいい
>>439 べつに無理に最適化してもらわなくていいから、インラインアセンブラを
使いたい時ってあるよね
VCはそういうの無視してるわけか
MASMで書いてリンクしろとか面倒だよなあ
いやそうでもない 結局 MASM/NASM で書いてリンクした方が楽だったりする
インラインでやるより、はっきりとソースが分かれてるほうが見通しがいいかも知れないね。
インラインアセンブラたまに使うけどな。 フルアセンブラに対するインラインアセンブラの最大の利点ってCのシンボルと直接やり取りできることじゃね? コンパイラよりも賢いコードが書ける人で、関数丸ごとじゃなくてループの内側だけ最適化したいとか そういうニーズはいくらでもあると思うけどな。 やっぱC++ 0x(実質1x?)のlambda式みたいにゆるく書きたいじゃんw シンボル解決方法とかABIとかを意識する必要は無いしね。 (特にC++のメンバ関数なんか全部アセンブラで書くと大変) Intelコンパイラだと普通に64ビットでもASM使えるのね。 AMD独自命令はemitでもやらないと使えないけどw
えっ
call MessageBoxW を機械語に対応させてみてくれ
インヴォケ めっさげぼxW
>>449 昔はそうだったの。それにそう言ったほうがわかりやすいだろ。
昔から同じ機械語に落ちる複数のニモニックとかあっただろ
455 :
デフォルトの名無しさん :2010/12/11(土) 18:25:23
>>454 1つのニーモニックで1単位の命令だからいいんだよ。
1つのニーモニックで2バイトの命令になっても、それで1つの処理をするわけだから1:1。
Cだと1行のコードが複数のニーモニックに変換されるから1:1にならない。
>>456 当然手間はかかるけど、実行速度は平均してCの10倍くらい出るから、頻繁に呼ばれる部分だけでも
アセンブラで書き直すメリットがある。
jccはn:1だし、x86のaam/aadは基数10(d)以外はニモニック無しだから0:1だね。
00 04 20 add %al,(%eax,%eiz,1) 3バイトnop 00 84 e0 00 00 00 00 add%al,0x0(%eax,%eiz,8) 7バイトnop INDEX=100 && BASE!=100 だと全部nopになるらしい 01 04 05 00 00 00 00 add %eax,0x0(,%eax,1) 01 80 00 00 00 00 add %eax,0x0(%eax) この二つは意味的にはまったく同じといっていいかな?
>>456 CPU に因っては 1:1 にならない
RISC系のプロセッサだと1ニーモニックが複数のニーモニックを合成した
マクロニーモニック的なもののことは多々ある
# 条件分岐系はほとんどそんな感じ?
また、実際にはそんなインストラクションは存在しないがニーモニックとしては
記述可能なものもあったりする
# nop が mov r0,r0 に展開されるとか cmp が sub r1, r2, r0 に展開されるとか
8086だとレジスタがax固定の短縮パターンと、レジスタ指定でaxを指定したのと、 複数の機械語がありうるアセンブリ言語があるかな
あ、機械語と一対一対応してるかどうかの話か 勘違いしてた
>>459 コードの違いだけなら10倍にはならないけど、Cだとランタイムライブラリが必ず入るから、
オールアセンブラの実行ファイルと比べて全体のサイズがかなり大きくなる。
それを読み込むのにいつも同じ時間が余計にかかるから、
実際に起動してから終了するまでの時間は10倍くらいになる。
Cと比べてさえその程度だからJavaとかLL言語と比べたら起動から終了までの差は100倍くらいになる。
今時ダイナミックリンクも知らない男のひとってw
>>465 シェアードライブラリにしたって実行できるサイズ分先読みする、
オーバーヘッドは発生しますが何か?
ランタイム読み込むだけで全体の実行時間が10倍になるような簡単な仕事なら CでもPerlでも簡単にかける方でやるわ。
>>465 それでもランタイム不要のアセンブラに比べれば充分でかいんだが。
それにDLLなんてもんは起動されたときたまたまメモリになかったら読み込まれるしくみになってるから
使用頻度が低ければ起動されたときメモリに入っていない確率が高い。
それとも一度起動してDLLをメモリに読み込ませてすぐ終了させ、再度起動するような使い方でもする?アホだろ。
>>467 サーバ用アプリでそれやると、1000人アクセスされたら1000回の無駄な仕事が発生する。
10000人なら10000倍になる。もしアセンブラで組んであったらサーバの数を大幅に減らせる。
>>468 , 469
結局標準ライブラリ相当のものつくんなきゃいけないんで大差ないんちゃうか?
今時のOSだとテキストセグメントなんてキャッシュ/共有するだろうし
ライブラリと同じものを作れば、結局ロードに同じ時間かかるよなw
>>470 , 471
同じ動作をするサンプルプログラムを作ってもCとアセンブラで大きさが全然違う理由がなぜかわかってないんじゃないかな。
わかってればそんなこと言うはずがないんだが。
自演乙。
>>472 組み込みでもない限り大してちがわんとおもうぞ
printf をアセンブラで実装しても C で書いたコード大してかわらんかったし、
RISC 系のプロセッサだと、ものによっては最適化された C のコードの方が小さ
かったりするしな
グローバル変数アクセスのプロファイル結果をフィードバックするとかアセンブラ
じゃとんでもなく手間だし
俺はアセンブラでやるのはリーフルーチンと最内周ループくらいなもんだわ
答えられない人は黙ってればいいのに
>>474 手間がかかるのもその通りだし、全部アセンブラでやれと言ってるわけでもない。
もしやればアセンブラにはそれだけの能力があるってこと。
それがわかって、手間と効率のバランスを取るためにアセンブラを適度に使うのが普通だけど、
極限の性能を出したいと思えば、アセンブラの割合が増えるだろうということ。
それのどこが「10倍速」なんだろうか
>>477 だから全部アセンブラで書けばそうなると言ってるんだが。
全部というのはライブラリも含めて、必要なルーチンは全部アセンブラで書いた場合という意味。
たとえばCのprintfは冗長だ。単に文字を表示するだけならアセンブラでずっと小さく書ける。
早いかどうかは、出来上がった実行ファイルのサイズを比べてみること、実行速度を測ること。
もし10倍出せなかったらアルゴリズムを考え直せ。
簡単な処理の場合、アセンブラならレジスタだけでしてしまうこともできる。
Cのノウハウと同じようにアセンブラ独自のノウハウも駆使すればもっと速くできる。
できないと言うなら無理にとは言わないが。
すげぇ。つまり、同じ機能を実装しないで10倍って言っているわけだ。
>>479 ちがうよ。遅かったり冗長だと思ったらアルゴリズムを最適化させれば速くなるし、無駄も減るだろと言ってる。
いらない機能が含まれてるのにわざわざそれを使うのがいいと思うなら遅くても文句言わずにC使ってればいい。
どっちでも選べるんだから、どうするかは自分で決めたらいい。
わざわざアセンブラ使うのは少しでも速くしたいからだろ。だったらこういうことに気を遣わない人は使うべきじゃない。
いくらアセンブラだって無駄なコードばかり書いてたら速くはならないんだから。
Cはレジスタが直接見えないからレジスタを意識したコードが書きにくい。
アセンブラはレジスタが見えるから、レジスタを意識したコードが書ける。
今は64bit CPUが当たり前になって386時代よりレジスタが何倍も増えたが、
Cコンパイラのほうはまだ64bitレジスタ全部を使って充分に最適化できるところまできていない。
64bit CPUのレジスタは汎用レジスタだけでも16本あるから、小さいルーチンなら全部レジスタ内で
処理できる。これだけでもかなり速く動かせる。
すげぇ。同じことをCでやったらやっぱりコンパクトで速いコードになるとは思わないんだ。
> Cコンパイラのほうはまだ64bitレジスタ全部を使って充分に最適化できるところまできていない。 思い込み乙
アセンブラじゃなくても、汎用的な部分を取り除けばそれなりに早くなるでしょ、printf 8086時代にprintfをアセンブラ書いたことあるけど、早くなったとは思わなかったな、小さくはなったけど
アセンブラを使おうと思うよりは組み込み関数でSSEを使ったほうが速い。 インライン展開による最適化ができなくなるのでその辺も考慮しないと駄目。 モダンなCPUの特性は人よりコンパイラのほうがよく知ってることも多い。
凄い人はインテルのコンパイラが生成するコード見て そこに盛り込まれてる高速化の技術が100%分かるもんなの?
昔のコンパイラだと、mathライブラリが別になっているだけでなく、 標準ライブラリには整数版のprintf()が用意されている場合もあったね。
>>485 そりゃ分るよ
自分の書いたコードと逆アセンブルしたコードを比較してみ
コンパイラがなにしたかがある程度分かるから
256ビットのSIMDで16ビットを処理すれば16倍速
Cでも書けるね。
C自体にんな機能はない
出力バッファに*などの記号を格納する方法教えてください ループさせて*を複数格納したいのですが出来ません CASL2です
MOV BC,10 ; loop回数 MOV HL,#buf ; バッファアドレス LDA '*' ; セットする文字 LOOP: STA M ; (HL)のアドレスに1文字格納 INC HL ; バッファアドレスを進める DEC BC ; カウントダウン BNZ LOOP ; 回数分ループ CASLのニーモニックじゃないから翻訳しろ。HLとかBCは16bitのレジスタ、 Aは8bitのレジスタだ。
CASL2です
z80に翻訳しました ld b,10 ld hl,buf ld a,'*' loop: ld (hl),a inc hl djnz loop
そうそう、DJNZ が使えるからBCをカウンタにしたんだ。
>>491 は解ったのかな・・・
496 :
デフォルトの名無しさん :2010/12/21(火) 13:21:35
.text:004012D6 sub_4012D6 proc near ; CODE XREF: startp .text:004012D6 xchg eax, [esp+0] .text:004012D9 sub eax, 2Dh .text:004012DC xchg eax, [esp+0] .text:004012DF retn .text:004012DF sub_4012D6 endp
全て2進数で書けばいいだけのこと
書いてみて
>debug abc def ghi jkl mno pqr stu vwx yz. -d 0000 00ff (略) -r AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=198D ES=198D SS=198D CS=198D IP=0100 NV UP EI PL NZ NA PO NC 198D:0100 0000 ADD [BX+SI],AL DS:0000=CD -a 00b0 198D:00B0 mov cx,[0080] 198D:00B4 mov si,0081 198D:00B7 mov di,00c0 198D:00BA rep movsb 198D:00BC nop 198D:00BD -g=00b0,00bc AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=20A1 DI=20E0 DS=198D ES=198D SS=198D CS=198D IP=00BC NV UP EI PL NZ NA PO NC 198D:00BC 90 NOP -d 0000 00ff (略) 最後に SI=20A1 DI=20E0 になってるのはなぜ?
カウンタに使うデータが (略) だから。
198D:00B0 mov cx,[0080] cx に 2021 が入ってるな
もしかして、0x80の1バイトだけ利用したかったのかな? だとしたら、mov cl, [80]; mov ch, 0; か、xor cx, cx; mov cl, [80]; だな。
503 :
デフォルトの名無しさん :2010/12/23(木) 09:46:18
アセンボラ
ollyで勉強しようと思ってチョコ起動してからollyでアタッチしたらフリーズしてて F11押したら動いたんだけど、どう見てもアドレスがUHのときと違ってあれぇって思ったんです。 で・・・おーぺんで開いてみたらUHと同じ感じになりました。 この状態で皆さん解析されてるんですか? 00534FE0 /. 8B81 D8010000 MOV EAX,DWORD PTR DS:[ECX+1D8] 00534FE6 |. 83F8 10 CMP EAX,10 00534FE9 |. 74 05 JE SHORT 00534FF0 00534FEB |. 83F8 20 CMP EAX,20 00534FEE |. 75 21 JNE SHORT 00535011 00534FF0 |> 8A81 28010000 MOV AL,BYTE PTR DS:[ECX+128] 反射は難しそうなので、今出てる奴が次に対策された時自分でなんとかできるようにしたいです。 530B87 → D5 58 だったのに 534FE7 → 45 62 になっていて意味がわからないので(元はF8 10 ですよね・・・) ↑のcmpとかそうゆうのにヒントがあるのかと思ったんですが そこを調べていけば次回アドレス変わった時も自分で何とかできるようになりますか? 他に聞けるような場所がないのですみません;
507 :
デフォルトの名無しさん :2011/02/27(日) 11:34:13.14
フフフ、それにしてもいい度胸だ。ますます気に入ったよ。ア、アセンブリとかいったな?
スレチだったらすんません。 すごい初歩的なんすけど、 MOV EAX,DWORD PTR FS:[0] このFS:[0]ってどんな意味になるんでしょうか? DWORD 4バイト PTR 型 FS:[0] ?? をEAXに代入 このFSがわからねーっす。教えて下さい。
セグメントレジスタFSによるオーバライド。つまり、FSが指すアドレス空間のオフセット0からのDWORDをEAXに代入するわけだね。
511 :
デフォルトの名無しさん :2011/03/02(水) 12:56:15.29
>>509 >>510 早レスサンクスですm(_ _)m
ちょっと難しいですが、調べてみます!
みんな凄いですね…。
COBOL並みに人材不足してんのかな
需要も少ないから供給も少ないだけだろ。 無くはないが。
j;;;;;j,. ---一、 ` ―--‐、_ li;;;;;; コンパイラが出力するコードは、 {;;;;;;ゝ T辷iフ i f'辷jァ !i;;;;; 人間が書くコードよりも、圧倒的に賢い ヾ;;;ハ ノ .::!lリ;;r゙ `Z;i 〈.,_..,. ノ;;;;;;;; ,;ぇハ、 、_,.ー-、_',. ,f゙: Y;;f. そんなふうに考えていた時期が ~''戈ヽ `二´ r'´:::. `! 俺にもありました
それを決めるのは人間だからね
516 :
デフォルトの名無しさん :2011/03/10(木) 11:23:01.07
そりゃ人材は不足するだろうよ。 人材育成もしないで即戦力だけ欲しいとか、どんだけ経団連はわがままなんだよ。
アメリカも中国も、欲しい人材は即戦力だけなんだが
「育てろよw」といえる日本 著者:石原慎太郎
どうせすぐ辞めるから教育する金がもったいない
PUSH 0 PUSH 1 PUSH 2 ↑のようにスタックに値を格納したあと、 [2]と[0]は取り出さず[1]を最初に取り出す方法を述べよ
521 :
デフォルトの名無しさん :2011/04/16(土) 14:10:11.74
523 :
デフォルトの名無しさん :2011/04/17(日) 03:04:00.29
解けない時代があっただろうに。 その頃同じせりふを言われたら、顔真っ赤だろうに。 こんな過疎スレでイキガル522
初心者なんですが アセンブリ言語でオペラントの数字の最初につける#はどの様な意味でしょうか? 例DC #7FFF
↑自己解決しました
>>523 『取り出す』っていうのがイミフメ。
DMAでも使えばCPUで触れずに[2]と[0]を埋められるけど、そういう事かな。
>>524 のだと、『読み取る』だね。
SWAP POP
529 :
デフォルトの名無しさん :2011/06/13(月) 00:21:56.90
x86においてマルチコアを使用する際、カーネルはどんな命令を発行してるんですか? 全く想像がつきません...
530 :
デフォルトの名無しさん :2011/06/13(月) 06:59:59.92
しらぬ
おれもしらん
HLT
NOP
>>529 kernelが使う命令は1論理MPUの場合と同じ。
複数MPUの起こし方については、APICについて調べてみるとか。
ロックを一切使わない方法ってないもんかね スピンロックってトイレに例えればドアが開くまで延々とノックし続けてるようなもんだろ? 基地外そのものじゃん
名前は正確さや一般的かどうかに疑問はあるけど コストの低い順に ・RCU的な手法 ・CASを使用したウェイトフリーな手法 ・CASを使用したリトライ手法 ・スピンロック ・スリープロック だと思う。 当然、適用可能な範囲の広さは逆順になる。 利用したコードの書き易さはまた別の順になるかな。
例えがおかしくね
539 :
デフォルトの名無しさん :2011/07/09(土) 09:24:24.73
PowerPC な Mac を使っていた時に PowerPC のアセンブラを勉強しておけば良かったなあ・・・ MIPS なモバギを使っていた時に MIPS のアセンブラを勉強しておけば良かったなあ・・・ とか、最近になって後悔している・・・
今なら、Cで書いてどんな汗吐くか見るぐらいでいいんじゃね
にんじゃ
542 :
デフォルトの名無しさん :2011/07/28(木) 00:19:28.17
×みんなのリズム天国 ○みんなのNASM天国
543 :
デフォルトの名無しさん :2011/07/30(土) 14:15:32.11
インテルはia32マニュアルの日本語訳をもう作るつもりはないのかな?
544 :
デフォルトの名無しさん :2011/08/19(金) 08:08:14.25
8b ff mov %edi,%edi これって何やってるんでしょうか?
それが実行されてるとすればNOPと同じだけど 2バイトのNOPという意味がある、のかも
同じレジスタのMOVは、値の検査にも使えるよね。正かゼロか負かがフラグに立つ
68000のMOVEはそうだが、8086のMOVはフラグに影響しない
sage
メモリって一行を16ビットとかにすれば 少ないアドレスでもいっぱい使えるんじゃないの?
ワードアドレッシングね。 System/360以前のコンピュータにはそういうの多かったけど。
レガシー
NASMでなんか書いてみた