1 :
デフォルトの名無しさん :
2007/08/14(火) 17:18:08
3 :
デフォルトの名無しさん :2007/08/15(水) 19:09:11
アセンブラ… Part 12 (ρΩρ) ニョローン
nop
hlt ; 恒例の
6 :
デフォルトの名無しさん :2007/08/15(水) 19:17:25
sll r0, r0, r0
AAが無いぞ、どうしたの?
一か八か
だれがうま
ん?ダンゴさんの許可は?
団子は当スレから出るな いいか?
親が経営者で愚民を使う教育しか受けていない ダンゴさんになんてことを!
アセンブラブラ〜♪(石丸電気のメロディーで)
かわいそうな愚民未満、団子。 仕送りを20万円くれるパパに謝りなさいよ。
そろそろ団子さんに愚民どもをピシッとシメてもらい所だな。 親が経営者であるところをちゃんと示してもらわないと。
これと xchg edx, [eax] これ mov ecx, [eax] mov [eax], edx mov edx, ecx どっちが早い
>>18 前者の方が早い。
速いかどうかはしらね。
メモリとのxchgはロックがかかって高価だったような
ループ内で行っていた場合、 後者だと命令が伸びてフェッチ回数が増える可能性があって、 それが効いてくる可能性はあるかもしれん。
xchgでバスロックがかかる点に比べれば、他の要素など微々たる差
上が edx <-> *eax 下が ecx <- *eax *eax <- edx edx <- ecx でどちらもedxの内容とeaxの指すメモリの内容を交換してる。 下は命令が増えているのとecxを余計に消費している。 上は命令の実行中に他の要因でeaxの先が変化しない事を保証しているのでロックがかかる。
他の言語なら最初に "Hello world" とかあると思うんだけど アセンブラならまず何を書けばいいの?
ダンゴさんの聡明なるアドバイスが望まれるところだ
mov ah, 09 mov dx, msg int 21h mov ax, 4C00h int 21h msg db 'Hello, world!$'
ナツカシス
29 :
25 :2007/08/28(火) 20:00:25
>>27 ありがと
んで、コンパイルなんだけどインストールされてるアセンブラ?って呼べばいいのかな、調べたら
yasmとnasmってのがあった。OSはLinux使ってますがLinux歴2ヶ月なんでへたれなんです。
アセンブラのコンパイルはどうやるんでしょうか?
Cの初心者向けサイトは多かったけどアセンブラは少なくて。
よろしくです。
そこでqemuですよ
32 :
25 :2007/08/28(火) 20:52:06
そうなんすか……。
では、
>>27 のようなコードをLinux向けに自分で書きたいので
>>27 で使ってる命令文の意味などを理解したいです。
ここでダメならどこか誘導してくれるかサイトを教えていただけるとありがたいです。
int 21 はMS-DOS割り込み DOS時代のソフトを逆汗するといっぱい出てくる ahレジスタの数字で呼び出す機能を指定するんだが、 09は文字列を標準出力にアウトプットしてくれる。 このとき文字列のアドレスをdxレジスタに入れておく。 で、文字列は $ で終わっている必要がある。(Cのヌル終端みたいなもんだ) 4Cでint21するとプログラムを終了する でも俺はint20が好きだ大好きだお前もint20を使え
Linuxでアセンブラっていうと真っ先に浮かぶのはgasだなあ
> でも俺はint20が好きだ大好きだお前もint20を使え 俺はCOM限定だけど ret だな。
男なら黙ってhlt
勝手に止めるな
38 :
25 :2007/08/29(水) 02:52:06
>>33 解説ありがとうございます
パッケージ管理で手間取ってしまいまして返事が遅くなりました。
>>27 氏と
>>33 氏の書き込みを参考に理解していこうと思います。
もういちど勉強になりそうな本やサイトを探して
>>27 を書き換えれるよう取り組んでみます。
では、今日は遅いのでこれにて失礼します。
スレの皆さんありがとうございました。またよろしくです。
40 :
デフォルトの名無しさん :2007/09/01(土) 00:13:15
>>27 に似てるけど
>>143 ↓は何をするものですか?
c:\>debug
-a 100
2732:0100 mov dx,110
2732:0103 mov ah,9
2732:0105 int 21
2732:0107 mov ax,4c00
2732:010A int 21
2732:010C nop
2732:010D
-e 110
2732:0110 46.32 01.63 E8.68 08.21 D9.24
-r ip
IP 0100
:100
-g
>>40 debug.exeでCOM形式の実行ファイルを作ってるな。
ほんと懐かしい。
42 :
デフォルトの名無しさん :2007/09/01(土) 00:43:50
>>41 46.32 01.63 E8.68 08.21 D9.24
は文字ですか?
2732:0100 mov dx,110
2732:0103 mov ah,9
だから、110の内容は文字みたいなのですが、nopが有るのが分かりません。
-r ip
IP 0100
:100
-g
は -g 100とすればいいのにわざわざipの値を確認してgの引数を省略しただけですね。
俺もなんでnopがワザワザあるのか分からんw あとこの例だと-eで十六進データを入力しているけど 俺なら文字列を入れるのにはDB擬似命令使うなあ。
44 :
デフォルトの名無しさん :2007/09/01(土) 00:58:20
-eでドットがいくつかあるけど、スペースだと思えばいいんでしょうか?
これは入力じゃなくて、画面表示をそのままコピーしてるだけ。 ドットは入力の催促で、 古い値. って表示されるから、数値を入れて、スペースを入れると次のアドレスに移動する。
46 :
デフォルトの名無しさん :2007/09/01(土) 01:08:49
謎の文字列は2chという文字と関係があるんでしょうか? -e 100 46 32 01 63 e8 68 08 21 d9 24 -d 100 209 1034:0100 46 32 01 63 E8 68 08 21-D9 24 F2.c.h.!.$ ↑21-D9のハイフンは何でしょうか?熊さんのバグ?
LD C, 9 LD DE, MSG CALL 5 RET MSG: DB 'Hello, world!', 0DH, 0AH, '$'
50 :
デフォルトの名無しさん :2007/09/01(土) 01:30:20
>>49 あっあー!そうだったんですね、ありがとうございます。
$が文字終端ですね。2chの前のFという文字とnopが未解決ですが満足しました。
>>50 Fは、入力前のごみデータだろ。って、>45に書かれているじゃん。
nopは作者の癖かなんかじゃないか? コード終端であることを示すために入れたり、
コード領域はnopで埋め尽くしておいたり、色々流儀があったからね。
53 :
デフォルトの名無しさん :2007/09/01(土) 01:56:24
>>52 そんな癖があるんですか。それは知りませんでした。
>45が分かりませんでした。今もまだ分かっていません。
>>53 コマンドラインで「debug」と入力して「-」が表示されたら「e 110」と入力すればわかる。
入力過程を順に見ていこう。便宜上、カーソルをアンダーバーで表すよ。 --(1)コマンドプロンプト -_ --(2)コマンド(e 110)入力 -e 110_ --(3)改行入力→データプロンプト -e 110 2732:0110 46._ --(4)データ(32)入力→次のデータプロンプト -e 110 2732:0110 46.32 01._ --(5)以下同様に -e 110 2732:0110 46.32 01.63 E8._ -- -e 110 2732:0110 46.32 01.63 E8.68 08._ -- -e 110 2732:0110 46.32 01.63 E8.68 08.21 D9._ --($)データ入力完で次のコマンドプロンプトに -e 110 2732:0110 46.32 01.63 E8.68 08.21 D9.24 -_ -- これで雰囲気をつかんでくれ。
56 :
デフォルトの名無しさん :2007/09/01(土) 02:29:37
>>55 やったー!ありがとうございます。古い値.の意味が分かりました。
しかし こんな旧時代の遺物を教材に使うのってどうよw
MASMの脳内発音はマズムですか?
自分は えむあすむ
自己完結している脳内発音を尋ねることに意味があるのか? コミュニケーションのために実際の発音を尋ねるのならまだ分かるが。
NASM ナズム
YASM 休む
63 :
デフォルトの名無しさん :2007/09/01(土) 16:22:15
最近アセンブリを学ぼうと思い「高級プログラマのためのアセンブラ入門」 と言う本を買ったのですが内容が16ビットプログラミングでの.comファイル 作製が主なのです。 それで、VS2005のMASMで16ビットリンカを適用さしてコマンドラインから comファイルを作る方法は解ったのですが、いまいち本の内容を理解しきれてない と思いデバッガでステップインしていってどう動いているのかを知りたいのですが VSでどういう風に設定したらasmファイルのみでデバッグ出来るのかが わからないです。 もし出来る方法があるなら、教えていただきたいです。 VS使うよりも良い開発環境があるなら、そちらも是非教えて頂きたいです。 なにとぞよろしくお願いします。
64 :
デフォルトの名無しさん :2007/09/01(土) 17:50:42
65 :
デフォルトの名無しさん :2007/09/01(土) 18:53:06
いまどきCOMモデルもないだろ。
高級プログラマって表現はどうなのかと思った 「高級言語プログラマのための たしなみアセンブラ」 ぐらいが妥当だろ
TASM タズム
LASM ラスム
LASM えるあすむ MASM えむあすむ NASM えぬあすむ TASM ていあすむ
MASM まさみ
MASM マシン
74 :
デフォルトの名無しさん :2007/09/05(水) 00:26:52
int 80h とか int 21h に至るまでをまずやれれば
75 :
デフォルトの名無しさん :2007/09/05(水) 22:11:27
PEからELFに変換できるツールってありますか?
call 5とか。 もう使わないか
>>75 PEはCOFFみたいなものだから
多少自分で前処理する必要があるかもしれないけど
ツールはある
しかし変換しても使えないと思うが
binutilsのobjcopyをほげれ。
79 :
デフォルトの名無しさん :2007/09/12(水) 22:59:29
>>79 masmがBUFFERの全領域を0で初期化しているようだね。
( ゚∀゚)<プップー OSがdataセクションを初期化してる。
行儀の悪いプログラムだな
>>79 の記述だとmasmならオブジェクトファイルの段階で128バイトの0が確保されるだろ
OSが初期化するわけではない
ロードはするけど
セキュリティのためにOSがやってんじゃなかったのか
なぜ、初期値を持つdataセクションをOSが初期化すると思うのか?
87 :
デフォルトの名無しさん :2007/09/14(金) 18:16:40
dataセクションでもexeに無い部分はOSが初期化するんじゃね?
obj ダンプすりゃわかる 素人だらけw
89 :
デフォルトの名無しさん :2007/09/14(金) 18:41:40
俺は、 仕様上、 誰かが確実に初期化すると定められたものがあっても、 そういうものに依存するのが嫌なので 自分で必ず初期化するのである。
C の static に全部 = 0; とか書かかないと気持ち悪いタイプ?
91 :
デフォルトの名無しさん :2007/09/14(金) 18:47:46
何か 問題 あるかね
92 :
デフォルトの名無しさん :2007/09/14(金) 18:57:49
分かりやすく言えば、俺が江頭だとして 「この人は佐藤ですからヒップアタックしてください」と 人からアイデンティファイされたものはダメである。 俺が、この目と足でチェックしてはじめて、 「ぅお前は!佐藤だー!!」(ででででーでででででででで)と、 ヒップアタックする気になるのだ。
staic int i; if(i) i = 0; これね
それは ちがう だろう
MASMの すごい 初期化
objをダンプしてexeの中身がわかる人がいるのはこのスレですか?
アセンブラと機械語は違うけどね。
初期化しない値は、.dataではなく.data?に書く。
.bss
100 :
デフォルトの名無しさん :2007/09/18(火) 15:25:32
age
外部シンボルが未解決でわかりません。
もとがMASMの話だけにobjdumpもアレだ。
105 :
デフォルトの名無しさん :2007/10/18(木) 21:25:44
age
106 :
デフォルトの名無しさん :2007/10/26(金) 00:02:09
KITE-1マイクロプロセッサで exp(x)=Σ(n=0,∞){1/n!}=1/0!+1/2!+1/3!+…+1/n! =1+(1+1/2(1+1/3(1+…+1/n))) の展開した式からネイピア数を求めるアセンブラのプログラムの作り方がさっぱりです。 指定は除算を引き戻し、引き放しで行わず、ループを使わないことらしいです。 ググって見た感じではSRT法を使おうと思っているのですが これまたアセンブラで表現しようと思うのですがさっぱりです。 どなたかプログラムを教えていただけないでしょうか。 またSRT法以外に簡単な方法ががあるなら是非教えて頂きたいです。 よろしくお願いします。
>アセンブラのプログラムの作り方がさっぱりです。 うむ、まずアセンブラとテキストエディタを用意しよう!
インプリメンテーションチャートは?
int n; long double e,a,p; e=0;a=1;n=1; do { p=e;e+=a;a/=n;n++; } while (e != p); こんなのしかかけないヘタレな俺
アセンブリでおk
>>106 を解こうとしてsrt除算の上位ビットのからの条件分岐が書けなかった俺は負け組
112 :
デフォルトの名無しさん :2007/11/02(金) 11:10:15
アセンブラの勉強したくて本がほしいんだけど本屋に全然本が売ってないんだよ あってもあんまよさそうな本が見つからない なんかお勧めのアセンブラの本教えてください
はじめて読む8086あたりでいいんじゃね? 古い本だけど、基本的なことはわかると思うよ
とりあえず入門用マイコンとしてそこそこのものなら、AVRのTinyあたり?
AVRマイコン活用ブック―オリジナル電子ゲーム&ロボット製作
→アマゾン:
ttp://www.amazon.co.jp/AVRマイコン活用ブック ―オリジナル電子ゲーム-ロボット製作-わかるマイコン電子工作-松原-拓也/dp/4885540011/ref=pd_bbs_sr_2/503-7396570-5979118?ie=UTF8&s=books&qid=1193988330&sr=8-2
AVRは(PICも)会社によって嫌われることがあるので、あくまで勉強用として。
115 :
114 :2007/11/02(金) 17:05:00
>>114 の補足
この本のプログラムはgccで書かれています。
>gcc -S ...
のように -S オプションを付けてコンパイルするとアセンブラコードが吐き出されるので、
コードと対比させると勉強になると思います。
他のコンパイラと違って-S付けてもソースコードと混成にならないのが惜しい
どのコンパイラが?
119 :
117 :2007/11/03(土) 01:32:44
混成表示するにはobjdumpです
turbo c++ exploreからtasm32.exeを入手できたんですが、 tasm32のドキュメントってどこかにないでしょうか?
ロシア語で考えるんだ!
しかし、MASMが合法的に無料で手に入る時代にtasm32を使う理由って一体・・・。
Idealモードフェチの人なんだよきっと
NASMが64ビット対応してるよ。SSE4.2もAMD SSE5も吐けるよ
>>125 相変わらず何かのSDKの中について来るの?
>>129 thx
Linkerとかはどうしろって?w
普通にVC++のリンカ使いましょう。Expressならタダだし。
課題で質問があるのですが、Formatのような感じで 文字列を表示させるにはどのようにしたらよいでしょうか? PUSH EBP MOV EBP,ESP SUB ESP,104 MOV EAX,DWORD PTR SS:[EBP+C] AND DWORD PTR SS:[EBP-4],0 MOVZX ECX,BYTE PTR DS:[EAX+F] PUSH ECX ; /<%02X> MOVZX ECX,BYTE PTR DS:[EAX+E] PUSH ECX ; |<%02X> MOVZX ECX,BYTE PTR DS:[EAX+D] PUSH ECX ; |<%02X> MOVZX ECX,BYTE PTR DS:[EAX+C] PUSH ECX ; |<%02X> MOVZX ECX,BYTE PTR DS:[EAX+B] PUSH ECX ; |<%02X> MOVZX ECX,BYTE PTR DS:[EAX+A] PUSH ECX ; |<%02X> MOVZX ECX,BYTE PTR DS:[EAX+9] PUSH ECX ; |<%02X> MOVZX ECX,BYTE PTR DS:[EAX+8] PUSH ECX ; |<%02X>
MOVZX ECX,WORD PTR DS:[EAX+6] PUSH ECX ; |<%04X> MOVZX ECX,WORD PTR DS:[EAX+4] PUSH ECX ; |<%04X> PUSH DWORD PTR DS:[EAX] ; |<%08X> LEA EAX,DWORD PTR SS:[EBP-104] PUSH testtest.0044AD6C ; |Format = "{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}" PUSH EAX CALL DWORD PTR DS:[<&USER32.wsprintfA>] ; \wsprintfA MOV ECX,DWORD PTR SS:[EBP+8] ADD ESP,34 LEA EAX,DWORD PTR SS:[EBP-104] PUSH EAX CALL testtest.0042D903 MOV EAX,DWORD PTR SS:[EBP+8] LEAVE RETN 8
Cで書いて、コンパイラが吐くコード見れば?
上の2レスがたぶんそうだとおもう
いきなり質問失礼します。 8085で、 [8091h] [8090h] ←[8080h]*2+[8081h] 和を16ビットで求める(分岐命令を使用してもよい) 16ビットで求めるという意味がいまいちわかりません。 どなたか解答お願いします。
>>135 レスありがとうございます。
一応Cで書くのも考え試したのですがなにぶんアセンブラは素人なものでして…。
PUSHで変数をスタックして上から開いているんだろうなぁっとまでは
なんとなく理解できたのですがCで書いたらエラー吐きまくりで…
できればどなたかヒントか一部サンプルを書いてもらえないでしょうか?
「8ビット×2+8ビット」の結果は値によって8ビットじゃオーバーフローするじゃん。 だから16ビットで演算して結果を8090-8091H番地に格納すんだろ。
>>139 さっそくのレスありがとうございます。
あ、何となくわかったようなきがしました。
LDA 8080h アキュムレータが8080h になって
ADD A アキュムレータが8080h*2になって
MOV M 8080h*2をHLレジスタにコピー
LDA 8081h アキュムレータに8081hをロードして
STAX D 8081hをDEレジスタに格納して
DAD D 8080h*2+8081hをHLレジスタにいれて
SHLD 8090h [8091h][8090h]に8080h*2+8081hを格納
って感じですかね?
↑ 見にくかった。 LDA 8080h アキュムレータが8080h になって ADD A アキュムレータが8080h*2になって MOV M 8080h*2をHLレジスタにコピー LDA 8081h アキュムレータに8081hをロードして STAX D 8081hをDEレジスタに格納して DAD D 8080h*2+8081hをHLレジスタにいれて SHLD 8090h [8091h][8090h]に8080h*2+8081hを格納
それだとADD A(×2)の時点でオーバーフローすることがある。 が、まぁだいたいそんな感じだ。
3番目は MOV Mではなく MOV M,Aでした。
なるほど。ありがとうございます。 今日知人に教えてもらうと、 LDA 8080h MOV L,A MVI H.0 DAD H LDA 8081h MOV D,A MVI E,0 DAD D SHLD 8090h ↑のような感じだったんですがこれでもあっているのですか?
↑の下から3番目のMVI E,0 は MVI D,0だったかも
>>145 なら、MOV D,A も MOV E,Aだな。
8085のニモニックよくしランが、
全部16ビットのHL,DEで演算してるようだから多分合ってんじゃね。
蛇足だが、
>>141 の方法で、ADD A後、CフラグがONならHに+1すればOK。
多分設問の「分岐命令を使用してもよい」はそれを期待していると思われる。
>>146 あなたが神か
アドバイスありがとうございます。
ただ、最後のCフラグがONならHに+1にするほうほうがよくわかりませぬ。
ADD A をADC Aにすればいいのでしょうか?
ADD A でCがONした場合てのは8ビット同士の加算結果が8ビットを溢れたことを表す。 例) FF+FF→1FE →Aの内容はFEとなって CがONする→ CがONなら上位8ビット(H)に+1(HLで+100)することで補正する必要あり ...ああ、もう書いちゃえw H=0; //あらかじめクリアしとく A=A+A; //ADD A (桁あふれがあればC_flagが1になる。なければ0になる) if(C_flag!=0){ //桁あふれあり? H++; //演算結果が8ビットで溢れたので上の桁に1を加算(HL全体で+100) } L=A; //下位8ビットを格納 Cフラグでの条件分岐命令は調べれ。
あ〜♪残念、珍しく得意な8085のQが来てたのに、終わっちゃったよ。 蛇足だが、141の MOV M,A とか、STAX D とかって、アドレッシングの概念間違えてるよ。 左は[HL]<--A で、右は[DE]<--A のこと。 HLとDEを使う知人さんの手法が一般的だけど、 レジスタが足りないようなときには148さんの手法も有効なのね。ADD Aの後はこうなる。 JNC LBL INR H LBL: MOV L,A SHLD [結果] こちらの手法のほうが一般性に欠けるかわりに 「軽い」 という利点がある
150 :
アセンブラ初心者 :2007/11/07(水) 23:24:11
[8081h]←(A+B)*3-[8080h]*2の処理を行うプログラミングを教えてください。
同じ奴か? 応用だろ。考えろ。
152 :
アセンブラ初心者 :2007/11/07(水) 23:37:43
違いますよ。初投稿です。
153 :
アセンブラ初心者 :2007/11/08(木) 00:40:56
本当に、誰か教えてください。考えてもわからない。
154 :
デフォルトの名無しさん :2007/11/08(木) 00:42:21
応用だろ。ログみて考えろ
@A+Bはレジスタか?そのまんまだろ。 A3倍はその結果を3回足せばいい。 B[8080h]はメモリからレジスタにロードして、×2は同じものを足せばいい。 CAの結果からBの結果を引いて D[8081H]に格納 以上。
156 :
アセンブラ初心者 :2007/11/08(木) 01:05:07
LDA [8080h] ADD A MOV C←A ADD B ADD A ADD A SUB C STA [8081h] HLT こんな感じですか?
「感じ」としてはそんなもんだが ADD B の時点でAの中身がどうなってるかよく考えろ。
158 :
アセンブラ初心者 :2007/11/08(木) 01:21:06
ADD Bの前にSUB Aを入れればいいのですか?
>アセンブラ初心者 お前KIT生だろ?
160 :
アセンブラ初心者 :2007/11/08(木) 02:03:43
そうですけど
161 :
sage :2007/11/08(木) 02:03:56
>アセンブラ初心者 蜷川先生もここ見てるから、おまえ落第決定だなwwwww
162 :
age :2007/11/08(木) 02:06:28
>アセンブラ初心者 石塚お兄さんも見ているから覚悟しておけよwwwwwww
163 :
デフォルトの名無しさん :2007/11/08(木) 02:10:32
注意: 過去最近、試験はできたのにレポートが書けていなくて(あるいは他人の丸写しで)不合格に なる例が多く見られた。レポートはじっくり時間をかけて考えられるので、レポートでは全員満 点が取れるものとして試験の評価基準を設定してある。必ず満点が取れるような内容のものを提 出すること。よく考えず簡単に書いたまま本当に合っているか再確認を怠ったり、わからないか らといって一部の問題を未記入で提出することのないよう注意すること。追跡を行うなどして、 答が正しいかよく確認すること。 って先生も言ってんだろ。
>>156 つ [紙と鉛筆]
レジスタとメモリの内容がどう変化するのか
1命令毎に自分で書き出してみぃや
>[8081h]←(A+B)*3-[8080h]*2の処理を行うプログラミングを教えてください。 LHLD [8080h] ; LDAしたらAがなくなっちゃうでしょ MVI H,0 DAD H ; 8bitの加算じゃ元が80h以上の場合オーバーフローする MOV E,L MOV D,H ; [8080h]*2をDEにsave MOV L,A MVI H,0 ; Aの値を16bitに MOV C,B MVI B,0 ; Bの値を16bitに DAD B ; (A+B)を計算 DAD H DAD H ; *3 MOV A,L SUB E MOV L,A MOV A,H SBB D MOV H,A ; HL-DE "DAD"はあるが"DSUB"が無いので8bitで計算 SHLD [8081h] ; 結果はぎりぎり8bitに収まる HLT
166 :
165 :2007/11/08(木) 07:51:04
レジスタの使い方の一般則:Aはアキュムレータだから、保持には使わないのが原則。 (計算に使えるように常に空けておくべき) HLは16bitのアキュムレータとして使う。(8085の命令セットがその思想でできている) BC,DEは一時的な保持のために使ってよい。 165は冗長だが、この原則で書いてあるので一般性がある。156だと頭でAを壊すとか、 元の値が8bitフルレンジだと結果が正しくならないとかの欠陥がある。
世間じゃ8085が流行ってるのか?
いまどき大学でやるようなネタでもないような気がするんだけどね。 まー制限が多い方が HW という偶像につかえる司祭としての PG っつー 立場を痛感できて良いという思想の教授なのかもしれんが。
俺は68kが一番無難だと思ってる。
MIPS の方が良くね?
171 :
デフォルトの名無しさん :2007/11/08(木) 11:47:58
4004だろ
RISCアセンブラじゃ単純すぎて面白みが足らないじゃんw CPUを作るならMIPSが一番いいと思うけど。
そこでARMですよ
それは人生の無駄遣い。
175 :
デフォルトの名無しさん :2007/11/08(木) 22:35:04
MIPSって普及してるの? ARMに押されていそうだよね。
宿題丸投げがあるところをみると 馬鹿大学生の間では普及率が高いらしい。<MIPS
それはパタヘネ(コンピュータの構成と設計)がMIPS使ってるからじゃないかな
だね。大学だとMIPSで教えるから認知度は大きい。 ARMは作ると訴えられてしまうw
PICがMIPSになったそうだからMIPS逆襲のオカン。
182 :
デフォルトの名無しさん :2007/11/15(木) 23:30:45
64ビットのすごさがわかるマシン語書ける人、 サンプル見せて欲しい。
なにも考えずに書いても速度アップするのが64ビットの凄いところ
linuxのコード読みたいんだが疑似命令がよくわからん。 どこかいい解説してるとこない?
185 :
デフォルトの名無しさん :2007/11/16(金) 16:13:08
186 :
デフォルトの名無しさん :2007/11/16(金) 21:29:23
初回例外は ntddll.dll にあります。 0xc00000008:invalid handle 7C94EB53 mov dword ptr [esp],eax 7C94EB56 mov dword ptr [esp+4],0 7C94EB5E mov dword ptr [esp+8],0 7C94EB66 mov dword ptr [esp+10h],0 7C94EB6E push esp 7C94EB6F call 7C94EBAC 7C94EB74 mov eax,dword ptr [esp] 7C94EB77 mov esp,ebp 7C94EB79 pop ebp 7C94EB7A ret 7C94EB7B nop 7C94EB7C lea esp,[esp] 7C94EB83 lea ecx,[ecx] どういう意味かわかる方居ませんか。 ドラッグドロップ系の操作をするとこれが出ます。
その情報の意味を知り得るのはそのソースを持ってる奴だけだよ。
>>186 エラーメッセージ以上の事はわからない。
invalidなhandleを渡してるために例外発生して止まってる。
表示されてるコード自体はスタックにパラメータ積んで関数呼び出ししてる部分だけ。
意味の通じるラベルが表示されてないから、callで呼びだしてる先の動作がどうなってるかは不明。
原因はわからないが、おそらく次にあげる2つのうちどちらか。
・dllを使ってるプログラムにバグがある。
・ntddll.dllが壊れている。
対策としては
・プログラミングしててデバッグ中に出るなら、ソースを良く確かめる。
・何かアプリケーションソフトを使ってて出るのなら、sfc /scannowでWindowsファイルが壊れてないかチェック。
もしくは、そのソフトの使用を諦める。
kiRaiseUserExceptionDispatcherでinvalid handle
メモリ破壊系のバグ(ex同期ミス)がkernel handle/critical section(内部でeventを持ってる)に及ぶと そうなるときもあるけど、正直それアセンブラがどうとかじゃなくてwindowsプログラミングだから。 デバッガでsymbolちゃんと設定すりゃもうちょいマシな逆アセになるよ
191 :
デフォルトの名無しさん :2007/11/17(土) 12:46:44
アセンブラでマシン(ノートPC Dynabook)をrebootさせる方法が知りたいです。 簡単にできるのでしょうか?
何故アセンブラ? OS依存のAPI使えばできるだろうが
rebootなんて、どこだかのアドレスに飛ぶだけだぞ。 どこだったか忘れたがw
rundll user.exe,exitwindowsexecってもう使えないんだっけな
>191 OSによるけど、簡単にはできない。 Win系、PC-UNIX系ならカーネルモードで動作する必要があるだらうから、 ドライバじゃないと無理。 あるいはOS依存のAPIに飛ばせばよいが、引数をちゃんと設定するには Cとかで作った実行ファイルを逆アセンブルしないとわからん。 古いMS-DOSだと193の言う通り、FFFF0hに飛ぶだけ。
nasm 2.00RC1 バージョン飛んだwww
198 :
デフォルトの名無しさん :2007/11/19(月) 20:22:46
AT互換機でハードよりの何か良い書籍はありませんか?
Pentiumマシン語入門編
200 :
デフォルトの名無しさん :2007/11/21(水) 19:55:02
1<=N<=12の範囲で0<=a<=b<=c<=d<=Nかつa+b+c+d=Nとなるすべての数を求める プログラムでN==6,のときd=2,c=2,b=2,a=0の次の配列はd=2,c=2,b=1,a=1と しないといけないのですがd=2,c=2b=2,a=0でプログラムが終了してしまいます 分岐式がおかしいと思うのですがうまくいきません、アセンブラはこうなりました EOR ACC,ACC ADD ACC,07h ST ACC,[0A0h] EOR ACC,ACC ST ACC,[0A1h] LD IX,0B0h ST IX,[0A2h] LOOP1: CMP ACC,[0A0h] BGE END LD ACC,[0A0h] SUB ACC,[0A1h] CMP ACC,01h BNZ LABEL7 ST ACC,[0A3h] LD ACC,[0A0h] CMP ACC,04h BGT END
201 :
デフォルトの名無しさん :2007/11/21(水) 19:56:51
LD ACC,[0A3h] LABEL7:ST ACC,[0A3h] LD IX,ACC LD ACC,[0A0h] SUB ACC,IX LD IX,[0A3h] LOOP2: CMP ACC,IX BLE LABEL1 SUB ACC,01h BA LOOP2 LABEL1:ST ACC,[0A6h] LD IX,[0A3h] LD ACC,[0A6h] ADD IX,ACC ST IX,[0A4h]
202 :
デフォルトの名無しさん :2007/11/21(水) 19:57:37
LABEL4: LD ACC,[0A0h] SUB ACC,IX LD IX,[0A6h] LOOP3: CMP ACC,IX BLE LABEL2 SUB ACC,01h BA LOOP3 LABEL2:ST ACC,[0A5h] LD IX,[0A4h] ADD IX,ACC LD ACC,[0A0h] SUB ACC,IX LD IX,[0A5h] CMP ACC,IX BLE LABEL3 LABEL6:LD ACC,[0A1h] ADD ACC,01h ST ACC,[0A1h] BA LOOP1 LABEL3:ST ACC,[0A7h] LD IX,[0A2h] LD ACC,[0A3h] ST ACC,[IX] ADD IX,01h LD ACC,[0A6h] ST ACC,[IX] ADD IX,01h
203 :
デフォルトの名無しさん :2007/11/21(水) 19:59:31
LD ACC,[0A5h] ST ACC,[IX] ADD IX,01h LD ACC,[0A7h] ST ACC,[IX] ADD IX,01h ST IX,[0A2h] LD ACC,[0A6h] CMP ACC,02h BGE LABEL5 LD ACC,[0A5h] cmp ACC,02h BZ LABEL8 BA LABEL6 LABEL5: SUB ACC,01h ST ACC,[0A6h] LD IX,[0A3h] ADD IX,ACC ST IX,[0A4h] BA LABEL4 LABEL8:SUB ACC,01h LD IX,[0A4h] ADD IX,ACC LD ACC,[0A3h] SUB ACC,IX ST ACC,[0A5h] BA LABEL3 END: HLT end ご助言お願いします
デバッガで試せ。
>ご助言お願いします だらだらコピペすんな。
フローチャート起こしてじっくり考えてみろ。
8086(x86)の逆アセンブラでお勧めってあります? 98のゲーム(プリペル)を解析してWindowsに移植しようと思っているんだけど… 98エミュレータに手を加えて、CPU上で動くコード部をそのままdumpするつもりです。 そしてdumpされたコードを逆アセンブルして解析していく方法を考えています。
一から作ったほうが早いんじゃまいか・・・
>>208 あのプリペルの、歩幅とキー入力の絶妙なシンクロは
ぜひともそのまま再現したいんですよ
ZZ86
98をよくしらないんだがエミュレータを間に挟むのはなんで?
>>210 98用のアセンブラはちょっと。
でもMDEとか懐かしいね。
>>211 DOSフォーマットじゃない独自のファイルシステムなので、
ディスアセンブルするのは起動から追わなくてはいけないので
結構面倒なんです。どこがコード部分かもわかりませんしね。
知りたいのはメインルーチンのみなので、
明らかにコードが通過した場所のみをダンプするのが楽そうに思えました。
ただ、万が一ダイナミックにコードが展開されていたらダメですけどね。
だいたいわかった その用途なら高機能なのより素直な奴の方がよさげだが詳しくないのでなんとも dispeかおりーでばっぐあたりじゃだめか
>>213 プロセスでもexeファイルでもなく、
単純にコードの羅列を逆アセンブルするという用途なのですが、
どうもそういう低機能な逆アセンブラはないみたいなんです。
dispeもOllyDbgも、プロセスもしくはファイル単位で
ディスアセンブルをするようです。
ああdispeはともかくollyはエミュごとかけるってのを想定してた
あるいはダミーのPEヘッダつけてやるってのも手か?
ダミーのPEヘッダだとJMPFとか面倒そうですね 下手に分析されると変なところにラベル作られてしまいそう そこらへんは手作業でやるしかないかな
だなあ シンプルなのが欲しいなあ
>単純にコードの羅列を逆アセンブルするという用途 うさみみハリケーンだと、プロセスメモリの指定範囲だけ逆アセンブルできる。 あと、うさみみハリケーンの付属ソフトを使えば、バイナリデータをテキストか ファイルで指定して、逆アセンブルするのも可。 シンプルな逆アセンブラってことなら、↑でいけるかと。
>単純にコードの羅列を逆アセンブルするという用途 俺はnasmについてくる逆アセンブラを使ってる。 ndisasm test.bin > test.asm コレでおkだと思う。
debug.exe…
Sourcer ってまだ売ってたっけ・・・?
symdeb.exe
まずファイルを抽出すること
226 :
デフォルトの名無しさん :2007/11/24(土) 22:31:13
MASMの演算子offset,segと同じ意味のNASMは何にあたるのでしょうか? NASMの本で良書をご存知の方、教え
228 :
デフォルトの名無しさん :2007/11/24(土) 23:53:30
あーちくしょー アセンブラ使いてー ニモニックで書きてー スタック使いてー オールレジストリの高速関数書きてー あーちくしょー
レジストリ?
もうちょっと激しく突っ込んで下さいですorz
オールレジストリか… 変数の格納場所としては面白いかもな
あ ア ニ ス オ ???
table番地以降にいくつかの32ビットの符号付きの整数が入っているとして その中に負の数がいくつあるかをカウントして 結果をcount番地に入れるプログラムを書け ちなみにARMを使ってます AREA QET13,CODE ENTRY LDR R0, =table MOV R1,#0 MOV R2,#0 loop LDR R0,[R0, R1, LSL #4] ;R0 = table[R1] CMP R0,#0 ADDLT R2,R2,#1 BNE loop SWI 0x11 table DCD 0xf1560012 DCD 0x1560012f DCD 0x80330123 DCD 0x7f611c22 DCD 0xa0000242 tableEnd DCD 0 END まだ習いはじめでよくわかりませんが正の数1回カウントするとループをぬけてしまいます どうか御教授お願いします
>>234 ARM知らないけど、
R0をポインタとして使っているのに中身を代入して破壊してたり、
R1を更新していなかったりしてない?
俺も知らないけど、ADDを非フラグ操作にするんじゃね〜の?
ARMしらんけど ADDLT R2,R2,#1 これはなにやってんの?
R1加算が抜けているので無限ループするはずだがそれは置いておいて LSL #4は4ビット左シフトだから一度に16バイト進んでいるのが原因だと思う
ENTRY以降を擬似cで書くと、こういうことじゃないの? R0 = table; R1 = 0; R2 = 0; loop: R0 = R0[R1 << 4]; condition = R0 - 0; if (condtion < 0) R2 = R2 + 1; if (condtion != 0) goto loop; SoftwareIntrrupt(0x11); となると、問題点は ・R0の破壊(from >235) ・R1の更新がない(from >235, >238) ・R1のシフト量がおかしい(from >238) ってことだね。
240 :
デフォルトの名無しさん :2007/11/27(火) 23:50:55
NASMでセグメント演算子はどうするのでしょうか? オフセットは以下のようにすればOKですが、このセグメントはわかりません。 mov ebx, orz hlt orz 0
初めて自力での改造に成功したぜ ( ゚д゚)ウッウー
mpeg compass.jp 名古屋駅近辺でお話しましょう
A8R8G8B8のα値まで含めたアルファブレンドをMMX化しようと考えているのですが、 どうしても除算が3回から減らせず、なかなか思うような速度が出ません。 Cで書くと temp_a = ((256 - src_a) * dest_a) >> 8; new_a = src_a + temp_a; new_r = (dest_r * temp_a + src_r * src_a) / new_a; new_g = (dest_g * temp_a + src_g * src_a) / new_a; new_b = (dest_b * temp_a + src_b * src_a) / new_a; (ただし 0 < dest_a <= 255, 0 < src_a < 255) のようになり、積和の部分が目にとまったので、MMXで書けないかと考えました。 案の定RGBの積和部分(dest_x * temp_a + src_x * src_a)は簡単に書けたのですが、 三色素同時にnew_aで割る方法や式変形がどうしても分からず、結局三回divを使ってしまっています。 この除算を減らす、もしくは他の方法で高速化するような方法はないでしょうか。 諸事情によりPen2でそれなりの速度を出さなければならず、四苦八苦しています……。
ソースうp
さきに temp_a / new_a src_a / new_a を計算しておいてそれをかけりゃいいんじゃないの?
それを整数演算でやるわけにはいかないだろ。しかも、割り算が二回だし。 # それはそうと、Pen2はSSEないんだっけ? あれば単精度演算も遅くないんだが……
ちょっと誤差がでるけど、俺だったらこうするかな? new_a = src_a + temp_a; new_r = (dest_r * temp_a + src_r * src_a) / new_a; ↓ new_a = src_a + temp_a; temp_div = 65535/new_a; //実際にはテーブル化して temp_div = table[new_a]; new_r = ((dest_r * temp_a + src_r * src_a) * temp_div) >> 16; // ( x * temp_div ) >> 16 はPMULHWを使用
pmullwは符号付きだから
>>244 のdest_r * temp_aとかできないと思ったが、
下位16bitだけのpmullwは符号なしにも使えるんだったな。
>>248 にもpmulhwは符号付きだとツッコミ入れようとしたら、
出てくるnew_rの値は明らかに32767以下だから関係なかった。。
PMULHWは符号付きだったのか…。 符号なしのPMULHUWはPen3で追加された命令で Pen2ではサポートしてないのね。
MMX アルファブレンドでググったらそのものなソースが出てくるが。
RGBで分けなくてもいいと思うんだけど
253 :
244 :2007/12/29(土) 21:39:45
>>245-252 ありがとうございます。
>>246 さんのアイデアを元に少しもじって、
無事除算の回数を一回に減らすことができました。
また、
>>248 さんのテーブルを使った手法でも、
それとほぼ同程度の速度を出すことに成功しています。
これなら何とか要求されている時間を満たせそうです。
参考までに変形後の式を書いておきます。
temp_a = (256 - src_a) * dest_a >> 8;
new_a = src_a + temp_a;
// temp_a / new_a + src_a / new_a = 255より
dest_temp_a = (temp_a << 8) / new_a;
src_temp_a = 255 - dest_temp_a;
// 以下、pmaddwdを用いて並列計算
new_r = (dest_r * dest_temp_a + src_r * src_temp_a) >> 8;
new_g = (dest_g * dest_temp_a + src_g * src_temp_a) >> 8;
new_b = (dest_b * dest_temp_a + src_b * src_temp_a) >> 8;
>>251 MMXを使うものも含め、アルファブレンドのソースはよく紹介されていますが、
出力先のα値まで保証するものは少し調べた限りでは見当たらなかったので、
今回は自作してみることにしました。
出力先のα値は何に使うの?
>>254 最終的に別の画像にまたアルファブレンドします。
出力先のα値が保証されていると、
複数枚の画像をブレンドした状態でキャッシュできるので、
枚数が跳ね上がったときに重宝しています。
256 :
デフォルトの名無しさん :2007/12/31(月) 23:16:29
全部アセンブリでCからリンクできる関数を書きたいのですがどうすればいいでしょうか? まったく見当もつかず途方にくれてます。 ポインターだけでもいいので教えてください。
gcc -S foo.c
>>256 というか、先ずは環境を明らかにしようぜ。
x86のLinuxか、PowerPCのLinuxでお願いします。
gccです。
>>257 それはアセンブラをじっと眺めろということでしょうか???
何か関数を作って、法則見つけようぜ、ってことじゃね。 とりあえず、 ・ 最初と最後にはスタックフレームの確保を行うと楽。 ebp とか esp とかいじってる部分がそれ。 ・ 退避すべきレジスタがいくつかある。最初と最後で push/pop してるやつがそれ。 ・ 引数を渡すときは、基本的には引数をスタックに push する。 後ろの引数から push するか前のから push するかはコンパイラ次第。確認しる。 可変長引数かどうかで変わる事もあるので注意する。 ・ 関数を呼んだ後に引数の分だけスタックポインタを戻すには、 呼び出し側から esp に引数のサイズだけ add するか、 関数から戻る時に ret の引数を使うかする。 どっちなのかはコンパイラ次第。確認しる。 可変長引数かどうかで変わる事もあるので注意する。 標準関数を call した後に add する必要があるかどうかも確認しる。
2008年こそアセンブラをマスター!
>>260 どこかにその法則を説明しているサイトなり書籍はないですか?
というとか誰かアセンブラを習うのに最適な学習書を紹介してください
>>262 asm-cだけわかればいいのか?
結局、石のアーキ知らないと、asm使う意味が薄いよ。
x86とppcじゃ違いすぎ。
昔、ボーランドのTURBOシリーズでCやPASCAL(Delphi)やらからAssmを呼び出す為の説明が在ったのを思い出した。
calling convention gcc でぐぐれ。stdcall fastcall cdeclでもいいぞ。
regparm使って破綻しそうな予感。
久しぶりにbinutilsのスナップショットきた。 asでも-marchのサポートとかが入ったから遅れたのかな?
コードをエンコードしてセクション名ブランクにしてセクションの属性を IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE にしてる実行時デコード型プログラムの逆アセ面倒くせー!! はぁ、ちょっちスッキリした。
人生nopだ。
死ぬということじゃなくて, 何もせずに時(クロック)だけが進んでいく,って意味じゃまいか
hlt 後で起こしてくれ
俺なんか here: jmp here してるんだぞ
Windows32プログラミングするのにお薦めのアセンブラ、デバッガってなんですかね。 インラインアセンブラと EXDEB使ってるんだけど、32bit部分対応で微妙に使いにくい。
>>276 アセンブラが使いにくいのかデバッガが使いにくいのかどっちだ。
>>275 暖房器具ですか?
つうか"jmp $"でいいんでないかい。
>>277 デバッガじゃないかい。
機械語レベルでまともなデバッガなんて絶滅したと思うが。
教えてください。 int __stdcall AsmFunc(int *v1, int *v2); という関数の中身をMASMで書きたいのですが、下のように書いてもうまく動作しません。 v1に数値3hを代入したいだけなのですが、何も変化がありません。アセンブル、コンパイル、リンクでエラーは出ませんでした。 // asmfunc.asm _AsmFunc@8 PROC PUBLIC push ebp mov ebp, esp mov eax, 3h mov dword ptr [ebp + 8], eax leave ret 8 _AsmFunc@8 ENDP // test.c int v1, v2, ret; ret = AsmFunc(&v1, &v2); どう書くのが正しいですか?
280 :
デフォルトの名無しさん :2008/02/24(日) 15:40:49
age忘れ
mov ecx, dword ptr [ebp + 8] mov dword ptr [ecx], eax こうじゃない?
>>281 ありがとうございます!その通りでした。
上のソースでは、v1の参照先ではなく、v1そのものに入れてしまっていたんですね。
助かりました。
279ですが、逆アセして色々調べたところ、下の1行で良いことがわかりました。 mov dword ptr 8[ebp + 8], eax MASM特有の記法でもない様子なので、これで行こうと思います。
インラインアセンブラでasmの前に _ が 一個の場合と二個の場合の違いを教えてください。
コンパイラのマニュアル読め
インラインアセンブラの記法はコンパイラ独自
ちなみにVisual C++だったらどっちでも同じだな。
Visual C++の場合 _asm は/Zaオプション使用時には未定義になるが __asm は/Zaオプション使用時でも有効
asmだか__asmのどっちかって規格の予約語じゃなかったっけ? はずされたんだっけ?
とりあえず C++ の規格には asm がある。 どういう意味になるかは処理系定義。
ANSI規格の解説も読めない白痴が来るとスレがひたすら引き締まる
アンシー(笑) スイーツ(笑)
7.4 The asm declaration An asm declaration has the form asm-definition: asm { string-literal } ; The meaning of an asm declaration is implementation-defined. [Note: Typically it is used to pass information through the implementation to an assembler. ]
__asm__ はCのほうな
asm は J.5.10 にあるようだが、 __asm__ なんてどこ探してもないぞ。
gcc
自分から規格の話振っといて 何で処理系依存の話してるんだ?
いいえ、ケフィアです。
aboneばかりだが前後の状況から察するに またあいつ負けてるのか
MSVCについてくるアセンブラソースを、勝手に流用したらタイーホ? 例えばx86用strcpy.asmをGAS用に移すとか。
ライセンス嫁
>>301 そりゃダメだろ。
まあ、strcpy() あたりだとどう書いても似たようなものになるとは思うが。
>>301 MSVCRT.DLLをリンクする程度だったら
それはシステムライブラリ扱いだからモウマンタイ?
ていう話ではない?
305 :
301 :2008/03/05(水) 12:26:41
やっぱり黒か… ライセンスを探したがどこにも無くて。 x86でNULLを探すための、アライメントを考えた4バイトを一気に調べるソースが、とても参考になったから使わせてほしかったけど、止めておきます。
単独でルーチンにもならんような、部分的なテク(イディオム)をまねするぐらいなら 問題ないな
>>306 現時点の業界内での常識的判断からは「問題ない」かも知れないが、
訴訟などでイチャモンをつけられる可能性は否定出来ない。
仕事のコードは 判っている範囲ではクリーンにせざる得ない世になっている気がする。
>>304 .dll のリンクはまた別の話だろ。
それがダメなら、Windows のアプリなんか作れないだろ。
かといって for(i=0;i<max;i++){ の行をコピペしただろとか噛み付かれることまで気にすんのは杞憂がすぎるよーな。 つか strcpy ぐらいなら gas に移植しなくても gcc が標準で同等版もってそうな 気がするけど。
原則に戻ろう 創造性のあるコードをコピーすることが違法
人間は違法
違法だが合憲
どなたか教えてください。 参考書を見ながら学習中ですが、1.の環境で2.のファイルを3.のコマンドでビルドした結果4.のアセンブリコードを得ました。コールして欲しいsys_writeがコールされず、実行ファイルは思った動作になりません。 5.のように修正し、6.で実行ファイルを生成すると思った動作になります。 何が問題となって3.のコマンドでsys_writeコールが生成されないのかわかりません。
1.環境 CPU:AMD-K6(tm) gcc version 4.1.2 GNU ld version 2.17 Debian GNU/Linux ldconfig (GNU libc) 2.3.6 2.ファイル hello-asm.c #include<unistd.h> char message[]="Hello, world!\n"; int sys_write(int fd, const void *buf, int len){ int ret; asm("int $0x80" : "=a" (ret) : "a" (4), "b" (fd), "c" (buf), "d" (len)); return ret; } void sys_exit(int stat){ asm("int $0x80" : : "a" (1), "b" (stat)); } void main(){ sys_write(1, (void*)message, sizeof(message)); sys_exit(123); } 3.コマンド gcc -nostdlib -save-temps -Wl,--entry=main -Wl,-t -o hello-asm -O2 -finhibit-size-directive -fno-ident -fomit-frame-pointer -fcall-used-ebx hello-asm.c
4.生成アセンブリコード一部 main: leal 4(%esp), %ecx andl $-16, %esp pushl -4(%ecx) pushl %ecx subl $4, %esp movl $123, (%esp) call sys_exit popl %eax popl %ecx leal -4(%ecx), %esp ret 5.正常動作アセンブリコード main: 削除: leal 4(%esp), %ecx 削除: andl $-16, %esp subl $16, %esp pushl $15 pushl $message pushl $1 call sys_write 6.修正後コマンド as hello-asm.s -o hello-asm.o /usr/lib/gcc/i486-linux-gnu/4.1.2/collect2 --entry=main -o hello hello-asm.o
asmにvolatileを付けてみたらどうかね。
317 :
313 :2008/03/11(火) 00:25:38
>>316 おおー、直りました!
コンパイラは不要なソースとして認識したんですね。。。
-O2 → -O0 に変更したらvolatile無しでも動作しました。
ありがとうございましたm(_ _)m
gccでアセンブラはかせてみたら下のようになった(抜粋)んだが・・・ main: pushl %ebp movl %esp, %ebp subl $8, %esp andl $-16, %esp movl $0, %eax "andl $-16, %esp"の部分は動作的にはスタックポインタの下位4bit切り捨てはわかるんだけど、 どういう意味なのかがよく分かりません。 ページング方式だからメモリ確保かなあと思ったけど確保される容量みても全然すくないし・・・
アラインメント合わせだと思うけど
-n での AND は便利なので覚えるべし。
>>318 の例だと
16バイトアラインで8バイト以上のスタック領域を確保
という意味になる。
机上で考えてごらん。
もちろん
>>318 の例のエピローグコードは理解できるね?
321 :
318 :2008/03/14(金) 14:02:58
レスありがとうございます。
いろいろ自分でも調べてましたが、アライメントの調整っぽいですね。
アセンブラは学校で理論的なことは教えてもらったんですが、実践的なことは全然ならってなくて・・・
>>320 エピローグコードって最初の3行のコードですよね?
これって
呼び出し元のベースポインタの退避
呼び出し先のベースポインタの設定
最初のプッシュしたデータ分のスタックポインタの設定
ですよね?
辞書位引け epilogue prologue
プロローグとエピローグのどっちがどっちだったか分からない時期が俺にもありました…
pro- 前〜 epi- 後〜
GCCの拡張で、".code16gcc"を使えば、32bitセグメントから16bitセグメントの関数を 呼び出したり(その逆も)するのが簡単になるようなんですけど、16bitと32bitが混在 するようなコードを書く場面ってあるんですか?
ブートローダーとか?
仮想86モードとか?
リブートのためのエピローグコードとか?
16ビットで書いてあるコードを32ビットに移植したいときとか?
物好きとか?
code16gccは16bitコードを埋め込める機能であって呼び出せる機能ではないようだが
DEADBEEF
BADFACE
CAFEBABE
EFFACED
BACA
LCDのバイアス電源は主電源落とす前に切っとけよ。 とかいうときに。
Ce11Ba11
最近アセンブラ勉強し始め、初めての8086+Debugコマンドで本を読み終わったんだが、 次はどこぞのアセンブラを使ってみたいと思う。 少し前だとnasmだと思うけど、最近は何がメインで使われてる? Win+CygwinかFreeBSDの環境で使う予定。
340 :
デフォルトの名無しさん :2008/04/13(日) 10:03:05
あげ
>>339 Windowsのデバドラ開発とかだったら由緒正しいMASM。確かDDKに添付。
PC-Unix界隈だとやはりnasmか、あるいはgas
こんな過疎スレ常に見てるやついないって 今でもNASM・GAS
>>341 ,342
thx
まだnasmがいいのか。MASMも使えるならやってみるかな
ム板ってアセンブラスレ、ここくらいだっけ?
やっぱり2chにはアセンブラ使い少ないのか。。。
て言うか、RISC が流行りだした頃から、アセンブラのコード書くのが 激しく面倒になったし C でそれなりの性能が出るようになったから、 BIOS / ブートローダとか、ほんとにカリカリチューニングする奴ぐら いしか使ってないだろ。
音声処理、画像処理、暗号化、圧縮… まあこんなとこか
ダンゴさんはもっと有用なことに使ってそうだな
>>344 R3000とかは、そこら辺のCISCなどよりむしろ楽だったよ、しかも高速だった。
R4000以降は最低だけどね
gas は嫌いだ、人が書くようにできてない
gasの構文はきもいんだよな
>>347 アセンブラの書きやすいCPU(基本に忠実な32ビットCPU)
68020、MIPS32、V70
アセンブラの書き難いCPU
SuperH、Alpha、SPARC、ARM、IA64など
アセンブラの書き難いCPU x86も追加してくれ
ARM そんなに悪くないけどなぁ。
こなれてると思う。
350がロートルだということはわかった
遅延ジャンプの理由は何?
SHは「Cの関数で変数はほとんど16個以内に収まるからレジスタ数は16あれば十分」 みたいな設計思想で作られてるんでアセンブラではそんなに扱いやすくないんでないの? 良くも悪くも高級言語時代の組み込みCPUアーキテクチャって感じ あとIA64も同意する。
SH はセコくて嫌だったな。 そーゆー設計思想だからしゃーないけど。
アドレスの指定がめんどくさい
8085やZ80や6809や8051はASM書きやすかったな。85は今でも現役だけど。
要求がそれほどじゃなかったからね、昔は。
361 :
デフォルトの名無しさん :2008/04/14(月) 07:01:20
8085よりは演算命令が充実してレジスタの多い8086の方が書きやすい。 でも68000はもっと書きやすい。って行くとR3000は書きやすかった。
>>356 はGPLv3とAGPLを混同する悪質なFUDをばらまいてた固定
一言で言うとGNUは嫌いです
>>359 この時代で一番いいのは6502だろ、マイナーだったことと周辺LSTのそろいが悪いので売れなかったけど。
反面一番売れたZ80は、タイマー・DMA・I/Oインターフェイスと大抵の物がそろっていて、はんだこて握らなくて済むように
ソケットにでもしてしまえば今のPC自作と変わらないレベルだった。
それ以外にもZ80は、メモリーを節約しやすかったので、この点もメモリーの制約の大きな時代では大きなアドバンテージになったと思う。
それで、書きやすかったかといえば・・・・・ちょっと微妙な気がするな。
16ビット計算もなんちゃって計算なのでフラグが使えなかったりと・・・
高速な乗算に使える1を入れての右シフトは公開してほしかった、こんな大事なもの非公開の隠し命令にするなんて何事だと当時思った。
もうひとつついでにDRAMのリフレッシュをする機能であるRレジスタは、CPUリセットで停止してしまう片手落ちをなんとかして使えるものにしてほしかったな。
リセットするごとにメモリーが消えては使い物になりましぇん。
こんな事書いていると年がばれるぅぅぅ
>>363 わざと誤情報をばら撒いたという事か
悪質だね
>>364 今もこれだけの愚痴が出るということは
かなり根に持ってるな?w
アセンブラ、ゴリゴリいじってみたい気もするけど、
今いじる仕事といえばかなり卓越してないと無理だろうな。。。
趣味だけにしとこ
6502ってハミコンか?
ダンゴさんがピシっと〆てくれたな
6800作ったMotorolaからスピンアウトした連中がMostekって会社作って6502作った 6800は8bitとしては歪んだ(贅沢な)設計だったが6502は潔かったので安くて速かった AppleIIに採用されたことで有名 ファミコンはそれのカスタム版だったと思う
>>367 いやぁ、懐かしい思い出だよ
Z80はプログラムを作る方はともかく、ロボットを作ったりしたときなどはそりゃもう一番楽しいチップだったよ。
大手メーカーがこぞってこれを使ったのは、技術的なハードルが低いのとコストの安さだろうね。
逆にいえば、これを使っているメーカーの技術力はしれていたと思ってます。
シャープのテレビ事業部の製品などは、技術とかそんなの関係なしに楽しかったな、ハードはああでなきゃいかんです。
富士通は技術力あったけれど、つまらんマシンだったと思ってるので。
>>370 6502は、無駄を省き必要最小限にシェープアップすると、ここまで変わるのかという例だね。あとR3000も。
不必要な命令セットは、憶える事も余分に増えるし、大して代わり栄えのしないトライアンドエラーによるチューンが増える。
時間が無駄になる割には効果は薄いと思った。
>>371 全くだ。6502は6802に対応するチップだが本家より先に出したんだから凄い。
多分Moto内部で6800に負けたデザインなんだろ。
>>371 そういう経験っていいなー。ハード屋目指してみるかな?w
けど、今のハードのレベルだと三十路過ぎから勉強しても無理だよな。。。
趣味でやろうと幾つか買ってるけど全然いじってないしorz
>>374 じゃあ何屋になるんだろ?単純に組み込み系かな?
すまん、門外漢で全然分からんw
>>372 > 6502は6802に対応するチップ
どこが対応してるんだ?
ソフト屋(低レベル)とか制御屋とか?
組み込みとか楽しそう。
>>390 だから、位置付けのどこが対応してるんだ?
# 中身は、言わずもがなだろ。
対抗するチップ、のほうがしっくり来るな。
はいはい、おじさん同士喧嘩しないの!
横からお邪魔しますが,型番が全てを表してるんじゃないの?
いえ、型番だけではビット数もパッケージのピン数も 開発者の嫁の顔もわかりません。
昔はVRAMのアドレスやジョイステックのポートを直接読んだり書いたり、Hello World なんかよりよほど面白かったんだけどな アセンブラがわからなくても、ベーシックについているモニタモードなどでアドレス指定して直に書き換えしているうちに憶ちまった人もいるし 今はいちいちOSにお問い合わせしないと何もできないからすぐに結果が出せなくて面白くないね。 言語関係をやっている人以外には興味の湧くところでなくなった。
> 昔はVRAMのアドレスやジョイステックのポートを直接読んだり書いたり 必要なのはアセンブラではなくてメモリのマッピングの情報だったりする。 自身でも書いているけど、ベーシックだろうがCだろうが可能だよね。 ちょっと前に趣味でDSの自作ソフト作ってみたけど、 そこでもARMのアセンブラの知識が有効活用されたと思ったことはあまりなかったな。 本当にもうコンパイラ屋さんしか必要ない情報なのかも
思い出した。ゲームのプロテクトを外すのにはアセンブラ必須だったね。 9801のディスクアクセス割り込みの CD 1B とか懐かしいな。
>>388 コンパイラのアセンブリ出力見たりしない?
私は最適化をどう行なったのか当たりをつけるために、しばしば見てるんだけどねぇ。
>>388 > 本当にもうコンパイラ屋さんしか必要ない情報なのかも
ブート部分を書く人にも必須だよ。
まあ、流通量の多い機器ならコンパイラ屋さんがサンプル提供している
ケースも多いけど。
>>390 >>388 は知らんけど、俺は何か問題かある時とかよっぽどきちきちに組み
たい時以外は見なくなった。
最近はコンパイラの品質も高く あとは言わな(ry
>必要なのはアセンブラではなくてメモリのマッピングの情報だったりする。 最近のハードウェアがまたI/Oをメモリーにマップする(x86場合はIO空間か?)より 通信が中心になってパケットをDMAまたは、それに類似する方式で送る形式になっているので、 「すぐにアクセスできる感」は直に触ってもないんだよな。 近年のハイパフォーマンスを実現するにはアドレスとデータのペアなんか送っていたのでは性能が出ないというのも難解にしているような気がする。 すっかり総ネットワークプログラミング状態だよ。 昔ながらのアクセス方法が今に続いているのはメモリーだけになってきている。
>>392 高くはないけれど、最近のハードウェアの特性が地味チューンを無意味にしている所はある。
メモリーキャッシュに乗せる技術でほぼ全部だし、それ以外はやってもやらなくても殆ど変わらない。
うーむ、アセンブリ出力を眺めてループ内にdivがいくつあるか数えるような使い方するのはうちくらいか?w
よし、みんなで秋葉原の鈴商にHD64180を買いに行こう!
>>389 よく SYMDEB で弄ったな。
>>396 作りかけのCP/Mボードが部屋に転がってるw
まだ64180なんて売ってるのか。
まぁ8085とか6800とかも売ってる所が在るから不思議では無いか。
6800系はまだ現役だね。マイクロコントローラになっちゃってるけど。
>>395 多分君のところだけ。
普通のところはそんなことする必要がある部分は初めからアセンブラで書くと思う。
86や使いこなせばこなすほどコンパイラなる我が身なりけり 68kどれを使えばよいのやらgccに道を問ふまで 引用元忘れた
最初のコンパイラはASMで書いたけど、cができたらそのcもcで書き直すよね。 そうすると新しいチップができてもそのコンパイラはコンパイラで書くんじゃないの?
機械語やデータのバイト列生成するだけならfwriteとかfputcharで十分だな
sレコードとかならprintfでいける。
ところで昨日鈴商いったんですよ、でね、HD64180探してたら目の前に8085があるじゃないですか。
マルチプレクスされたバスなんて、ちょっと回路組んだ気分にひたるには丁度よさそうなんで、
そのまま8255と8251と8KSRAMまで買って帰ってきちゃいましたよ。
あと373とかも。
あとはROMが欲しいので、今日、若松でDIPのFlash買って来ました。
さて、ハンダ付けハンダ付け・・・
>>397 CP/M関連でお勧めのサイトありますか?
あったら教えてください。
>>396 俺が知っているのはTMP64180だな。
>>401 コンパイラ本体は C で書くけど、どんなコード生成すればいいかはアセンブラと
言うか機械語の知識が必要でしょ。
あと、コンパイラによってはアセンブラソースを吐く奴もいるし。
>>407 コンパイラの最終一歩手前フェーズ(機械語生成フェーズ)がその知識を抱え込めば
いいはずですよね。 その後に最適化フェーズが何パスかあるかも。
アセンブラソースを吐かすのはデバックとかそのフェーズ検証のためが第一義で、
コンパイラでアプリを開発する人には、ゼロとは言わんがあんまりメリット無い気がする。
>>408 いや。コンパイラ使いにも、-S 出力のメリットはある。
同じ処理で、どっちの書き方が効率良さそうかをみる時には活用できる。
もちろんベンチを取るでもいいんだけど。
半田づけする時のヤニが焦げる香りが好きで吸い込んでいた事があったのを思い出して今ぞっとした。鉛中毒は何年後にでるかなorz 融点が高いという話は聞いていますが今の鉛フリーの半田は取り扱い難くなっているとかあるんですかね?
はげしく板違いだな。 鉛フリーは使った事ないけど、濡れにくいと聞いている。
上でも言われてるけどコンパイラの最適化具合見る為にアセンブリ吐かせるっしょ。 iclもifort単純な演算にハメてやらないとすぐベクトル化諦めやがる。 ま、大抵の場合はそこまで単純化出来ないから結局intrinsics使う事になるんだけどな。
技量に大きく依存する点も似てるな
intelプロセッサに未だにDWORDの並列演算が無いのは嫌がらせか?
DWORD*4ならSSE2になかったっけ?
415だが正しくは32bitの飽和並列演算が無いの間違いだった。
実行頻度低そー
2byte空間にOpcode余ってないからじゃないの? それよりSIMDにNEG代替命令が無くて困る。 NANDやNOR入れてくれよ。
>>420 pcmpeq で all 1 つくって、pxor じゃ駄目なの?
レジスタ節約したいとか、クロック節約したいとか切実に思うけど。
ぼくがかんがえたAVX 2に入れるべき最強命令(笑) vpnand ymm0, ymm1, ymm2 vpnor ymm0, ymm1, ymm2 vporn ymm0, ymm1, ymm2 vpeqv ymm0, ymm1, ymm2 vpcmov ymm0, ymm1, ymm2, ymm3 あと、3〜4入力のAND, OR, XORがあってもいいくらいだな これなんてDSP? つーかDWORDの飽和演算なんてARGB128bitとか使わない限り要らんな。
>3〜4入力のAND, OR, XOR これいいな
>>420 AVXの発表で思ったんだが、まだ1byte空間に空きがある事の方が驚き。
NEGは俺も凄く欲しい。しかしVMXにも無いよな。
マイナス取るって事はその後演算するって事なんだろうから、
可能な限り演算順序を入れ替えて対処しろって事かと。
あとはuOP Fusionみたいのでxor/subの組み合わせを特別に認識している可能性はある。
もしくは入れ替えに対処出来ない状況というのはa*(-b)のような積や商に入っている場合だから、
どっちにしろ積のレイテンシ待ちだしその間にやれば?って発想かも知れん。
>>423 ハードウェアの仕組みを知らんが、入力ポートと出力ポートの数に制限があるんじゃないか?
そうじゃないと配線が大変な希ガス。
> ハードウェアの仕組みを知らんが ハードウェアの勉強してから書けよ。
negはできるわ。SSSE3のpsign*が使える。まあ2段構えになるが。 無いのはNOTだな。 AVXでは4引数(3入力1出力)を実現するのにVEXの他にimm8の上位4ビットを使ってるが 下位4ビットも使えば5引数(4入力1出力)も可能だろうし、実際に何かしらやる計画はあるのだろう。
>>425 スマン。
>>426 命令にエンコード出来るかどうかじゃなくて、実装出来るかどうか。
多分レジスタファイルが何十とあって、
そこから処理する値を取ってきて保管する場所があって、
それを処理して、出力を保管する場所があるんじゃないか?
例えばパラレル配線で繋がっているメモリからの読み出しをクロック当たり1byte増やそうと思ったら
CPUのピン、メモリのピン、基盤の配線が全て8本増えるって事だと思うんだが、
オペランド数を増やすのも似たようなことが起きそうな気がする。
3オペランド化は殆どの命令に恩恵があるからやる価値があったのだろうけど
たった数命令の為に膨大なトランジスタリソースを裂く必要があれば全く目もくれないと思うんだが。
謝る暇があったら、勉強しなよ。 > 多分レジスタファイルが何十とあって、 > そこから処理する値を取ってきて保管する場所があって、 > それを処理して、出力を保管する場所があるんじゃないか? 何を言いたいのかさっぱりわからん。 そのあとの文章も同様。
>>428 お前は分かっているのか。
大雑把に教えてくれるなり指摘してくれ。
CPUにレジスタファイルが何十と入っているのは分かるよな。
処理部分がVHDLで記述されていようと自分で回路書いていようと、結局は回路な訳だ。
例えば1bitのAND回路があった時に、通常入力は2つで出力は1つだろう。
レジスタファイルが100あってもその全てがAND回路に繋がっているはずがない。
入力として必要な2つだけが選択的に一次レジスタのような格好で取り出され、処理が選択されるんじゃないかと。
> そのあとの文章も同様。
妄想だらけな文章でも、そのあとの方が理解しやすいと思うんだがどの辺が分からなかった?
>>429 「CPUの作り方」みたいな本が沢山出てるから、どれでも一冊読んでみ。
バスとかセレクタとか・・・
「imm8を使えばとれる引数増やせるじゃん」って言ったら 「デコーダが複雑になるだろ」とか集中砲火浴びたことがあった。 今じゃ、 Opcode ModRM [SIB] [DISP] imm8, imm8 なんて命令すらありますね。AMDだけど。 SSE5では最初のimm8をDREXに置き換えたのかな?
ダンゴさんは先見の明がありすぎるな
>>429 デコーダはあっち置いといて。
4入力ANDを追加するとして、バスから4入力ANDへ引く線と
AND回路と、結果を書き戻す回路が必要になるだけだろう。
ファンアウトでも気にしてるのか?
4入力のANDは [A]─AND─AND-[E] [B]─┘ │ [C]─AND─┘ [D]─┘ 一方、VMXでいうvselbとかAMD SSE5のpcmovは [A]━━━━AND-OR-[D] [B]─AND─╂─┘ [C]━┷NOT┛ VMXに関してはvand/vor/vnor/vxorと同じレイテンシで実現できてることを考えれば 3〜4入力はそんなに実装難易度は高くない気がする。
多オペランド演算の問題はALUではなく レジスタからALUへのパスが複雑化することにあるんだが。 どうせ回路を複雑にするなら特殊な専用命令を追加するより スーパースカラやベクトル演算器を入れた方が効率がいい。
今はregister fileのportからALUへのpathはoperandの数だけ独立に引いてる? それとも時分割してる?
レジスタファイルって何を指してる? ただのレジスタってか、FFのことを言ってるのか?
何十って言ってるから、32/64bit レジスタを1個と思ってるんじゃね?
64ビットx8本くらいのレジスタファイルが100セットくらいあると思ってるのかもよ。
いや、だから、そのファイルって、何を言おうとしてるのかなと。 どこかのメーカの用語か?
ああ、レジスタ全体のことか。失礼。
レジスタファイルはプロセッサコア方面では普通に使われる。 CPU作ろう系の本には必ず出てくるよ。
アーキテクチャによるだろ
アーキテクチャはあんまり関係ないだろ。 全部ワイアードでも、マイクロプログラムの説明は出てくるように。 ただ、萌え系のあの本にはレジスタファイルの解説は無さそうだ。
レジスタファイルの概念が確立した以後の本で、その本で造ろうとする石で プロセッサファイルを使っているか、総合的な解説に字数を割いていれば 出てくるとは思うけど。
とりあえずレジスタリネーミング機構のあるプロセッサには確実にあるものだと思ってるが。 ATOMにすらあるようだな。2スレッドで独立してるらしいが。
>>447 > プロセッサファイルを
また、俺の知らない単語が出てきたよ...。
おれも初耳だよ(´・ω・`)
451 :
447 :2008/05/05(月) 15:27:42
かきまつがえたorz
いまのうちに実用新案出しておくんだ!
商標登録でもいいんじゃね?
おれはネコ耳だよ
娘さんを下さい
456 :
デフォルトの名無しさん :2008/05/16(金) 11:56:11
x86 について調べていますが、Core 2 にも U パイプラインや V パイプラインがあって、それぞれペアリングできる条件がありますか? intel の資料で「ペアリング」や「Uパイプライン」で検索してもヒットしないので、どうすればペアリングされるのか分かりません。
457 :
デフォルトの名無しさん :2008/05/16(金) 12:01:59
OSもなにもなしにx86系のCPUに直接マシン語を読ませて、実行するには どういう環境が必要でしょうか
コードをROMに書いてみるなりしたら?
>>456 Core 2は4Wayパイプラインでアウトオブオーダ実行だからそんな古い知識は捨ててしまいなさい
ALUのポートとレイテンシさえ知ってればいい。
まあAtomではまた必要になりそうだがな
>>457 WindowsやLinuxなどのUnixなどたいていのOSは、
CPUの保護モードを利用して、普通の機械語プログラムは
直接CPUにくべて走らせています。
もし、OSの保護下でなく直接機械語を実行させたいなら、
MS-DOSのような保護のないOSを使うか、ブートセクタに
書き込んで実行させるのが手軽です。
>>457 『30日でできる!OS自作入門』という本が参考になるかもしれない。
読んだことないけど。
リアルタイムOSを利用しましょう
>>459 U/V パイプラインというものはないということでしょうか?
参考にしていたサイトが古かったようです。
ALUのポートは Core 2 では確か 3 つですよね。ということは、ALU を使う演算は同時に 3 つできるのですね。
レイテンシは Intel の資料の付録にあったので、それを参考にします。
スループットは大事ではないのですか?
>>463 もちろん大事。
スループットは、殆どの命令で1クロックサイクル。
ALUの3ポートのどれでも実行出来る命令は1/3と表現される。
んで、レイテンシ・スループットサイクル数が多い命令は概して複数のμOpsに分解して実行する命令ですね。
まあ各命令ごとの使用ポートの詳細はagner.orgあたりが詳しいと思う。
掛け算とかシフトとか発行できるポートが決まってるから、その辺さえ抑えておけばOK。
ちなみにPentium Pro以降のx86アーキテクチャは命令の並べ方自体にはそんなに意味はない。
10数命令前後する程度なら、依存関係さえ無ければ平気で並べ替えて実行できます。
レジスタ少ないからこの >依存関係さえ無ければ って意外と手で書くには難しいところはあるかもしれないけどね。
>>466 それは団子に散々指摘してるんだが学習しないんだよな。
ストレステスト(笑)しか作った事無いんじゃないかと。
CPUが割と広い視野を見てくれる事は事実だろうから知識として与えてもいいが、
質問者がわざわざintrinsicsじゃなくてアセンブラでやりたい/出来るだけの知識がある人なんだから
重要なところから目を反らすような発言はいただけない。
>>467 ←レジスタリネーミングも知らないのかこいつ
依存関係がなければリネームできるけど あったら無理だろ
> 依存関係を断ち切る方法だってIntelの最適化マヌアルに載ってるんだがな。 最初からそういう方向性でものを言った方がいいだろって言ってるんだよ。 否定されたものだから否定で返しやがって ほんっと主語が読めてないな。
前述のagnerのにもIntelの資料読む必要ないくらい詳しく載ってる。
>>471 >ほんっと主語が読めてないな。
期待したあなたの負け
ダ●ゴさんのカキコでスレが一気にヒートアップしたな
474 名前:あぼ〜ん[あぼ〜ん] 投稿日:あぼ〜ん
>>471 自分の了見の狭さを露呈したからといって相手に理解力がないことにするのは詭弁以外のなんでもないよ。
自分の了見の狭さ
いちいち例は挙げないが団子が知ってる知識だけ披露して、 外野の煽りはまだしも理論的に攻められてもスルーするのは昔から。
団子さんの知識に嫉妬する輩のせいでスレがションボリしたな
外野アァン
壊れたラジオみたいなもんだ 使い方によっては便利?
せいぜいお笑い系番組聞くくらいだね。 登山途中で天気図書くとか、急いでる時に渋滞情報聞こうとかいう用途には不向き。
>質問者がわざわざintrinsicsじゃなくてアセンブラでやりたい/出来るだけの知識がある人なんだから >重要なところから目を反らすような発言はいただけない。 これがどこがどう理論的なんだ自画自賛か 「知識がある人」だとみとめつつも、ちょっとマニュアル調べればわかることを理解できないと過小評価してるわけだよね。 俺は「アウトオブオーダ」と「依存関係」というヒントがあればちゃんとたどり着くことは期待してたんだがな。 ついでにいうとx86はレジスタが少ないからこそかえってレジスタリネーミングは実装しやすい。 ISAレベルで数十レジスタあるようなCPUだとかえって複雑になるからね。
団子の場合、読みにも書きにもフィルタが入っていると思っておけば間違いないよ。
自画自賛くんは放置するか 自分の意見通したいだけで困ってる当事者に何の配慮のレスもしない ただの荒らしでしかない
誤読して
>>468 みたいな発言するからまずいんじゃないのか
>>485 まで通して読むとあまりに見苦しいよ
ダンゴさんの指導でスレが猛烈にヒートアップしたな
>>486 ←自己弁護見苦しい。理論もクソも無いじゃないか
>>467 からレジスタリネーミングを知らないなんて飛躍するのが理論なの?
x86って何の気も無しにコード組んでればレジスタリネーミングのヒントを与えてるんだよ
値のロードやxor eax, eaxなど第1オペランドで指定するレジスタの元の値に非依存の結果が得られる命令のほとんどがそうだ。
第2オペランド以降が依存関係がないか解決できてるのも条件だけど。
>>466 が的外れなのも言うまでもないし、SPARCみたいな古くからあるレジスタ大量に積んだ
RISCがOoOを実装してないのはご周知の通り。
そもそもOoOみたいな複雑な機構自体がRISCと矛盾する。
ところで「重要なところ」って何なのかな。
無知故の発言にしかみえないが。
命令列レベルで並列なんて考えない方が良いんだよ。
x86の少ないレジスタで命令レベル並列なんて根本的に無理だし、
結局ロード・ストアを連発する羽目になりRAWハザードで性能でないのが落ち。
おっと最近のSPARC64はOoO実装してるね。無茶なのに。
クソコテは放置推奨
(ISAレベルで)レジスタが多いと、インオーダでもちゃんと組んでやれば性能は出せるけど ユニット構成が変わったりパイプラインが深くなったりすると総崩れを起こすんだよね。 レジスタが多いが故にOoOで依存関係を解決してやるのも回路が膨大になる。 OoO時代になって、回路規模あたりの効率はレジスタの多いPOWERみたいなアーキよりもx86のほうがむしろ勝ってたりね。 ジョブズがG4/G5よりCoreのほうが性能が良いって掌を返したのも無理もない話なんだよ。 あと様々なプラットフォームに移植されてるJavaVMはスタックマシン。 スタック階層が依存関係のヒントにもなるから動的最適化もしやすいんだよ。 今やx86もVMみたいなもんだからな。JavaVMほどには洗練されてないが、ソフト資産の面で優れてる。 命令セット使い捨てのアーキには優れたアーキなんだけどねRISCみたいなのは。 CellのSPEなんかも使い捨てだろう。 PS2のときもワークステーションを作るだとかふかしてたが結局EE(ベクトルコプロセッサ付きカスタムMIPS)は使い捨てられた。
>>492 もうちょっとやりあっちゃ駄目?
あーでも納得させる自身は無いなあ。
誰も奴の知識に文句をつけてる訳じゃなくて
知識に自分の思想/宗教を付加してる事が教育的ではないと思うんだが。
> x86の少ないレジスタで命令レベル並列なんて根本的に無理だし、
そんなの思想だ。俺は無理だと思っているが、無理かどうかは分からない。
お前は今まで反対に命令レベルの並列を説いて「少ないレジスタで並列なんて無理だろう」って言われてたよな。
> CellのSPEなんかも使い捨てだろう。
単なるお前の予想だし蛇足だろう。そもそもLarabeeマンセーはどこいきましたか(笑)
インオーダのベクトル指向プロセッサはデータレベル並列性が高い処理にしか有効でないよ。 1スレッドあたりの性能が重要な用途ではOoOのスーパースケーラが引き続き有効。 バランスが大事だな。 Larrabeeは既存のx86アーキの代替ではない。 置き換わるなんて言ってるのは後藤くらいだ。
で、それは「アセンブラ」の話題なのか?
そりゃそうだろう
CPUの話題ではないのか、ってこと?
壊れたラジオだから 期待するだけ無駄 スレに住みつかれたら 無視するしかないだろ
CPU の話題を出さずにアセンブラの話をするのは無理というものだ
団子じゃなけりゃ文句も出ないんじゃね?
CPUの話題なら何でもいいってわけじゃないし。
団子が名前欄に何も入れなければ済む話だと思う
入れて欲しすぎる。NG設定が面倒。
まあなんでもいいんだけど。 「重要なこと」があると言いつつ自分は例示せずに俺に噛みついてれば彼の脳内では「理論的」なんだから たまったもんじゃないよな。 まあレジスタリネームの存在を前提としないトンデモ仮説なら何言っても否定してやるけどさ。
はいはい壊れたラジオ
耳の痛い話に壊れたラジオって言っておけば「理論的」なんだね
コテハンvs名無し ですか
団子さんへの嫉妬でスレが埋まりつつあるな
>>505 >まあレジスタリネームの存在を前提としないトンデモ仮説なら何言っても否定してやるけどさ。
ご遠慮ください。
アセンブリ言語の教科書に org 100H section .text start: mov ax, 0200H mov bx, HELLO PRINT: mov dl, [ds:bx] cmp dl, 00H jz PRINTEND int 21H inc bx jmp PRINT PRINTEND: mov ah, 4CH int 21H section .data HELLO db 'Hello World!',00H というプログラムがあるのですが、 文字列のアドレスを入れるのはbxレジスタでなければいけないんでしょうか? 例えば、 mov bx, HELLO mov dl, [ds:bx] inc bx の部分を mov cx, HELLO mov dl, [ds:cx] inc cx に変更したら動かないのですが、何が問題なのかよくわかりません。
int 21H というファンクションの仕様。 cなどでいう関数の引数。
[ds:cx]と表現するようなアドレッシングモードは存在しないから
;ファイル作成 org 100H section .text start: mov ah, 3CH mov dx, filename xor cx, cx int 21H mov ah, 4CH int 21H section .data FILENAME db 'test.txt', 00H とした時にtest.txtではなくTEST.TXTが作成されてしまうのですが。 test.txtを作成する時はどうすればいいのでしょうか?
>>514 大文字、小文字なんか気にするな。
気になるなら set DIRCMD=/L とすれば気にならなくなるよ。
君の使ってる OS で使えるかどうかは知らんが。
>>515 Windows 2000/XP でも有効ですか?
なんかアセンブラと関係ない気がする
今度はキャメルケースが全部小文字になる方が気になるw
大文字、小文字を意識するネーミングは、たいていの場合においてよくないことだと思うぞ。 MontaVista Linux のソースなんか大文字、小文字違いで同じ名前のファイルが あちこちにあるんで、Windows 上に持ってきて作業できない。 おかげで vi がそこそこ使えるようになっちまったよ。(w
>>521 Windowsでも大文字小文字を区別できなかったっけ?
レジストリの設定にそんなのがあった気がする
Win32サブシステムがDOSとの互換性のために区別してないだけで カーネルやファイルシステムレベルじゃ区別されてるな
Win32サブシステムでも区別する設定はあるけど 区別しない前提で作ってるアプリばっかりだから きっとまともに動かないんじゃないだろうか
Aとaは区別されない えーっ
大小違い同名ファイルが作れるかどうかは別だよな
NTカーネル(つかNTFS)で 全角アルファベットが酷い扱いだった時代があったことを知らないのかね。
うわ知ったか消防が来た
529 :
デフォルトの名無しさん :2008/05/22(木) 22:03:40
晒しage
ケースの話してるのに、なぜ「全角」が出てくるのか、まずはそこからだ。
だんごさんのせいでオヤジギャグがスルーされたな。
>>530 全角Aとaのcaseが区別されない、と言うことを525が言ってるからだろ
そういうケースもあるさ
団子とやりあってたヤシだがしばらく書き込めなかった。 予想通り俺の説得スキルが足りないようなのでもうやめる。 続けたければ隔離スレでも立ててくれ。
SBB AL,[EAX] ADD [EAX],AL XCHG [EAX],EAX ADD [EAX],AL あるゲームのHPの格納アドレスの近くにあるのですが これってどういう意味があるのでしょうか
ただのデータじゃね?
>>534 お前が無知なだけだろ。モダンなx86の物理レジスタは100本以上あるんだよ。
俺を説得とか馬鹿にもほどがある。 釈迦に説法と言う気はないが、俺に無意味に噛みついて質問者を混乱させてどうするんだ。 「重要なこと」さっさと答えろよ
「重要なこと」があると言いつつ、それを言わないこと自体が論理矛盾じゃないか。 俺は「無い」と断言したがな
541 :
デフォルトの名無しさん :2008/05/24(土) 09:30:04
ここで聞くことかどうかわかりませんが、電子手帳とかそういうのもマイコン 使ってますよね。そういうのに入っているデータもアセンブラがわかれば 吸い出せるんですか。昔のやつが何台もあるので。
データそのものは機械語で保存されてるわけではない。どっちかというと構造体が解析できればOK。
543 :
デフォルトの名無しさん :2008/05/24(土) 09:32:50
>>542 もう少しヒントを教えてくれるとありがいです。または参考となるURLなど
あれば。お願いいたします。
せめて機種を書け。
団子さんのカキコでスレが猛烈にヒートアップしたな
レス番飛んでる
お宝鑑定団子供大会
「さんの(レス|カキコ)」
みんなが 団子さんのカキコでスレが云々 とか書いておけば団子ハブにできるのか。いいな。
団子さん兄弟
もうこの板の名無しを「団子さん」にすりゃいいんじゃね?
そもそも彼奴が名無しで書き込めば解決なのだから 今後もハンドル付きで書き込むようなら 内容にかかわらず荒らし扱いで問題ないよな
.text:0040135A loc_40135A: ; CODE XREF: sub_401350+28j .text:0040135A cmp [ebp+arg_4], 0 .text:0040135E jz short loc_40137A .text:00401360 mov ecx, [ebp+var_4] .text:00401363 mov byte ptr [ecx], 0 .text:00401366 mov edx, [ebp+var_4] .text:00401369 add edx, 1 .text:0040136C mov [ebp+var_4], edx .text:0040136F mov eax, [ebp+arg_4] .text:00401372 sub eax, 1 .text:00401375 mov [ebp+arg_4], eax .text:00401378 jmp short loc_40135A .text:0040137A loc_40137A: ループで文字列の比較をしてるんでしょうか? インクリメントしてる方の処理が何をしているのか。
//
>>555 for (; arg > 0; ++var, --arg) {
* var = 0;
}
// ただの配列のクリアだね。随分と無駄なコードだけれど。
x86やAMD64向けの、NUL文字の位置を最速で求めるコードって何ですか?
ダンゴ様のピリっとしたベンチマークが求められているな
ダンゴちゃんの愛されっぷりがわかるスレだな
みんなツンデレすぎ
長い文字列なら16byteごとに一気に判定してしまうのが吉 lea edx, [str] pxor xmm0, xmm0 loop1: movdqu xmm1, [edx] pcmpeqb xmm1, xmm0 pmovmskb ecx, xmm1 test ecx,ecx jnz skip1 add edx, 16 jmp loop1 skip1: bsf eax, ecx add eax, edx ; eaxに結果格納 SSE4.1対応ならpcmpeqb+ptestでNULLが含まれる16バイトを検出可能。 SSE4.2に対応してればATAを使えばNULL文字の位置まで特定できる。 まあレイテンシ隠蔽とかの最適化は各自でやれ
SSSE3だのSSE4.1、4.2だの… 最近わけわかめ
そんなことよりMIPSやろうぜ。
Intel 64 and IA-32 Architectures Software Developer’s Manual の日本語版ない?
>>567 想像で勝手な事言うが、メモリがボトルネックで流石に倍は無いだろう。
そら自力で1byteずつ調べてたらxmm使った場合の16倍の調査が必要になって
メモリアクセスに隠蔽されないくらい遅くなるかも知れないが
strlen使ったら普通4byteずつ調べてくれるから比較とかの時間はメモリアクセスの時間に隠蔽されるはず。
よく話題に上がる高速版memcpyを考えるのと同じで
ハードウェアプリフェッチを邪魔しない程度にプリフェッチの方法を考えた方がスピード上がるはず。
569 :
デフォルトの名無しさん :2008/05/26(月) 12:09:40
Windows上で動くCASL2のアセンブラを探しているんですが、何かありませんか? ソースプログラムと実行結果をテキストで出力可能なら良いのですが。
570 :
デフォルトの名無しさん :2008/05/26(月) 12:27:03
ああ、MSVCRTのstlren.asm見たらようやく理解できた。 1バイト毎にbranch命令じゃ確かにパイプラインハザードで性能でない罠。
まあ、俺は性能どころかまともに動くかすら全然確かめてなかったんで
とりあえず実験してみましたよ。
http://smallcode.weblogs.us/2006/08/22/fast-strlen-function/ のソース一式を改造して俺仕様stlrenベンチを作成。
NULL文字検出方法自体は
>>562 をベースに小改良をしたものね。
で、それぞれ一番最後のスコアだけ抽出
strlen - short strings
Microsoft: 1625 ticks, a = 145
Peter: 1093 ticks, a = 145
A.Fog: 1273 ticks, a = 145
DQN(SSE2): 674 ticks, a = 145←ここ
strlen - long string
Microsoft: 1225 ticks, a = 926
Peter: 1225 ticks, a = 926
A.Fog: 874 ticks, a = 926
DQN(SSE2): 437 ticks, a = 926←ここ
とまあ、MSVCRT版strlenの倍以上は余裕で速い。
もっとも、pmovmskbの性能によって前後するみたいだが(Pen4とかAMDのプロセッサなんかだと全力で遅いかも)
ちなみにうちの環境はCore 2 Duo (Wolfdale) 3.17GHz, Windows Vista Ultimate x64 Editionその他諸々ね
改造ソースとバイナリ一式→
http://download.kousaku.in/trip/fast_strlen_mod.zip ちなみにSSE4.1(ptestを使う方法)だとSSE2と比べても伸びなかった。
OoOやら予測分岐やらでかい口叩いてもCPUがメモリに負けてるってことか。 てかMacBook Pro (Merom)でWinXP(32bit) on VirtualPCだとDQNおせぇ。 VMWareにデュアルコア割り当てちゃってるけどバッテリ駆動じゃねえのになあ。 (VMWareは片コアだけにした方が速いと言われている) strlen - short strings Microsoft: 6024 ticks, a = 145 Peter: 6708 ticks, a = 145 A.Fog: 6036 ticks, a = 145 DQN(SSE2): 12792 ticks, a = 145 strlen - long string Microsoft: 6612 ticks, a = 926 Peter: 6792 ticks, a = 926 A.Fog: 4716 ticks, a = 926 DQN(SSE2): 12936 ticks, a = 926 イレギュラーな使い方だが、何故遅くなるのかは興味あるな。
ああ、うちのMerom機(T5500 Vista Home Premium (32bit))でも遅くなる。
【実行結果】
http://www.vipper.org/vip829067.txt.html pass [1234]
ちなみに答えはわかってる。
Merom/ConroeはShuffle Engineの実装がしょぼくて
pmovmskb reg, xmmがアホみたいに遅い。
MMXでやったほうがかえって速いかも知れない。
576をWindows Vista 32bit + T5600 (Merom) で実行したけど、ほぼ同じ結果なのだが、 short stringsのDQN(MMX)が a = 145 だった。 あとMMXとSSE2に限り、1/20くらいの割合で平均の3倍以上かかる時があった。 大体649ticksや660ticks前後なのに、突然1738ticksになったり。 でもMMX/SSE2はMSVCRTの倍を超えている。 L2キャッシュがあふれるほど長い文字列なら話は別だろうけど。
レジスタ退避コスト?
>>576 の追試結果のテキストファイルはミスで、MMXのはShortのほうでLongを実行しちゃってるオチ。
今上げてるEXEとソースは修正済み。
PenM(Banias)でも計ってみたんだけど僅差でSSE2>MMXになってる。
並列度の低いコードではベクトル長の引き伸ばしはある程度有効ということがわかる。
>>578 あーそれもありそうだな。
Windowsってコンソールへの描画すらなにげに重たいようだ。
(ファイルだと軽いと思われる)
何周か回して平均値で算出したほうがよさそうかも。
こんなタイトなループで並列度が低いとか
582 :
デフォルトの名無しさん :2008/05/27(火) 09:53:49
いまどきアセンブラよりJavaのほうが速い。 JNI使えばハードの機能もフルアクセスだし。
つ、釣られるもんか!
586 :
デフォルトの名無しさん :2008/05/27(火) 11:41:02
>>583 wwwwwwwwwwwwwwwwwwwwwww
JNIでfast_strlen.cppの関数をコールですね。わかります。
このスレを見ている人はこんなスレも見ています。(ver 0.20) フロントミッション総合 - FRONT MISSION - 105th [家ゲーSRPG] この会社辞めようと思った腐れ上司の一言0x21 [プログラマー]
590 :
デフォルトの名無しさん :2008/05/29(木) 16:29:58
すいません。アセンブラの宿題が終わらなくて。。。 どうか、手伝ってください。。。 Define a character string named CO_NAME containing "Internet Service" as a content. コレ分かる方います? あ〜!わかんね〜!
自己解決しました
593 :
デフォルトの名無しさん :2008/06/03(火) 00:55:58
アセンブラでポインタってできるんですか? 変数の値の番地のプログラムに飛びたいんですが
どの石よ?
595 :
デフォルトの名無しさん :2008/06/03(火) 05:16:21
PICです
すごいですありがとうございます!
【算術演算結果による分岐】 N 番地の内容から M 番地の内容を引き,答えが負なら P 番地に -1(#FFFF)を,正なら +1(#0001)を格納するプログラムを作成しなさい.
>>598 #define V(X) *(short *)(X)
r = V(N) - V(M), r < 0? V(P) = -1 : r > 0? V(P) = 1 : 0;
答えが 0 の時は、格納しちゃダメなんじゃないのか?
そーゆー問題のときは"0"=正で考えていいんでないかい。 特別扱いする必要があったらそういう注意書きがあると思う。
>>598 CLRX
INCX
LDD M
CPD N
SBEX #0
CPD N
SBEX #0
STX P
>>598 ;うろおぼえ68000
START:
MOVE.W SR, -(SP)
MOVEM.L D0-D1, -(SP)
MOVEQ #1,D1
MOVE.W N(PC),D0
CMP.W M(PC),D0
;SUB.W M(PC),D0
BPL L_PLUS(PC)
NEG.W D1
L_PLUS:
MOVE.W D1,P(PC)
MOVEM.L (SP)+, D0-D1
MOVE.W (SP)+, SR
RTS
N: DC.W $FF00
M: DC.W $00FF
P: DS.W 1
しれっと特権命令使ってんじゃネーヨw
ああ、そうか。 MOVE.W (SP)+, SR RTS じゃなくて RTR で、いいんだ。
>>603 > そーゆー問題のときは"0"=正で考えていいんでないかい。
> 特別扱いする必要があったらそういう注意書きがあると思う。
そう言う思い込みはバグの元になるぞ。
68000だけはmove SRが一般命令だったり。 010になって特権命令になったが。 ところで、PC相対ってオペランドの右に使えたっけ? なんか制限あったような気がするんだが。
>>610 > 68000だけは
68008 のこともたまには思い出してください。
> move SRが一般命令だったり。
move from SR の方だけね、move to SR は 68000 でも特権命令。
> ところで、PC相対ってオペランドの右に使えたっけ?
て言うか、CMP 命令は右にしか使えない。
Add/Sub なんかはどっちにでも使える (但し、反対側は Dn のみ)
けど、CMP はその後の条件判定を反対にすればいいので、片方しか
必要ないと判断したんだろうな。
;青い本みてやりなおした68000 START: MOVE.W SR, -(SP) MOVEM.L D0-D1/A0, -(SP) MOVEQ #1,D1 MOVE.W N(PC),D0 CMP.W M(PC),D0 BPL L_PLUS(PC) NEG.W D1 L_PLUS: LEA P(PC), A0 MOVE.W D1, (A0) MOVEM.L (SP)+, D0-D1/A0 RTR dstにd16(PC)使えるの4命令しかなかた
613 :
607 :2008/06/08(日) 15:33:43
* ステップ数を詰めてみた。 MOV.W N,D0 CMP.W M,D0 SMI D0 *(00/FF) EXT.W D0 *(0000/FFFF) ORI.W #1,D0 *(0001/FFFF) MOV.W D0,P * もっと変則にしてみたがステップ数縮まらず。 MOV.W N,D0 CMP.W M,D0 SPL D0 *(FF/00) EXT.W D0 *(FFFF/0000) ASL.W #1,D0 *(FFFE/0000) NOT.W D0 *(0001/FFFF) MOV.W D0,P * Scc を用いない方法。 MOV.W N,D0 SUB.W M,D0 ASR.W #8,D0 (00??/FF??) ASR.W #8,D0 (0000/FFFF) ORI.W #1,D0 (0001/FFFF) MOV.W D0,P * そして分岐を使っていないことに気が付く。
素直な人間の思考から外れるものはコメント無いと泣けるので勘弁してください。
>>613 (PC)を使ったらもっと縮まるんじゃない?
直感的ではない技巧に走るのは厨房
それは実務に限った話だ。
>>612 > dstにd16(PC)使えるの4命令しかなかた
ほんとだ、俺もすっかり忘れてた。
そもそも、PC 相対はアクセスモードがプログラム参照 (FC=ユーザープログラム
or スーパーバイザプログラム) になるから、可変データを PC 相対でアクセスす
る領域に置くのは推奨されない。
さすがにデータ参照とプログラム参照で違うメモリをアクセスするシステムは見
たことないけど、プログラム参照領域は書込み禁止を設定しているシステムはあ
るのでちょっと注意した方がいいかも知れない。
> MOVE.W SR, -(SP)
move ccr, (-a7) でいいと思うが。
あと、68k は大抵の命令でコンディションコードが変化するから、サブルーチン
の前後でコンディションコードを保存しないと言う流儀の方が多いと思う。
コメントなしにいきなり殴り書きされてるんじゃない限り 技巧のうちにゃ入らんだろ
>>598 LEAX N
CMPX M
BPL L_PLUS+1
LDB #$FF
L_PLUS
CMPX #$C601
SEX
STD P
って最初からボケてる LDX N 或いはLEAX [N] か?
>>621 だね。6809は専門じゃないからつっこみかねてた。
ときに C6 01 にコメント振ってくれるとありがたい。
つか SEX 書きたかっただけじゃないか?
バレたか(w C6 はLDBのつもりだった、反省はしてない。
Obj-Cでsuper freeとか書くようなノリか
ただ8bitCPUだから、コスト的にはどうなんだろうな? クロック表が見当たらないぜ。
68系ばっかりになるのなw
このスレで最高にビューティフルなマシン語を持つ超エレガントなアーキテクチャのCPU仕様を作ってARM超えを目指そうぜ! プロジェクトリーダーはダンゴさんに任せた!
Kaltfeuerとでも名付けよう。
沢村さんを推します
ある命令の実行に何クロックかかるかを知りたいんですが、 CPU毎に"命令Aにはnクロックかかるよ"っていうのがリストされた資料があるんですか、それとも実測ですか? もし実測しかないならその方法を簡単に教えてください
自己解決しました amdとintelの最近のプロセッサものはとりあえず見つけました メーカーがwebで公開してるんですね・・・
なんか昨今はGoogleする前に2chって思考なのかね 人の脳みそをあんまり安く考えてると、働くようになってから 苦労するんじゃねーかな まあ、半可通の糞ほど教えたがりなんだが
これがゆとりか・・・
普通に勉強してれば命令語一覧とかに載ってるのを知ってそうなものだが・・・ そのうち 「ある命令の実行でフラグがどう変わるか知りたいんですが?」 とかの質問も来るのかな。
>>632 逆に半可通だからこそそういう疑問が出るんじゃないかな?
ビンゴワードを知らないと何回か周辺ワードでググってそれを探さないといけないから意外と難しい。
昔は頭使わなくてもマイコン雑誌の特集とかで載ってて必修みたいなものだったけどさ。
実測するためのCソースもIntelが提供してるな。 アレもわかりにくいところにあるけど
637 :
デフォルトの名無しさん :2008/06/14(土) 01:40:46
>>635 > 逆に半可通だからこそそういう疑問が出るんじゃないかな?
半可通の酋長ダんゴ先生をバカにシュルナ!!!!
知っているのならさっさと教えろやクズどもが。
俺だよ俺俺
あちこちで、教えるクンがオナニーしすぎて
>>638 みたいな機知外
が本当に増えている
>>634 それも実験して調べるのです(Z80の隠し命令かよ・・・)。
>>641 それ以上にそいつ等をスルーできないやつ等のほうが増えて内科医。
おっさんくさいスレになりました
まあアセンブラなんて今時の若い者はあまりやらんからな。
つPIC
最近の若い奴はJVMとCLRのアセンブラ(バイトコード)は結構読めるよ。
NASM のドキュメントの Appendix B って消えた? あれ便利してたんだが。
今時アセンブラの需要はあるのかねえ
コンパイラベンダにゃ必須だろう。
エンコーダとか
ベクトル化ガリガリやりたいなら必要だね
組み込みで、ブートローダー書く人とか。
高級言語で書けない命令がどれだけあると思ってるんだ?
ローテート命令。 なんでC言語にはローテート演算子が無いんだ。 何度欲しいと思ったことか…
ローテートってそんなに速くなかったような気がするよ
シフトと論理和もしくは加算で書くより速いだろJK 何でもかんでもアセンブラで書きたがるのは昔の厨二病
結果をすぐ使わないのであれば うまく並列実行されれば ローテートより速いんじゃね?
>>657 それがだな、昔シフト系の命令がクソ遅い Pentium4 とかいう CPU があってだな。
x86 の rol/ror 命令使うよりも mmx シフトと mmxor で書いたほうが速いとかいう
ふざけたこともあったのだよ。フツーの 32bit の SISD でね。
つーか、ローテート命令が遅いなんてデマを流さないでほしい。
>>660 CPU によるけど、ローテート命令が速くない環境はあるよ。
intel の 24896604_j.pdf からの引用だけど、x86 では
add : レイテンシ 0.5clk, スループット 0.5clk
shl/shr: レイテンシ 4clk, スループット 1clk
rol/ror: レイテンシ 4clk, スループット 1clk
でー mmx だと
pslld: レイテンシ 2clk, スループット 1clk
psrld: レイテンシ 2clk, スループット 1clk
por: レイテンシ 2clk, スループット 1ckl
ね。
SISD で rol/ror より速いっつーのは記憶違いで嘘だったけど。
まーこういう糞な石はメインストリームじゃなければ無視できる
のだけど、一時期多数派を占めてたりしたから無視するわけにも
いかんのよ。
そんなにCがいいならインラインアセンブラつかえよ
ローテートぐらいならgccの拡張で使えたような気がする
rol や ror はintrinsicであるんだけどrolxやrorxのようにキャリーと一緒に回すのが無いんだよね
そもそもCにはキャリーの概念すらないし。
666 :
デフォルトの名無しさん :2008/06/20(金) 09:47:19
Cのソースからアセンブラ吐いたんだけど,Cのソースではhoge(0,1)って引数で関数 呼び出してるけど、アセンブラでは movl $1, 4(%esp) movl $0, (%esp) という風に引数を逆に処理してるのは、どういう意味があるの?ご教示お願いします
667 :
デフォルトの名無しさん :2008/06/20(金) 09:54:29
>>666 悪魔乙
gas の記法だろ。アセンブラによってオペランドを書く順番が違ってくるのさ
いや,オペランドじゃなくて引数の順序だろ. C では良くあること.
>>666 ・スタックは数が減る方に向かって伸びる。
・その例でも引数1が %esp+0, 引数2が %esp+4 になってるでしょ?
・引数のポインタを取ったとき、スタック上の引数列が配列になるでしょ?
hoge(int foo, int bar) を例に取ると
int *p = &foo; によって
p[0] == foo
p[1] == bar
となる。
で、このことは、引数不定とか可変長引数を実装するときに
すごく都合がいい。スタックトップが必ず引数1になる。
K&Rの頃は引数不定がまかり通ってたし。
なお、
>>666 の例では、%esp はあらかじめ減じられていると思われるため
movl $0, (%esp)
movl $1, 4(%esp)
のように引数順に処理することもできるが、コンパイラの都合上それをやっていない。
処理系によるんじゃないか?
>>666 Cの引数の評価順は特に決められていないので、コンパイラの都合で好きな順序で処理してよいわけだが、
たまたま逆順の方がコンパイラを作りやすかったとか、特に気にしないで作ったらたまたま逆順になったとか、
そんなとこだろうと思うよ
特に意味はないかと
672 :
デフォルトの名無しさん :2008/06/20(金) 12:12:48
厳格に決まっているわけではなく、
>>669 の述べているような理由などから、私が使っている処理系では引数がたまたま
決まっているということでいいんですか?
673 :
デフォルトの名無しさん :2008/06/20(金) 12:13:51
↑訂正、 引数がたまたま逆に処理されている
>たまたま逆に いや単に右から左なだけで,逆順とか正順とか決まってないから
カウントダウン方向で繰り返し処理すれば フラグ見るだけで処理の終わりがわかる
コード生成とスタックに積む都合から言うと、スタックに先に積むほうから 評価をしたいわけだ。 それと、可変長引数のことを考えると、Cの引数は右から左の順で積んだ ほうが都合が良い、ということ。
677 :
デフォルトの名無しさん :2008/06/20(金) 18:12:47
やり方は、複数あるが後々都合が良い ってことですね。ありがとうございます。
678 :
デフォルトの名無しさん :2008/06/20(金) 18:21:36
富の目キモすぎ。バケモン。身障。DQN男。死ね 富の目キモすぎ。バケモン。身障。DQN男。死ね 富の目キモすぎ。バケモン。身障。DQN男。死ね 富の目キモすぎ。バケモン。身障。DQN男。死ね 富の目キモすぎ。バケモン。身障。DQN男。死ね 富の目キモすぎ。バケモン。身障。DQN男。死ね 富の目キモすぎ。バケモン。身障。DQN男。死ね 富の目キモすぎ。バケモン。身障。DQN男。死ね 富の目キモすぎ。バケモン。身障。DQN男。死ね 富の目キモすぎ。バケモン。身障。DQN男。死ね 富の目キモすぎ。バケモン。身障。DQN男。死ね 富の目キモすぎ。バケモン。身障。DQN男。死ね 富の目キモすぎ。バケモン。身障。DQN男。死ね 富の目キモすぎ。バケモン。身障。DQN男。死ね 富の目キモすぎ。バケモン。身障。DQN男。死ね 富の目キモすぎ。バケモン。身障。DQN男。死ね
呼出し規約とかは関係してこないの?
push/pop命令の動きはABI云々じゃなくてCPUの動作仕様だからな
VC++ に限って言うなら、 普通の関数は右から左、 普通のメンバ関数は左から右、 可変長引数を持つメンバ関数は右から左、だな。
Cっていうか、WindowsAPIの仕様に引っ張られてるんじゃね?
thisポインタ=ecxは何とかならんかったのかと思う まあ、他に無いっちゃないが
PASCALキーワード!!!
VC++のメンバはthisをecxに積んで右からスタックだったはずだが
なんか、引数をスタックに積む順序と引数の評価順序の区別が付いてない 奴がいるな。
687 :
デフォルトの名無しさん :2008/06/20(金) 22:48:48
↑どういうこと?
引数の評価順序って決まってたっけ
68000での質問です。 cmpi.w #$1234, D0 や cmpi.l #$12345678, D0 と同等な事をA0に対しても行いたく思い、 cmpaを使ってみましたが上手くいきません。 なぜでしょうか?
>>687 左から評価して、右から積んでも規約に違反はしてない。
評価した順にスタックに積んで行くほうが楽。
という「都合」が引数の評価とスタックに積む順序に影響しているってこと。
>>690 エスパーはいないぞ!
もっと詳しく書け。
>>687 スタックに積まれた引き数の配置は処理系で決まっている。
順番に詰まれるかどうかは分からない。
評価順序も決まっていない。
>>690 > 上手くいきません。
何をやって、どうなることを期待してて、どうなったかを書け。
694 :
690 :2008/06/21(土) 17:07:42
解決しました。 理由もなんとなくわかりました。 ありがとうございました。
695 :
690 :2008/06/21(土) 17:15:55
お前らの役立たずっぷりに呆れました。 もう二度と来ません。
696 :
690 :2008/06/21(土) 17:18:51
>>695 まあそれが本音ですけどね。
もはや揚げ足取りですし。
ありがとうございます。
なんかね、どこからが釣りだったのかね、もうね
698 :
690 :2008/06/21(土) 18:27:33
詰まらない偽者がスレ汚ししてすみません。
最終レスは
>>695 です。
ありがとうございました。
いいから消えろよクズ
ほっとけ 構うな
701 :
690 :2008/06/21(土) 19:16:46
702 :
690 :2008/06/21(土) 20:47:38
誰だお前
もう誰が誰だかわやくちゃなんだけど、休日にわざわざこんなスレにまできて... なんかかわいそうだな。
Re:> お前はなにを言っているのか
king、コテ付け忘れてるぞ
Reply:
>>705 お前に何がわかるというのか。
キングさんって、スクリプトですか。??
ん 数学板のking?
いきなりkingネタかよ 数学板以外にもたまーに顔出してるよ、奴は
710 :
デフォルトの名無しさん :2008/06/30(月) 16:29:09
MASM MSからダウンロードしたけど、VC++ Express 2005が必要だと・・・ VC++ Express 2008じゃだめ?なの?
>>710 強制解凍してけば長いファイル名のが出てくるからそれを拡張子exeにリネーム
もうNASMでえーやん
713 :
デフォルトの名無しさん :2008/06/30(月) 17:32:54
>>711 thnx・・・thnx......
冷静に考えて
そうだ、ここは俊足なレスポンスを期待しちゃいけない、
と思い、
無い頭で考えて、
オーソドックスにプロンプトの指示に従い、
アンインストールをしたところで、
>>711 発見 orz
あうぅぅぅ
JWasmってどうなんだろ?
ちょっと使ってみた個人的な感想など:
Jwasm: コマンドラインの引数など使い勝手がいいとは言い難い。
特にリンカは最悪で、設定ファイルが必要だとか訳が判らん。
結局、リンカだけ alink
http://alink.sf.net/download.html と
そこにある win32.lib を使うことでバイナリ作成した。
その後に使った fasm
http://flatassembler.net/ なら、
単体で実行バイナリまで生成することが判った。
記法も独特ではあるけども、ヘルパのインクルードが充実していて
あるAPIの挙動を確かめるようなテスト・ルーチンなんかをスクラッチするには
いい感じだと思った。
いや、互換物はオリジナルと比較しないと意味ないでしょ。 あと、wlinkはなんでもできる強力なリンカだよ。libだけ用意すれば(.aでも.libでも食べてくれる) jwasm .\samples\windows1 wlink FORM Windows NT runtime CON F windows1 L kernel32.lib みたいな感じでいける筈。 たしかwatcom本体の方にMSのlink互換の奴(ラッパー?)が入ってる筈だから それの差し替え用なのかもね?
masm32のinc参照してるやつも導入pathを調整すれば同様に jwasm .\samples\windows3 wlink FORM Windows NT F windows3 L kernel32.lib,user32.lib でバイナリは出来るんだけと、これって豆腐窓が出れば成功なのかな? 窓プログラムはソース見てもいまいちわからないorz
lzasmってTASMのideal文法サポートだけで、MASM互換部分はごっそり抜けてるのかな? それとも元々こんなもんなの? 共通ソースってどうやったら書けるんだろうこれ?
masm support なんて書いてないけど
っていうかTASMとMASMの共通ソースってことね。 ローカルラベルとか使わなきゃ出来るんだと思ってた。
TASM,MASM両用にしたい場合 TASMのMASM5.1互換モードだかなんだかを使っていた記憶がある
724 :
デフォルトの名無しさん :2008/07/05(土) 04:50:49
ゲームの解析をしているのですが MOV EDX,exe.00666666 00666666 は XOR AL,31 となっています 近くに1〜31範囲外の定数ビットシフトというコメントが多く使われているのですが どのような処理をしているのかわかりますでしょうか?
単なるデータじゃないってなんでわかったの?
つかDSに命令書くとDEPに殺されるだろJK萌え〜 その命令らしきものの後にretなりjmpがある?
727 :
724 :2008/07/06(日) 02:01:18
>>725 00666666 はrdataセクションでしたorz
MOV EDX,exe.00666666のASCII"41C6tvejeNiWj・・・・"の中身が格納されてるだけでした
>>726 MOV EDX,exe.00666666
SUB EDX,EAX
CMP EDX,ESI
JNB SHORT exe.0050175C
0050175C TEST EDI,EDI
0050175E JNZ SHORT exe.00501764
00501769 MOV EAX,66666667
0050176E IMUL EDX
この↓にもジャンプ命令がたくさんあります。リターンはずっと後にでてきます。
うんこい質問で申し訳ないですが、 00401239 |. B9 64000000 MOV ECX,64 0040123E |. F7E1 MUL ECX 00401240 |. 83F8 00 CMP EAX,0 00401243 |. 75 06 JNZ SHORT xxx.0040124B 00401245 |. B8 01000000 MOV EAX,1 0040124A |. C3 RETN 0040124B |> 33C0 XOR EAX,EAX 0040124D \. C3 RETN 関数の末尾のコピペなんですが、 アドレス0x00401239時点でのEAXが0以外で、この関数が1を返す事はあり得ますか? ECX(=0x64)を掛けている理由がよく分からないので、そういう可能性があるのかと思いまして。
eaxの値が0x04000000〜0xf4000000の範囲なら1
初歩的な質問ですが教えてください MOV DWORD PTR DS:[ESI],00400000 例えば、00400000にはアドレスが入っています。この場合、00400000を移動するのか 格納されているアドレスを移動するのか、どちらでしょうか?
// ESIはポインタ *ESI = 400000;
それだと誤解を招きそうなので // ESIはポインタ TYPE_T *ESI; ESI = 0x400000; って書いた方が
ポインタじゃなくて、ただのレジスタとメモリ領域。 ポインタって言ってると、わかり辛い。
>>731 セグメントアドレスがDSの値でオフセットアドレスがESIの値なメモリ領域に十進数の400000を入れているように見える
// DSの説明ははしょるけど DWORD PTRなんだから DWORD* ESI; *ESI = 0x400000; // でええんでないか?
皆さんありがとうです ESIにデータセグメントのアドレス00400000を示しているということですね ではそのままなら[ESI+8]は00400008でよいのですか?
ddebでも落として飽きるまで実験しろ
740 :
デフォルトの名無しさん :2008/07/13(日) 07:45:00
だめだこりゃ
キャリーフラグの反転ができる CPU では、 コイツも使ってやってね(Z80 表記)。 CP 0AH CCF ADC 30H DAA
743 :
デフォルトの名無しさん :2008/07/18(金) 00:00:59
質問:アセンブラの除算 質問です。アセンブラの除算は、具体的に どのような処理をしているのでしょうか。 「ビット レベルの計算」のイメージができません。 また、除算は ほかの計算と比較して、クロック数を消費するとインターネットに書いてありました。 それが なぜなのか、理解できていません。 おそらく、どのような計算をしているかを把握できれば、理解できるとおもうのですが。 インターネットで「除算 アセンブラ div 」などで検索しましたが、求めている情報が入手できませんでした。 そのため、質問させていただきます。 また、読むべきサイト、書籍などがあれば、教えていただければ幸いです。 よろしく お願い致します。
除算器で検索
746 :
デフォルトの名無しさん :2008/07/18(金) 00:40:01
ありがとうございます。よんで勉強します。 論理回路の基礎は知っているので、何とか理解できそうです。
ビットレベルの計算って、要するに2進数で筆算してるだけの話じゃないか?
それ前にアセンブラの除算もCの除算もみな一緒だと思うが
>>749 マジなんか面白く上げ足とっただけか知らんが、イメージは筆算だ。
掛け算も同じ。
その人がどういうモデルで筆算というものを把握してるかに依るだろJK
>>745 の84回で、モロに筆算の図が載っているわけだが
夕食ってどうやって作るんですか->一例を回答->それは調理だな
CASLの問題のこと聞いてもおk?
レスがどんなアセンブラでも構わないならいいんじゃね? っていうか専門スレないの?
情報処理試験のあれか、1バイトが16ビットだっけか。
758 :
デフォルトの名無しさん :2008/07/18(金) 19:26:11
おいおい 1バイトは8ビットだろ・・・。
情報処理技術者試験出題範囲を見る限りでは、1語16ビットとは書いてあるが「バイト」という単語は出てこないっぽい。
>>760 このスレの住人ならそんなこと百も承知だろう
ワードアドレッシングマシンなんだよな確か
CASL でシフトによる割り算がまったく思いつきません。どなたかお手本をみせていただけませんか?
>>763 とりあえず1ビット右シフトを考えてみて。
昔々あるところに、1byteが6bitや9bitのコンピュータがあってだな…
基本的に1byteは8bitだけど8bitじゃない場合もあるんだっけ? マスタリングTCP/IPでは明確にするためにoctetを使う、みたいなのが書いてあった ちなみに1hydeは156cmで固定 学生の知識だから合ってるか分かんないけど
PDP-10とかだな
> 学生の知識だから合ってるか分かんないけど 156cmをどこで習うんだよ!
>>763 34÷10
=0x22/0x0a
=100010b/1010b
011
────
1010)100010
1010
───
01110
1010
──
0100
=11bあまり100b
=3あまり4
ここは宿題スレじゃありません。
ww
CASLはほとんど忘れてるよ。 算術系の命令がなくてアドレスの計算命令で代用するのが ポイントだったのがよみがえった。
なんすかその8086のLEAみたいな小技は
内部レジスタをけちってるんですよ。たしかCOMETを後付けで内部解説する教科書があったような気が。
>>774 即値の加減算命令がないからLEAでなんとかすれ。
という話ですか。
つうか即値扱えるのってLEAだけしかないんだっけ?
>>776 内部レジスタつうか命令デコーダがものすげーシンプルになる命令セット。
だった気がする。
その割にGRが5個とか半端なのがよくわからん。
CASL命令の基本がレジスタとメモリ間の演算で、加算減算もレジスタとメモリ。 そなものでレジスタ間の演算がわりとめんどい。 LAD GR1,0,GR0 // MOV R1, R0 LAD GR0,1,GR0 // ADD R0, 1 LD GR1,0,GR0 // MOV R1, [R0] 比較演算は代替手段がないので片方を必ずメモリに落とす必要がある。
6809を考えれば‥‥。
09は掛け算が意外にもレジスタ間なんだよな。
どこが意外なんだか。
あのニーモックの中では特異に思えたんだけど、他のCPUじゃ当たり前かな?
Addressを取れるOP codeが余ってなかったから必然 しかし遡るなら6809なんて中途半端なんじゃなくて PDP-8とかHITAC-10とかもっと昔の制御用コンピュータだろ
63C09は・・・忘れた(w
785 :
デフォルトの名無しさん :2008/07/22(火) 01:06:43
ジャンプ命令について質問です。 いま、以下のような命令があるとします。 BRA _main この命令ではmainの前に_(アンダーバー)が付いています。 この命令と、次の命令 BRA main では、どのような違いがあるのでしょうか?
ラベルが違う。
もしC言語のソースをコンパイルした結果を見ての質問ならこう。 「キミの使っているCコンパイラが扱うオブジェクトフォーマットの仕様は 関数名の前にアンダースコア(_)を付ける仕様だった。」 C言語なら必ず付くわけでもなく、アセンブリ言語だから必ず_から始まらなければ ならないわけでもなく、何か特殊な効果を狙って_を付けた表記にしているわけでも ない。
ついでに言うと、C言語のソースで A という名前の関数を作ったとして BRA A ってコードを吐くと、BRA命令のオペランドにAレジスタは指定出来ないとか、ラベルAは不正な名前、とかのエラーになるかもしれん。 なので、なにかしら法則を決めてアセンブラの予約語とぶつからないようにしてあげる必要が有る。 ということで _ をつける規則を採用したコンパイラがそこにある、ってわけだ。
ホスト(z/OS)下でアセンブラを触ることになりました。 が、ソースを見てもさっぱりです。 命令とかを解説しているサイトや参考書ってありません?
>>789 z/OSだったらIBMに聞けよ :-)
いったいどこをいじるんだろう・・・
JWasm、バージョン上がってたんで何か少し本格的なものをアセンブルしたくなって CDSD-STDで試してみたんだけど、妙なところでエラーが出た。 これなんでだか誰かわかります? 他にMWSAでも試そうかと思ったけど、あれコマンドラインじゃシンボル使えなかったんだな。
BYTE PTR DS:[EAX+8]の意味を教えていただけませんでしょうか? BYTE PTR [EAX+8]なら分かるのですが。 何故セグメントレジスタが出てくるのか分かりません。 また、MASMの良書も教えていただければ幸いです。 よろしくお願いいたします。
結果を比較してみればいいのに
>BYTE PTR [EAX+8] これを本当に理解していれば、DS:も理解出来るはず。
>>793 リニアアドレスを算出するには
セグメント + オフセット
だけど、どの『セグメント』を使うのかはCPUが暗黙の内に決めてる。
例えば、マシン語命令はCSで示すセグメントからフェッチしてくる・・とか。
でも
>>793 の上の命令のように、『セグメント:オフセット』と明示的に
セグメントを指定すると、暗黙のセグメント指定をそのセグメントで『上書き』出来る。
「セグメント オーバライド」辺りでググれ。
まずCPUの名前を書かなきゃわからんだろう。 86とレジスタ名前が似ているだけかもしれんぞ。
個人的には動作モードのほうが気になる
ありがとうございました。 なんとなく分かった気がします。 根本的なことが分かっていない気がするのではじめからきちんと勉強したいのですが なにか良いサイト、書籍などありませんでしょうか?
>>799 Intel限定で良いなら「はじめて読む486」はどうよ?
>>800 いや、これはプロテクトモード入門でしょうね。リアルモードでの経験+Cの経験があればOKですが。
>>800 図解コンピュータシリーズの「図解 32ビットマイクロコンピュータ80386の使い方」とかも良いね。
教えられた書籍を買ってみます。 皆さんどうもありがとうございました。
便乗質問ですがx86_64用で上記みたいな感じの書籍はありますか? 最悪英語でもいいです。
86系だったら特権モードのことをがっちりやりたいか、 ユーザーモードだけでいいかでアプローチは変わってくる。 ユーザーモードだけなら、cl /FA でコンパイルして、 そのソースを読んだり変更してアセンブルするといいかも。 生っぽい機械語がいいならリアルモードがわかりやすいが今更DOSもないよな。
アセンブリの学習をしたいと考えていますが、以下の条件でお勧めの アセンブラ(GAS/NASM/MASMなど)をご教授いただければ幸いです。 ・開発も実行もx86環境。 ・WindowsとLinux環境、両方を利用しており、WindowsにはCygwinが導入されている。 ・出来るだけ両方の環境で学習したく、特定環境に依存するアセンブラ本体・文法は避けたい。 早い話、「これから始めれば無難」というものをお願いします。 ちなみに、手元にはMASMベースで解説してある以下の書籍があります。 『高級言語プログラマのためのアセンブラ入門 林晴比古著 ソフトバンククリエイティブ刊』
そういえばJWasmにlinux向けのサンプルが増えてたけど、 MASM互換のアセンブラで一体なにするつもりなんだろう?
>>807 アセンブラってのはどうせバイナリと紙一重なんだから
あまり特定の処理系に依存してどうこう、というのは少ない。
(まぁ技巧的なマクロはそれなりに違うけどね)
むしろ、Linux ならシステムコールとか、gccの関数インタフェースとか
そこらへんがわかる資料をネットで見つけることが大事じゃないかと思う。
Cygwinでいい本は知らない。
GAS は gcc に -S オプションを付けて出力させたものが参考になる。
NASM は付属のドキュメントを読んで参考にできるのなら使える。
細かい記法がわからない時は、逆汗使ってみた事があったな。
Windowsメインならmasmかnasm、Linux or GCCメインならgas。 別にどっちでもいいが、たまにコンパイラの出力読むときによく使うコンパイラが吐くアセンブリソース読めたほうがいい程度の話で。
>>812 なるほど、専らgcc環境なのでgasを使ってみようと思います。
的確なご指摘、ありがとうございました。
そういえばYASMってgasの代替にはなるの? それとも只似た記法が使えるだけ?
nasmと比べた事はあるんだけと、org周りのよくわからない挙動がなんかすっきりしてたのは覚えてるんだよな。
masmとnasmってどう違うのですか?
見た目からして違うんじゃないか?
あっそ
さすがにmasm/nasm共通ソースなんてのは観たことないぞ。 プリプロセッサ駆使すれば出来るんだろうか?
そんなんマクロ定義でどうにでもなるべ。 実際にやろうとは思わんが。
逆汗の作成に挑戦してるんだけど、 jmp命令とか出てきたらその都度、jmp先アドレスに飛びながらバイナリ読んでいかなきゃだめ? 試しに某exeを頭から順番に読み込んでみたら、jmp先アドレスが命令の先頭じゃなくて途中をさしちゃってるんだけども・・ 別の逆汗でも同じ結果になるんだけど、難読化かなにか?
>>821 命令の途中にデータ埋め込んでるだけだろ。
jmp main
msg db 'hello world', 0dh, 0ah, '$'
main:
mov dx, offset msg
>>821 やってみておかしかったら、JMP 先の整合を付けてみる、でよい。たいていは
その方向でとりあえずやってみる。ありがとう
NASMの構造体がうまく使えません、教えてください! WIN32N.INCを使ってAPIの時間を取得しようとして section .text global start start: move eax,my_time push eax call GetLocalTimeA section .data my_time: ISTRUC SYSTEMTIME at SYSTEMTIME.wYear,dw 0 at SYSTEMTIME.wMonth,dw 0 at SYSTEMTIME.wDayOfWeek,dw 0 at SYSTEMTIME.wDay,dw 0 at SYSTEMTIME.wHour,dw 0 at SYSTEMTIME.wMinute,dw 0 at SYSTEMTIME.wSecond,dw 0 at SYSTEMTIME.wMilliseconds,dw 0 IEND みたいな感じで書いたのですが、 mov eax,my_time のところが error: parser: instruction expected となってしまいました。 何が問題で、どうすれば解決できるのでしょうか?
moveってなってない?
>>826 ありがとうございます
私って馬鹿ですね
アセンブラの勉強するのならやはり、はじめて読む8086を買って勉強するのがベストなんでしょうか?
それとも、独習アセンブラや
>>68 の本のほうが良いのでしょうか?
8086の勉強をするなら、俺ならはじめて読む8086を勧めるけど。
831 :
829 :2008/09/09(火) 12:33:16
8086にも興味はありますが、アセンブラの文法について学びたいと思ってます。
マクロとか型とかはアセンブラ毎に違うので、一般的に学ぶ方法はない。 いい教科書も無いと思う。
文法はアセンブラによって異なる C言語のような決まりがあるわけではない MASM/NASM/TASM/GASなど色々あるからそれに合う本を探せ
834 :
829 :2008/09/09(火) 13:19:39
>>832-833 有難うございます。実際に見て理解しやすそうな本を購入することにします。
アセンブラで実際組むわけじゃなくどんな動作してるのか 見たいって程度ならCASLで十分じゃないか? 資料も豊富だし
いまどきワードアドレッシングなアーキテクチャはおすすめしがたい
なんで?
>>831 文法って、
> 命令 レジスタ,メモリ;
ぐらいじゃない?
命令のこと?
>>838 正直セグメント絡みの方言が色々あってわけわからなくね?
疑似命令のバリエーションとか、 即値やレジスタ名の記法とか、 いろいろ違うけど? ソースとデスティネーションの順序が違うというのもあるか。
キャッシュとか絡んでくると・・・
アキュムレータ丸出し、暗黙のレジスタ参照、直交性の無いアドレッシングですね、wkrms
>>839 セグメントなんてもう10年近く意識したことないが。
もうDOSの.EXEなんて作れねえな。
>>840 違うCPUだと思えば別に問題ない。
ASSUMEの具体的な効果とかもう覚えてない
USINGは覚えてる?
848 :
デフォルトの名無しさん :2008/09/17(水) 02:06:26
バイトでアセンブラやるんだけど アセンブラて何
馬鹿たれ、たとえバイトでもそんな質問がでてくるようなレベルの人間雇ったりしねえよ。
工場のラインに並んで部品を組み立てる仕事じゃない?
なるほど確かにアセンブルする人だな。
そっちの分野ではアッセンブルって言うけど、ここは黙っておこう。
斡旋ぶるぶる?
汗バイブ
未経験者でも大丈夫! やる気だけでOK! 仕事内容: アセンブラ プログラミング ※コンピュータの命令を並べていくだけの単純なお仕事です。 応募資格: ・経験不問 ・学歴不問 ・未経験者歓迎 ・髪型自由 ・フリーター歓迎 みたいな? でもこれだけ見ると単純にネタ扱いできない現実味がw
>>855 海外アウトソーシングとか実はそんなもんだったりしないよね?
アセンブラの仕事をバイトでできるなんてすごいよね。 C言語とかをさらに訳の分からん言葉に翻訳する仕事なんでしょ?
ある意味Cよりシンプルともいえる
フラグを覚えりゃ後はバッチファイルレベルだしな。
アセンブラって最適化できるのかな?
>>860 Cコンパイラのようにはアセンブラが最適化することは通常無い。
但し、実際には使えないインストラクションを他のインストラクションに置き換えたり
相当するより速いインストラクションに置き換えたりするケースはある。
勿論、プログラマが自身で最適化する余地はいくらでもある。
ブランチ命令のオフセットは最適化されるな。
おれ団子だけどRIP相対アドレッシングのうまい使い道教えれ
今まで通り使えばいいのでは。 命令の近くにデータを置くとか switchので等間隔に処理を並べて分岐とか今までのCPUだって出来るわけで ただの命令長削減以外の何物でもないと思う。
アブラカタブラアセンブラ
やった j規制かいじょされてるよー
>>863 DLL再配置の手間が省けるってことはないの?
いやさ、Xbyakに追加してやったんはいいんだけど あれってもともと動的生成じゃん
なんか該当するスレが見つからないのでここで質問させていただきます 単純に与えられた回数分インクリメントして総和を求めるプログラムで時間をみつもろうとしました カウンタのインクリメント分と結果となる値のインクリメント分でADDが2回、ジャンプが1回 どれも最小の1クロックで処理できるとすると1ループで4クロック でこれをathlon64 3000+(2G)のCPUで10^9回まわすとすると 4*10^9 / 2.0*1024^3 = 1.862645149230957と概算を行いました しかし実際にtimeを使って10^9, 10*10^9の場合を計った結果は1.00と1.42 そこから求めるとかかった時間は0.42/9=0.046.. ディスアセンブルしてもADD*2,CMP,JNEの繰り返しになってました どう考えても1クロックの間に1以上の命令が実行されてるわけなんですが こういう動作が前提だとするとどうやって実行時間を見積もればいいんでしょうか?
IPCも知らんのか
Intelの資料によれば(AMDじゃなくてすまそ)、 ADD命令は0.5クロックで、ALUは2器載ってるらしいから、 1クロックでADDを4つ実行できることになるな
後は任せた
まあ、そもそも命令数とクロックから実行時間を見積もろうとするが大馬鹿なんだが。
っていうかさ、Pentium 4はパイプラインが3 issueなのに、4つ実行なんてどうやるんだよ。 日本語資料じたいが相当旧いし
確かに日本語版のIA-32 インテル アーキテクチャ・ソフトウェア・デベロッパーズ・マニュアルの 本書の対象となるIA-32プロセッサの中にcore2duoとかの文字が無い。 やっぱ最新版は英語じゃないとだめなのか。
>>874 いやあでも、こうやって一つ賢くなれるんだからいいんじゃねーの?
それより見積もりも出来ないで、処理がハードウェアの能力と釣り合っているかを考えない方が大馬鹿者。
現代のCPUで処理に必要なクロック数を机上で計算するのが難しいとしても
プロファイル取ってIPCを見たりはするし、それによって局所的にどの命令が
ボトルネックかを考える事もある。
机上という静的な方から攻めるか、プロファイルという動的な方から攻めるかの違いで、たどり着くところは一緒。
Agner.orgを参考にしたらいいと思う
VC++でint cx; と変数を宣言して、 インラインアセンブラでcmp eax,cx と書いてエラーになったから助かった。 imul ebx,cx はimul ebx,ecx にコンパイルされてエラーになっておらず、 危うくハマるところだった。
「goto」というシンボルすら作らせないJavaは徹底してる。
881 :
デフォルトの名無しさん :2008/10/22(水) 14:04:06
オペランドの前に=が付くとどういう意味があるんですか。 教えてください。
どの石のなんてアセンブラかわからないと答えようがない
gcc asm の制約のことだったりして。
たぶん、リテラルのことでしょう。名無しの定数が作られる。昔のメインフレームのASMなんかで LD R0,=F'00F0' とか書くと、フルワードの 000000F0h という定数がどこかに作られて それをアクセスするアドレッシングが命令に組み込まれる。
CPU:Intel 8085 (1) [80A1h] ← (B+C)*2-[80A0h]*3 オーバーフローは考慮不要 (2) [80B3h] [80B2h] ←[80B0h] +[80B1h] *2 和を16ビットで求める(分岐命令を使用してもよい) (3) A ← B ・C + H ・L (論理演算) これらを実行するプログラムを教えてください。 よろしくお願いします
>>885 (3)
170o
241o
107o
174o
245o
260o
>>885 (1)
041o 0a0h 80h
170o
201o
207o
226o
226o
226o
043o
167o
>>885 (2)
052o 0b0h 80h
051o
042o 0b2h 80h
>>886-888 ありがとうございます。
すごくありがたいのですが、私の知識不足のせいで思っていた結果ではありませんでした。
.8085
ASEG
ORG 8000h
LDA D1
LXI H,D2
のような形で、もう一度教えてもらえませんか?
頼ってばかりで申し訳ないのですが、よろしくお願いします
なんという攻防戦
>>889 ほれ。アセンブルリスト。エラーも取れてる
CSEG
;(1) [80A1h] ← (B+C)*2-[80A0h]*3 オーバーフローは考慮不要
0000 78 MOV A,B
0001 81 ADD C ; (B+C)
0002 87 ADD A ; *2
0003 F5 PUSH PSW ; を退避
0004 21A080 LXI H,80A0h
0007 7E MOV A,M
0008 86 ADD M
0009 86 ADD M ; *3
000A 6F MOV L,A ; をLに
000B F1 POP PSW ; (B+C)*2を復元
000C 95 SUB L ; 引き算
000D 32A180 STA 80A1h ; 結果をストア
;(2) [80B3h] [80B2h] ←[80B0h] +[80B1h] *2 和を16ビットで求める(分岐命令を使用してもよい) 0010 3AB180 LDA 80B1h 0013 6F MOV L,A 0014 2600 MVI H,0 0016 29 DAD H ; [80B1h] *2 0017 11B080 LXI D,80B0h 001A 1A LDAX D 001B 4F MOV C,A 001C 0600 MVI B,0 ; [80B0h]の内容を16bitに 001E 09 DAD B ; HLに16bitで加算 001F 22B280 SHLD 80B2h ; 結果をストア
;(3) A ← B ・C + H ・L (論理演算) 0022 78 MOV A,B 0023 A1 ANA C 0024 5F MOV E,A ; B・Cを退避 0025 7C MOV A,H 0026 A5 ANA L ; H・L 0027 B3 ORA E ; H・L+B・C 0028 END 最後の行は ADD E かもしらん。論理演算とのことでORAにしといた。
なんという親切回答
ありがとうございます。 助かりました
どういたしまして。実際には、(1)の問題も、8bit加算→9bit、8bit*3→10bitになるので、 (2)のようにHLに結果を保持する手法のほうが一般的です。 最終結果が8bitでいいなら、Lレジスタのほうだけを使えばいいので。
>>885 KITの学生のお前にひとつ忠告しておくが、
過去ログくらい見ろwwwwwwwww
特に↓
>>137-167 今更忠告してももう遅いかもしれねぇけどな。レポートの提出は明日だっけ?笑
うぁはは、丁度1年なのねw
うひょーーーーー いまからレポートやろうと思ったらちょうど良いものみつけたーーーーーーー さんきゅーーーーーーーー
KITは8085なのか
KITはレベルが低いな さすがFランク
ナイトライダーかと思ったらスパルタFランクか
おまいら レポート提出はできたのか? 落第しないよう頑張れよwwwwwwwwwwwwwwwww
東洋経済の本当に強い大学ランキング19位。 ( ゚,_J゚)
機械語教育が8085だからってレベル低いとは思えんが お約束のようにこのスレに質問があるのはどうかと思うが
906 :
896 :2008/10/30(木) 13:29:33
とほほ 165-166のレスしたのは俺だったよ。1年前のコードのほうが896の示唆守ってるし・・・
Wikipedia「アルベルト・アインシュタイン」より >>簡単な数字や記号を記憶することが苦手だったとされる。ある新聞社のインタビューの中で、光速度の数値を答えられず、記者から揶揄されると「本やノートに書いてあることをどうして憶えておかなければならないのかね?」とやりかえしたという。 KITの学生曰く「ネットで簡単に教えてもらえることをどうして自分で考えなければならないのかね?」ってとこだな。 KITの学生はアインシュタインより進んでるってことだ、多分。
手元にある本やノートはページを開けば数秒〜十数秒ほどで情報を得られるが、 ネットで教えてもらうには数分〜数日かかるわけで、 そのタイムロスが許容範囲かどうかってことだ、多分。
手元にある本やノートに書いてある情報からでは解答を導き出せない、 自力で解こうにも数分〜数日かけても解答を導き出せない、 となるともう誰かに教えを乞うか潔く落第するしかないもんな。
そんなやつはぜひ落第してくれ
911 :
881 :2008/10/30(木) 18:07:46
884さんありがとう。そのとおりです。 そのまま定数を書けばいいのに=をつける理由が分かりませんでした。
912 :
881 :2008/10/30(木) 18:10:41
だから最初にCASLならCASLと書きなさいとゆーとるにわかってないねこの子は。 CASLの場合、オペランドに整数を書くとそれはアドレスを指示したことになる。 =は即値の印。
914 :
881 :2008/10/30(木) 18:33:43
そうなんですか。ありがとうございました。
915 :
_ :2008/11/02(日) 22:27:39
質問なんですが・・・。 ;--------------------- DATA SEGMENT MYDT1 DB 0 MYDT2 DW 0 MYDT3 DD 0 MYADRS DD MYDT3 DATA ENDS ;--------------------- ; 環境は、8086 + MASMです。 上記の場合、MYADRSの値として、 0x00000000 が設定されているのでしょうか? それともMYDT3のアドレス値が 設定されているのでしょうか? 私は0x00000000だと思っていたのですが、 どうもアドレス値が設定されているようです。 上記の場合に、LDS命令(LDS AX, MYADRS)を実行したところ、 AXには、MYDTのオフセットらしき値(0x0003)が設定されていました。 ご教示の程、宜しくお願いします。
アドレスだよ。 むしろなんで0x00000000だと思ったのかが疑問。 多分ラベルの理解が間違ってる。
MYADRSが0になるのは MYDT3 EQU 0 の場合だな。
918 :
デフォルトの名無しさん :2008/11/03(月) 19:35:05
スイッチデータが01HとなったときLEDのビット0が点滅し、 スイッチデータが80HとなったときLEDのビットが7点滅する プログラムを作る場合は、どうしたら良いか教えて下さい!
コピペ君って馬鹿だな、まで読んだ。
>>918 IOの問題のポートからデータ(8ビットですか)をよみこみ、そのまま別の問題のポートに書き込む、って感じかな?
それともメモリマップドかな?ハーバードアーキかな?
ハードの仕様をどこぞにアップしてもらえれば、回答がある、かもしれません。
921 :
デフォルトの名無しさん :2008/11/03(月) 22:16:50
ハーバードアーキテクチャとか関係ないだろ そのレベルのアーキテクチャが直接書くコードに影響与えられたらたまらん
920じゃないけど、関係あるでしょ。
というより、そういうハードにベッタリ依存するようなコピペ馬鹿の
>>918 の質問が不適切
どーせ8085辺りで学校の課題か何かだろ 質問の仕方からすると本人もまったく理解してないようだけど
>>924 え?z80 じゃないのですか? 8085 って学習用として定番なんでしょうか?
とりあえず問題の意味くらい分かってから質問しよう 分からないならその前段階を質問しよう 理解してない人が下手に端折ると重要な情報が抜けるから勘でしか答えられん よほど切羽詰ってるならプリントに書いてあること丸上げしてくれたら課題解いてあげられるかもしれんが
>>925 いや、単に最近8085の宿題教えて君が発生していたからだと思う。
んー、マシン語を授業で、ですか? そういうのが好きな人なら10歳くらいでも価値があるお題だと思いますが、とてもみんなにすすめられるものではない、というきが。
>>925 一般的に定番とは言い難いが、どこぞで課題機材に使ってるせいか
定期的に
>>885 みたいなのが湧くだけ
しかし、いまだに8085使ってる客がアキバで買い集めてるというのに、教材で使うなんて、 間違って買いすぎたりしたのかな?
PLDならともかくCPUは使い捨てたりはしないから 代々使い回してるんでは
きっと未だにTK-85でも使っているんじゃね?
教材として8085は定番じゃないか? 昔、初歩のラジオでやってた(すでに386がこの世にある時代に)マイコン講座の 連載でも確か8085だった気がする。
8080とか8086しか知らねえなぁ
935 :
デフォルトの名無しさん :2008/11/04(火) 11:34:36
MIPS涙目
自分で回路組まないなら、8080と8085の違いを意識する場面って少ないだろうな。
割り込み回りまで書くと違うけどね。それと、クロック依存プログラミングしている場合は命令処理クロック数の違いとか。
>>933 初歩のラジオで、8085 の記事はありましたっけ。
私は 1979/4 から購読していましたが、8080 か z80 しか記憶にありません。
939 :
_ :2008/11/05(水) 00:26:20
>>916 おっしゃるとおりです。
「Cユーザのための実践アセンブラ」という本や、
「x86アセンブラ入門」といった本に、
その辺の説明がありました。
(それまで読んでいた「高級言語プログラマのためのアセンブラ入門」
という本には説明がありませんでした。)
>>917 ありがとうございます。
ちなみに「はじめて読むMASM」という本だと、
MYDT1 DW 1234H
MYDT2 DW OFFSET MYDT1 ; OFFSETをつける。
また、「Cユーザのための実践アセンブラ」
という本に以下の説明がありました。
DWの右側にラベルを指定すると、ラベルのオフセット値(2バイト)が設定される。
DDの右側にラベルを指定すると、ラベルのセグメント値+オフセット値(計4バイト)が設定される。
目からウロコでした。
http://xy.yu.to/ 始終荒れまくりの海外サーバ絵チャだ
一人の神プログラマーが強すぎてマクロ荒しが全く太刀打ちできてない。
荒しプログラマーは全員退散!!
誰か倒してくれwwwwww
941 :
デフォルトの名無しさん :2008/11/05(水) 16:02:10
アセンブラでたらい回し関数を作りたいんですが、だれか教えてくださる方いませんかね?
943 :
デフォルトの名無しさん :2008/11/05(水) 17:54:42
失礼しました X86です
スタックをきちんと使って再帰可能なコードが書ければわけないと思うのだが。 GCCな環境ならとりあえず gcc -S してみてはどうか?
945 :
デフォルトの名無しさん :2008/11/05(水) 18:21:38
恥ずかしい話ですがプログラム言語自体初心者でして…C言語の基礎知識とアセンブラの授業を数回やったのみで 本やネットでいろいろ調べたのですがイマイチ理解しきれません。 ソースなどあれば参考にさせていただきたいのですが
mov eax,[x] cmp [y],[z] cmovl eax,[z] cmp [x],[y] cmpvl eax,[y] ret
947 :
デフォルトの名無しさん :2008/11/05(水) 18:29:32
ありがとうございます、参考にさせていただきます
おいおい。 というか、どういう考えで、アセンブラでたらいを書けば理解できそうだと思えたんだか 激しく疑問なのだが。
情報弱者だなぁ こんだけインタネッツが発達してんだから、ググレよカス
C言語でいう「数字を割った余りの求め」って どうやるんですか? C言語だとこうですが 100%10=0 12%10=2
x86ならdiv命令一発で商も余りも求まるYO
>>950 おまいのCコンパイラには-Sオプションはないのか?
ないのかもしれんが...
8085やZ80ならシフトと減算の組み合わせのループが要るな。
>>950 とりあえず、8085のc用libの除算ルーチンを貼っておくね。tabが詰まると思うけど。
00A9 DIVIHD ; HL商,DE余り <--- HL/DE:符号付き除算
00A9 7C mov a,h
00AA B7 ora a
00AB F5 push psw ; HLの符号判定をpush
00AC AA xra d
00AD F5 push psw ; HL/DEの符号判定をpush
00AE CDC400 call 00C4 ABSHL ; DEを符号無しに
00B1 EB xchg
00B2 CDC400 call 00C4 ABSHL ; HLを符号無しに
00B5 EB xchg
00B6 CDCF00 call 00CF DIVNHD ; 符号無し除算を実行
00B9 F1 pop psw
00BA FCC700 cm 00C7 NEGHL ; HL/DEが負なら商を負にする
00BD F1 pop psw
00BE EB xchg
00BF FCC700 cm 00C7 NEGHL ; HLが負なら余りを負にする
00C2 EB xchg ; HL=商、DE=余り
00C3 C9 ret
00C4 ABSHL: 00C4 7C mov a,h 00C5 B7 ora a 00C6 F0 rp 00C7 NEGHL: 00C7 2B dcx h 00C8 7D mov a,l 00C9 2F cma 00CA 6F mov l,a 00CB 7C mov a,h 00CC 2F cma 00CD 67 mov h,a 00CE C9 ret
00CF DIVNHD ; HL商,DE余り <--- HL/DE:符号無し除算 00CF 42 mov b,d 00D0 4B mov c,e ; BC <--- 除数 00D1 EB xchg ; DE <--- 被除数 00D2 210000 lxi h,0000 ; 商 <--- 0 00D5 3E10 mvi a,10h ; for(a=16;(a);a--) { 00D7 F5 push psw ; save ACC 00D8 29 dad h ; 商 <<=1; 00D9 AF xra a ; A,CY = 0; 00DA EB xchg 00DB 29 dad h ; 被除数<<=1; 00DC EB xchg 00DD 8D adc l 00DE 91 sub c 00DF 6F mov l,a 00E0 7C mov a,h 00E1 98 sbb b 00E2 67 mov h,a ; ここまでHLとBC比較 00E3 1C inr e 00E4 D2E900 jnc 00E9 00E7 09 dad b ; キャリーが出たら繰り下がり 00E8 1D dcr e 00E9 F1 pop psw 00EA 3D dcr a 00EB C2D700 jnz 00D7 ; }endfor; 00EE EB xchg 00EF C9 ret コメントは俺が適当に考えて振ったんで、間違えてるかもしらん
C言語を扱っていて、この度インラインアセンブリを学ぼうと思っているのですが まずはどのようなものから学べばよいですか?
Cで書いた簡単な関数 (引数に1を足して返すだけとか) をコンパイルしてアセンブラコードを吐かせ、 それを参考書片手に理解するところからってのはどうだろう
インラインアセンブリは、インライン独特の癖とかあるから、 独立した関数をアセンブラで書くほうから始めるほうがいいと思う。
いっそアセンブラを作る所から入ってみてはどうだろう?
淫乱アセンブラ
LSIC-80の、インライン関数定義。_asm_cがキーワードで、cに無いコードを出す時使う。 char _asm_c(char *); #define di() _asm_c("\n\tDI\n") /* DI,EI ASMコード発生マクロ */ #define ei() _asm_c("\n\tEI\n") /* 割込み関数用 PUSH/POP コード発生マクロ */ #define PUSHALL() _asm_c("\n\tPUSH PSW\n\tPUSH H\n\tPUSH D\n\tPUSH B\n") #define POPALL() _asm_c("\n\tPOP B\n\tPOP D\n\tPOP H\n\tPOP PSW\n")
LSICのそれは只のマクロだからなぁ。改行し忘れるとなかなか楽しいことになるし。 つーか、80かよw
アセンブリ言語全くの初心者なのですが、wsprintfAというのは使い方によっては画像の表示とかメモリにロードするとかそういう画像関係のこともできるのですか? 初心者ですいませんm(_ _)m
wsprintfの仕様が知りたければMSDNで調べなさい。
966 :
デフォルトの名無しさん :2008/11/17(月) 00:12:00
xor 使ってeaxを0にするのと、mov使ってeaxを0にするのは xor使ったほうが早いって言うけど、どうやって調べたのか教えて下さい
調べる云々じゃなくて、CPU設計したIntelがそういう風に言ってるの。 アウトオブオーダ機構を備えるCPUにおいて、同じレジスタに対するxorは レジスタリネーミングのヒントとして特殊な意味を持つようにした。 具体的な効果として、xor eax, eaxを挟んだ前後のeaxを操作する命令間には 依存関係がなく並列実行可能であることが、パイプラインのスケジューラにヒントとして与えられる。 あと、0という値をロードするよりも命令長は短い。 同じ効果の命令なら命令長が短い方が命令キャッシュのヒット率が高くなり 全体のパフォーマンスはよくなる
何で難しいことを先に説明するんだよwww
すまん空気読めなかった 普通に、効果が大きい方の順
>>967 即値ロードも同じように並列実行可能だとおもうんだけど
それはヒントにしないのはなぜ?
ヒューリスティックを無限に増やせないってのは分かるんだが
即値って普通に現れるコードだよね。
即値ロードの場合、実際にその値をeaxに書き込む必要があるが xor eax,eaxの場合、たとえば常に値ゼロの特殊レジスタ(俗にゼロレジスタという) があるマイクロアーキテクチャでは、それをeaxにリネームするだけでいい。
Intelじゃないかもしれないのだが・・・。
973 :
デフォルトの名無しさん :2008/11/17(月) 23:43:33
団子はインテルのCPUには詳しいけどそれ以外知らないからなー
eaxなんて名前のレジスタがある非Intelプロセッサ・・・あるんか? まあAMDでもVIAでもいいけどさ。OoO、レジスタリネーム機構を備えるx86はみんなそういうつくり。
ほんとにIntelじゃなければ
>>966 が何か言うだろ
>>974 mipsとかalphaとかarmとかsparcとかは?
>>976 団子が煽る前に書いておくが、「eaxなんて名前のレジスタ」はその辺のCPUにはないと思うぞ。
最初がAreg、16bit必要になってAH,AL 合わせてAX、32bit必要になって左側をEA 合わせてEAX 歴史が詰まっているネーミングですね。
Accumlater Data Register Counter Base Register
>>954 細かいところだけど、気付いたのでカキコ
00AE CDC400 call 00C4 ABSHL ; DEを符号無しに
00B1 EB xchg
00B2 CDC400 call 00C4 ABSHL ; HLを符号無しに
00B5 EB xchg
↓
00AE CDC400 call 00C4 ABSHL ; **HL**を符号無しに
00B1 EB xchg
00B2 CDC400 call 00C4 ABSHL ; **DE**を符号無しに
00B5 EB xchg
そう言えば、RAXとかのRって何ですか?
Re-ExtendedのR もしくはRegisterのR(汎用レジスタのr8〜r15を新設したけど、他のレジスタの64ビット拡張にもRつけちゃえ)
Rokujuyon の R だろ?
XMMレジスタ多すぎる 4つで充分
985 :
954 :2008/11/19(水) 17:53:02
XMMレジスタで128bit実数をサポートしてテンポラリリアルを一掃して欲しい。
だいたい、ポート間のデータ転送にCPUリソース使うなよな