Cで書くかアセンブラで書くか・・・
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
NGNG下手なアセンブラコードよりも、Cで書いてコンパイラに任せた方が速い場合もあります。
こういう場合はアセンブラで、こういう場合はCで書いた方がいいよという情報をみんなで交換していきましょう。
このスレはCあるいはC++の中で使用するアセンブラに特化したスレです。アセンブラの全般の話題はこちらへ
アセンブラ… (°Д°)ハァ?
http://pc5.2ch.net/test/read.cgi/tech/1093519463/l50
0002デフォルトの名無しさん
NGNG速度が理由でアセンブラ使うことを検討したことはここ数年ないな。
アプリケーションプログラマだからこういう答になるけど、
サイズを気にする組み込み系だとまた話は違ってくるんだろうね。
0003デフォルトの名無しさん
NGNG0004デフォルトの名無しさん
NGNG0005デフォルトの名無しさん
NGNGんなわけねー
0006デフォルトの名無しさん
NGNG1.高速化のために使う場合
コンパイラがサポートしない特種命令を持つCPUの時、
もしくは命令スケジュール等が実質サポートできていない命令を使いたい時。
2.ハードウエアをキックする場合
オプティマイザがポートのキック順序を勝手に変えてしまい問題を引き起こしてしまう場合。
もしくはアクセスタイミングが正確でなければ動作しないハードをキックする場合。
3.割り込み関連のコードを書く場合
コンパイラがサポートしていないケースが多い。
4.言語間ブリッジを書く場合
二つの言語間インターフェイスを取れる言語はアセンブラのみ。
5.コンパイラそのものを作るとき
出力先にC等を使わないネイティブコンパイラには必須。
6.OSのような物を作る場合
スタック操作やスレッドの実現に使う。
プログラムのロード実行、その他自己書き換えのようなものを実現する場合。
以上
0007デフォルトの名無しさん
NGNG0008デフォルトの名無しさん
NGNG0009デフォルトの名無しさん
NGNG0010マイク ◆yrBrqfF1Ew
NGNGinline-assemblerを使う
http://www-6.ibm.com/jp/developerworks/linux/010615/j_l-ia.html
0011デフォルトの名無しさん
NGNG1:gcc内でアセンブラを使うには
2:gcc無いでアセンブラを使うには
0012デフォルトの名無しさん
NGNGアセンブラのソース渡せばそのままアセンブルしてくれるだろ。
0014デフォルトの名無しさん
NGNG0015デフォルトの名無しさん
NGNG好きなだけ勉強するといい、このCPUに流行って欲しかったと心の底から思えるよ。
0016デフォルトの名無しさん
NGNG0017デフォルトの名無しさん
NGNG思わず完全無料ライブチャットの方をクリックしてしまった。
0018デフォルトの名無しさん
NGNG>試作品みたいな名前
Alpha 知らないってのは痛いな。
0019デフォルトの名無しさん
NGNG8bit/16bitの処理の遅さが弱点(命令セットを持っていない)と言われているけれど、
ゲームの場合は使わなきゃいいって選択肢があるからね。
0020デフォルトの名無しさん
NGNG0021デフォルトの名無しさん
NGNG0022デフォルトの名無しさん
NGNGARMは、そろそろ使用に耐えなくなる頃合だよん
0023デフォルトの名無しさん
NGNG0024デフォルトの名無しさん
NGNG0025デフォルトの名無しさん
NGNGとりあえず↓これを読むのはどう?
http://www.amazon.co.jp/exec/obidos/ASIN/4822281019/qid%3D1099535689/249-2545910-7109969
0026デフォルトの名無しさん
NGNG君へのおすすめはこっち
http://www.amazon.co.jp/exec/obidos/ASIN/4839909865/
0027デフォルトの名無しさん
NGNGそれ、面白そうだね。
電気回路知識がなくても大丈夫?
0028デフォルトの名無しさん
NGNG同じ処理の異なるロジックをCで一通り書いて、それをコンパイラでアセンブラコードに落として比較する。
これが一番確実で有効なアセンブラの利用法。
0029デフォルトの名無しさん
NGNG0030デフォルトの名無しさん
NGNGgccでコンパイルできる書式
つかマニュアルくらい嫁
0031デフォルトの名無しさん
NGNG0032デフォルトの名無しさん
NGNG貴方は
0033デフォルトの名無しさん
NGNG>31は>29に対するしゃれだから
0034デフォルトの名無しさん
NGNG0035デフォルトの名無しさん
NGNGhttp://jbbs.livedoor.jp/sports/19329/index.htm
0036デフォルトの名無しさん
NGNG0037デフォルトの名無しさん
05/02/03 05:04:000038デフォルトの名無しさん
05/02/03 05:13:49CPU書かんと答えようが無い。
0039デフォルトの名無しさん
05/02/03 05:51:080040デフォルトの名無しさん
05/02/03 20:48:590041スコープ変数varにはテスト条件の結果の値が格納される
05/02/03 20:53:590042デフォルトの名無しさん
05/02/03 20:54:55その分仕様がシンプルだからね。勉強には良い。
0043EL式はJSP1.2ベースのアプリケーションでは
05/02/03 20:58:530044デフォルトの名無しさん
05/02/03 21:02:40当たり前だけど、CPUによって命令がばらばら共通仕様が無い言語から
どのCPUにでもあるであろう命令のみをシンプルに集めた物。
0045デフォルトの名無しさん
05/02/04 00:02:540046デフォルトの名無しさん
05/03/05 03:00:280047デフォルトの名無しさん
2005/04/04(月) 13:28:37エミュレーター8086で動かしてみたんですが、何も変わりません。
#make_COM#
SI1:
movdx,02FDh
mov ax,dx
testal,00000001b
jzSI1
movdx,02F8h
inax,dx
pushax
adddx,2
inax,dx
pushax
adddx,2
inax,dx
pushax
ret
0048デフォルトの名無しさん
2005/04/04(月) 14:16:28入力ポートからの読み込み。
つーか、そのくらいマニュアルに書いてあるが。
その例だと、0x2fdポートから読み込んだデータの最下位ビットが0の間ループし、
その後0x2f8ポート、0x2faポート、0x2fcポートから順次読み出してスタックに積み、
最後に積んだ結果のアドレスに戻ろうとしてアボーンする。
0049デフォルトの名無しさん
2005/04/04(月) 14:23:070050デフォルトの名無しさん
2005/04/04(月) 16:13:32Cコードからキーパッドを使って固定小数点をタイプし、
その打ち込んだ全ての固定小数点とその合計を足したものをLCDに
ディスプレイするという問題なのですが、以下のコードを書きました。
小数点をLCDにディスプレイする事は成功したんですが、その数字の
足した合計をディスプレイするのにてこずってます。
コードが多少長いですが、もし何か気づく点があったら指摘お願いします。
0051デフォルトの名無しさん
2005/04/04(月) 16:18:58{
char khar;
FILE *lcd;
unsigned char lcd_pos1=0xC3;
unsigned char lcd_pos2=0xCB;
lcd=stdprn;
setbuf(lcd,NULL);
fprintf(lcd,"%c%c",LCD_CMD,LCD_CMD1);
fprintf(lcd,"%c%c",LCD_CMD,140);
do{
rt_yield();
khar=getch();
0052デフォルトの名無しさん
2005/04/04(月) 16:19:28{
cprintf( "Sending %u ", x-'0');
}
else if ( x=='#')
{
dos_exit();
}
else if (x=='*')
{
fprintf(lcd,"%c%c",LCD_CMD,0xc);
fprintf(lcd,"%c%c",LCD_CMD,LCD_CMD2);
fprintf(lcd,"%c%c",LCD_CMD,CLR_HOME);
fprintf(lcd,"%c%c",LCD_CMD,LCD_POS);
}
}while(1);
}
{
0053デフォルトの名無しさん
2005/04/04(月) 16:19:55int khar;
int sum = 0;
FILE *lcd;
unsigned char lcd_pos1=0xC3;
unsigned char lcd_pos2=0xCB;
lcd=stprn;
setbuf(lcd,NULL);
do{
rt_yield();
sum+=khar;
cprintf("%d",sum);
fprintf(lcd,"%c%c",LCD_CMD,0xc);
fprintf(lcd,"%c%c",LCD_CMD,LCD_CMD2);
fprintf(lcd,"%c%c",LCD_CMD,CLR_HOME);
fprintf(lcd,"%c%c",LCD_CMD,LCD_POS);
}while(1);
}
0054デフォルトの名無しさん
2005/04/04(月) 16:37:150055デフォルトの名無しさん
2005/04/04(月) 17:14:58>気づく点
固定小数点って何? 固定小数点小数のこと?
合計の計算ができないのか、出力ができないのか、自力で分離できない?
そんな環境依存のコードを見せられても解析するのも面倒なんだけど。
#つーか、マルチかよ!
0056デフォルトの名無しさん
2005/04/04(月) 17:42:210057デフォルトの名無しさん
2005/04/04(月) 20:01:52甘ったれチャンは自己解決しろ(ぷ
0058ビル・ジョブス
2005/04/04(月) 21:01:26でも、符号無しを前提に、
#define C_ROR(u, n) sizeof(u) * 8 - (n) > 0 ? (u) >> (n) | (u) << (sizeof(u) * 8 - (n)): (u)
マクロで簡単に実装出来ちゃったりもする。
しかもnが定数だったりするとコンパイラのオプティマイズで三項演算コードも生成されない。
やっぱりローテート演算子要らないな。
0059デフォルトの名無しさん
2005/04/05(火) 06:14:09ROTATE with CARRY はまずないね。 欲しいのはこちらなんだけど。
ポートサンプリング処理などで、CY<--port, A<--byte, RRC/RLC A, byte<--A とやると
高速なコードにできるのだが、cだとシフトしてからportを判定して左端か右端をORするコード
にするしかない。
0060デフォルトの名無しさん
2005/04/05(火) 13:33:43(´-`).。oO(コマンド?)
0061デフォルトの名無しさん
2005/05/15(日) 09:42:57コンパイラの最適化よりなかなか速くなりません。
0062デフォルトの名無しさん
2005/05/15(日) 09:52:28まずはコンパイラの出力をさらに最適化することから始めれば良い
0063デフォルトの名無しさん
2005/05/16(月) 04:43:47rxsft2 >>= 1; /* LSBファーストで受信 */
f( P8DR.0 ) rxsft2 |= 128;/* P80->CY, ROTXR.Bが欲しい */
これのASMコードが
MOV.B @rxsft2:24,R6L
SHLR.B R6L
MOV.B R6L,@rxsft2:24
BLD #0,@0xFFFFFFD7
BCC ?0019
MOV.B @rxsft2:24,R6L
OR.B #128,R6L
MOV.B R6L,@rxsft2:24
?0019:
006463
2005/05/16(月) 04:50:58cでは上のように書くしかない。ASMにはROTATE with CARRY という命令があるから、
BLD #0,@FFFFFFD7 ;ポートからCYに読む
MOV.B @rxsft2:24,R6L
ROTXR.B R6L ;CY-->R6L右シフト-->LSBがCYに出て行く
MOV.B R6L,@rxsft2:24 ;これで同じ結果が得られる。
変数がワードでも同じ手法が使える。割り込み処理などぎりぎり速くしたい部分は
こういう書き方をするよ。
0065デフォルトの名無しさん
2005/05/25(水) 22:57:107.バイナリ配布のソフトを弄らんとならんとき
0066デフォルトの名無しさん
2005/05/28(土) 20:48:10__asm {
push edi
push esi
mov edi, dstp
mov esi, srcp
call dword ptr code
pop esi
pop edi
}
}
__asm {
pushfd ; Get original EFLAGS
pop eax
mov ecx, eax
xor eax, 200000h ; Flip ID bit in EFLAGS
push eax ; Save new EFLAGS value on stack
popfd ; Replace current EFLAGS value
pushfd ; Get new EFLAGS
pop eax ; Store new EFLAGS in EAX
xor eax, ecx ; Can not toggle ID bit,
jz done ; Processor=80486
mov has_CPUID,1 ; We have CPUID support
done:
}
この2つのアセンブリコードをCに直すにはどうすれば良いのでしょうか?環境はVS2005/Win32環境です。
0067デフォルトの名無しさん
2005/05/29(日) 14:17:28char a[] = {0x57,0x56,0xbf,0,0,0,0,0xbe,0,0,0,0,0xe8,0,0,0,0,0x5e,0x5f,0xc3};
*(void **)&a[3] = dstp;
*(void **)&a[8] = srcp;
*(int *)&a[13] = (char *)copy_row - &a[17];
((void (*)(void))a)();
char b[] = {0x9c,0x58,0x8b,0xc8,0x35,0x00,0x00,0x20,0x00,0x50,0x9d,0x9c,0x58,0x33,0xc1,0xc3};
if (((int (*)(void))b)()) has_CPUID = 1;
0068デフォルトの名無しさん
2005/05/29(日) 18:29:58どうもありがとうございます!
0069デフォルトの名無しさん
2005/05/30(月) 05:56:47ライブラリとかを複数の環境に対応するように作成するとき、
だいたい何種類ぐらいの環境に対応させるものですか?
たとえば
文字ライブラリや数学ライブラリを環境依存無くかつ高速で動作させるには、
アセンブラを使わざる終えないでしょうが、どんなCPUに対応しますか?
x86系CPU や Alpha の他にはなにがありますか?
0070デフォルトの名無しさん
2005/05/30(月) 06:53:34H8 と Z8000 と SX-8
0071デフォルトの名無しさん
2005/05/30(月) 07:01:22ありがとうございました。
一般的かつ平均的に5種類のCPU用にアセンブラをマスターすれば、
高速な汎用ライブラリをとりあえずは書けるということになりますね。
0072デフォルトの名無しさん
2005/05/30(月) 08:54:54なりません。
0073デフォルトの名無しさん
2005/05/30(月) 13:22:050074データボックス
2005/05/31(火) 01:35:28アセンブリ言語を学習してWindowsプログラムを作りたい。
0075デフォルトの名無しさん
2005/05/31(火) 08:50:01Z800016bit?
SX-8スパコン?
で、iMacのサポートは?ふつうはPCとWSで動けばいいじゃん。
0076デフォルトの名無しさん
2005/05/31(火) 13:11:44ポケコンとワンダースワン?
0077デフォルトの名無しさん
2005/05/31(火) 21:10:450078デフォルトの名無しさん
2005/06/25(土) 20:52:260079デフォルトの名無しさん
2005/06/26(日) 03:44:03最大化やウィンドウのリサイズを禁止するにはどうすればいいんでしょうか?
最小化はそのまま使えるようにしたいのですが…
0080デフォルトの名無しさん
2005/06/26(日) 04:26:310081デフォルトの名無しさん
2005/06/26(日) 11:37:220082デフォルトの名無しさん
2005/11/20(日) 23:55:11main(){
int a,b,*s=(int*)malloc(sizeof(int));
__asm{
mov eax,a;
add eax,b;
//ここが問題 sのアドレスへどうやってeaxの値をいれてやれば
//幸せになれますか?
}
printf("%d\n",*s);
return 0;
}
環境はVS2003 Win32とVS2005 Win64 デス
0083デフォルトの名無しさん
2005/11/20(日) 23:56:49人手で出来るケースや能力ってかなり限定されてるんじゃないか?
0084デフォルトの名無しさん
2005/11/21(月) 00:01:52mov dword ptr [edx], eax;
0085デフォルトの名無しさん
2005/11/21(月) 00:06:32ありがとうございました。
0086デフォルトの名無しさん
2005/11/21(月) 23:21:14最新のインストラクションを使う場合は書かざるえないんですが。
0087デフォルトの名無しさん
2005/11/22(火) 14:55:49それだけだけど
0088デフォルトの名無しさん
2005/11/22(火) 16:28:280089デフォルトの名無しさん
2005/11/22(火) 18:33:290090デフォルトの名無しさん
2005/11/22(火) 18:55:590091デフォルトの名無しさん
2005/11/22(火) 19:07:50Cで書ける時は全てCで書く
どうしてもアセンブラじゃないと書けないときだけアセンブラで書く。
趣味なら
面白そうな方で書く
0092デフォルトの名無しさん
2005/11/22(火) 19:20:360093デフォルトの名無しさん
2005/11/22(火) 19:52:12コンパイラ書く手間工数に入れていい?
0094デフォルトの名無しさん
2005/11/22(火) 22:30:13new,delete コンテナはできれば使いたい。
0095デフォルトの名無しさん
2005/12/05(月) 15:15:01#include<3048.h>
void ioinit(void)
{
P1.DDR=0xff;
}
void adinit(void)
{
AD.ADCSR.BIT.ADF=0;
AD.ADCSR.BIT.SCAN=0;
AD.ADCSR.BIT.CKS=1;
AD.ADCSR.BIT.CH=0;
}
}
どこがいけないのでしょうか?
0096デフォルトの名無しさん
2005/12/05(月) 15:48:39よろしくお願いします。
0097デフォルトの名無しさん
2005/12/05(月) 16:07:26ここで聞いた方がいい
http://science4.2ch.net/test/read.cgi/denki/1133272478/
0098デフォルトの名無しさん
2005/12/05(月) 18:47:453048.hの中身が分からない事には、何も言えません。
本の中身を、タイトルだけ見て当てろと言ってるのと同じだよ。
0099デフォルトの名無しさん
2005/12/06(火) 08:20:27>>97 のリンク先の人たちにとっては 3048.h の中身は stdio.h と同じくらい常識ですよ
0100デフォルトの名無しさん
2005/12/06(火) 10:05:19じゃあそのスレで質問しろ。
状況判断能力のない奴だ。
0101デフォルトの名無しさん
2005/12/06(火) 11:25:170102デフォルトの名無しさん
2005/12/06(火) 15:25:263048.hってもしかしてルネサスのCPUじゃない?
ADってA→Dコンバートだから入力なんだが・・・
0103デフォルトの名無しさん
2005/12/06(火) 16:03:59超音波装置:電圧出力 → AD変換でデジタル値に変換
そのデジタル値を出力ってこと?
デジタルの出力ってどんなの?
0104デフォルトの名無しさん
2005/12/06(火) 16:16:56> どこがいけないのでしょうか?
お前の無能力
0105デフォルトの名無しさん
2005/12/06(火) 16:35:09普通は
DA変換でデジタル値をアナログ電圧に変換 → 超音波装置:電圧入力
0106デフォルトの名無しさん
2005/12/06(火) 21:22:23そうすると>>95は実は、>>105の意味?
0107デフォルトの名無しさん
2005/12/06(火) 21:30:04>>95はADコンバートのスキャン開始を設定しているだけ
H8/3048のAD端子にかかっている電圧を一定時間毎に
デジタル値に変換してCPUの内部レジスタに転送してくれる機能が
あるんだけど、それを作動させたにすぎない
無論、超音波なんて出ない
0108デフォルトの名無しさん
2005/12/06(火) 21:38:42つーことは、>>102が正解ってことか。
0109102=105=107=109
2005/12/06(火) 21:40:46つーかそれ、俺
0110デフォルトの名無しさん
2005/12/06(火) 23:36:47つーことはあなたと私と二人で会話をしていたわけか・・・
0111ハーピィ
2005/12/17(土) 18:43:530112デフォルトの名無しさん
2006/03/23(木) 11:30:120113デフォルトの名無しさん
2006/04/13(木) 07:04:09なかなか難しいものであるし、出世できたとしても真正面からトップと対峙するので、さらに仕事は難しくなる。
その典型例として、現実の世界を例にとるとあまりにドロドロした話となってしまうので、「宇宙戦艦ヤマト」にお
けるデスラー総統とヒス副総統(将軍)の関係から、どういった処方があるのかを見ていきましょう。
0114デフォルトの名無しさん
2006/04/13(木) 07:05:46ヤマトの敵方として設定されている大ガミラス帝国は、デスラー総統を絶
対的指導者としている独裁国家です。設定そのものの多くをナチスドイツ
に求めることができるので、そういったものだという理解があれば十分です。
その絶対的指導者の副官としてヒスという人物があるのですが、おそらく
彼は天賦の才で副官に登りつめたのではなく、官僚的な指導者層の中から
この地位を得たと思われ、組織的な根回しには向いているが、対外的な
処方についてはあまり得意ではないように感ずる人物です。
まずは、この二人のやり取りから行ってみましょう。
0115デフォルトの名無しさん
2006/04/13(木) 07:06:43きたヤマトについて、デスラー総統に経過を説明する必要が生じた。説明担当はもちろん、副官的
位置付けにあったヒス将軍(当時は副総統ではなかった)。
ヒス 「ヤマトの愚かな航海ぶりについてご説明いたします。」
と切り出し、地球から太陽系脱出までの概略について説明し、その説明途中で、
ヒス 「木星にある我が前線をピストルで撃破…」
という表現を用います。すると、すかさずデスラー総統は、
デスラー 「ヒス君、ピストルだったかねぇ。」
ヒス 「は、波動砲とやらですが、私の目にはピストルみたいなもので…」
デスラー 「君の感想はいらん。事実だけを報告しなさい。」
0116デフォルトの名無しさん
2006/04/13(木) 07:07:49実際、ビジネスの現場でも見られるやり取りですね。ということで、ヒス将軍はその後
の説明を「ようするに〜」とあっさり終わらさざる得ず、せっかく用意していたであろう
台本は意味を失します。そこで、すかさずフォロゥに入ったタラン将軍(「さらば宇宙戦艦ヤマト」
では、デスラーのいい副官としての登場だったが、本作ではドメル将軍軍事裁判等で
あまり良い印象はない)。総統の名をいただいたというデスラー機雷の説明を行い、最後に
タラン 「ヤマトが紙飛行機よりも脆く燃え果てる様を、夕食後の座興に総統に
お楽しみいただきたく、ご連絡申し上げたわけでございます。」
と、ヤマト航海経過の報告から、デスラー機雷によるヤマト殲滅の説明へと鮮やかに
話題を転換(ヒス将軍からタラン将軍への主役交代)。デスラーの損ねた機嫌を
回復しようとします。それに対しデスラーも、
デスラー 「いや、ありがとうタラン将軍。面白いアトラクションを用意してくれて
今宵の酒は一段と味がよいだろう。」
と返します。そして、やや不満が残りながらも次の言葉を続けます。
0117デフォルトの名無しさん
2006/04/13(木) 07:09:34と。しかし、この言葉が終わらぬうちに、ある将軍は急に馬鹿笑いをはじめ、
某将軍 「はっはっはっはっはっ…、ヤマトの無事を祈ってか、これは面白い。
総統も相当冗談がお好きで…。はっはっはっはっはっ…」
と顰蹙を買う行為を始めたのです。これでは、せっかくフォロゥを入れたタラン将軍の
苦労も水の泡。哀れ、自業自得とはいえ、この将軍は抹殺されてしまったのです。
ヒス将軍によって損なわれた機嫌が、何とかタラン将軍のフォロゥで良くはなった。
しかし、完全ではなく、ヒス将軍に対する不満は下品な男(デスラー総統評)に
すべて被さる結果となったものの、しこりが残ったのは間違いないと見ていいでしょう。
0118デフォルトの名無しさん
2006/04/13(木) 07:58:03この一部始終をビデオモニタで鑑賞していたデスラー総統は、
デスラー 「ヤマトの最期が見られなかったが、結構楽しいショウだった。諸君!
私への心遣い、深く感謝しよう。私はゆっくり眠りにつくとしよう。おやすみ、諸君。」
と精一杯の強がりを言った後、
デスラー 「あぁ、ヒス君。ヤマトの艦長は何と言ったかね?」
ヒス 「オキタ…、でございますが。」
デスラー 「オキタか、お見事だったと祝電を打ってやってくれ。デスラーの名でな。」
ヒス 「はい、デスラー総統。」
というやりとりで、ヤマト艦長沖田に『ヤマト諸君の健闘をたたえる。今後の対決が楽しみだ。
ガミラス総統デスラー』という内容の祝電を打ったのです(ヤマトでは、祝電の発信源を
なぜ捉えなかったのかと沖田艦長が相原を叱責する場面がある。こういうこだわりが当時としては凄かった)。
0119デフォルトの名無しさん
2006/04/13(木) 08:01:01それが証拠に、デスラー機雷突破後のデスラー自らが考案した作戦が失敗したときの以下の
やりとりから、それを十分に汲み取ることができます。
(デスラーの寝室に報告に上がるヒス将軍。)
デスラー 「な・に・ご・とだね、ヒス君。まぁ、入りたまえ。」
ヒス 「はぁ。(しばしの沈黙)。総統、ヤマトのことで…。」
デスラー 「ヤマトなぞの最期を報告せんでいいと言った筈だ。」
ヒス 「いえ、それが……。切り抜けました。」
デスラー 「なにぃっ!」
ヒス 「総統のガスはコロナの中におびき寄せられ焼き尽くされました。ヤマトは前に立ちはだかるコロナを波動砲で粉砕し、見事な作戦です。艦長オキタに祝電を打ちましょう。」
デスラー 「祝電? ヒス将軍、君はバカかね?」
ヒス 「はぁっ?」
デスラー 「もういい、戻って休みたまえ。」
ヒス 「はっ! 総統、ばんざい!」
どこがどう、ということは敢えて指摘しませんが、こういう部下を持つ上司は辛いと
感ずるところです。では、優れた対応とはどういうものなのか。それは、ドメル将軍
凱旋の時のデスラーとのやり取りの中に見ることができます。短いやり取りながら、
デスラーの意を十分に汲んだやり取りだといえましょう。
0120デフォルトの名無しさん
2006/04/13(木) 08:03:27デスラー 「ふっふっふ、目下、銀河系をうろうろしてるようだがな。暇つぶしにからかってやったのだ。」
ドメル 「総統、よろしければ私が捻り取ってまいりましょう。」
デスラー 「はっはっ、また君に勲章が一つ増えるだけだろうが、ま、休養半分で軽くやってきてもらおうか。」
ドメル 「はっ、かしこまりました。」
これである。
ドメル将軍凱旋後、ヤマト撃破はドメル将軍の担当となる。バラン星での作戦が失敗し、責任を問われる
ドメル将軍は軍事法廷で死刑を宣告される(軍事法廷の責任担当はヒス副総統)。その判決の署名を
デスラー総統に持ち込むヒス副総統だったが相手にされず、判決書は破り捨てられ、ドメル将軍に
男としての最後のチャンスを与えた。
一方、ガミラス本星での戦いで、勝ち目のない戦いに和平を進言したヒス副総統は、デスラーに
射殺される(珍しくまともな進言だったのに)。もし、和平を進言したのがヒス副総統でなく、
亡きドメル将軍だったなら結果は同じといえるだろうか。
「宇宙戦艦ヤマト」というのは、お話であるからあまりそういったことを考えても仕方がないことかもしれない。
だが、しかし、たかがお話だからこそ見えるもの、示唆できるものがあるのも事実だろう。
所詮、社会は人付き合い。そういったものなのだから、教訓として得られるものであれば積極的に吸収していきたいものだ。
0121デフォルトの名無しさん
2006/04/17(月) 22:39:54メイン基盤上のチップLE2080,2280,4280のプログラムが
市販品のロムライターで読み込みできます。
確率や連チャンの仕組みが一目瞭然!
攻略法はあなた自身で見つける時代です。
http://www.3-you.com/
0122デフォルトの名無しさん
2006/04/27(木) 23:41:530123デフォルトの名無しさん
2006/06/12(月) 16:54:11使うとしたらどんな時?
0124デフォルトの名無しさん
2006/06/12(月) 17:08:110125デフォルトの名無しさん
2006/06/12(月) 17:42:18何で PC (しかも x86) 前提?
0126デフォルトの名無しさん
2006/06/12(月) 18:16:35前人未到なトリッキーアルゴリズムを実装するとき。
コンパイラがAI積んだエキスパートシステムになる時代がくるまでは
まだまだ人間の頭脳が役立つ時はある。
0127デフォルトの名無しさん
2006/06/13(火) 03:46:32アセンブラの方がやりやすくてイライラする
そういう場合に使う
0128デフォルトの名無しさん
2006/06/13(火) 05:17:36きみ なんさい?
おじさんに こっそり おしえてよ。
0129デフォルトの名無しさん
2006/06/13(火) 15:28:18処理がいっぱいいっぱいだったのにCPUのHALT期間が七割くらいになったんでそれなりの省電力も。
0130デフォルトの名無しさん
2006/06/13(火) 18:17:21それなんてダメコンパイラ?
まさか最適化の指定をしてないなんて落ちじゃないよな。
0131デフォルトの名無しさん
2006/06/13(火) 18:34:43当然 VTune 使ったんだよね!?
0132デフォルトの名無しさん
2006/06/13(火) 19:48:5420代後半くらい
0133デフォルトの名無しさん
2006/06/13(火) 20:34:27実はしていない。
最適化するとエラーでコンパイルが通らなくなる駄目コンパイラなんだよ。まじで。
0134デフォルトの名無しさん
2006/06/13(火) 20:38:47このたびめでたくCPUがディスコンになる運びだ。
0135デフォルトの名無しさん
2006/06/16(金) 01:39:430136デフォルトの名無しさん
2006/06/19(月) 12:03:56俺は年齢より、>127 の日本語歴が気になる。
0137デフォルトの名無しさん
2006/08/14(月) 09:31:08実行速度で比較して、「ほらこんなに違うでしょ」という良い例あるかな。
0138デフォルトの名無しさん
2006/08/14(月) 09:36:48コレが出来ない限り人間じゃなきゃ出来ない最適化って多そうな。
ベクトル化されたクラスを使えば少しはよくなったりするのかね。
0139デフォルトの名無しさん
2006/08/14(月) 10:01:46まぁ、人間ならではの分岐予測やループ回数予測はできるけどね。
#でもそれらはプロファイリング最適化やプラグマ指定でも同じことができるわけだけど。
少なくともループの中身だけをインラインアセンブラ化しても全く太刀打ちできないと思う。
0140デフォルトの名無しさん
2006/08/14(月) 10:11:01Z80辺りなら殆どアセンブリの勝ちだな
スタックフレームまで展開してくれるコンパイラがあれば話は別だが
0141デフォルトの名無しさん
2006/10/12(木) 02:43:180142デフォルトの名無しさん
2006/10/13(金) 16:18:52はじめたばかりなので分かりやすくお願いします.
0143デフォルトの名無しさん
2006/10/13(金) 16:58:14コンパイルする。
0144デフォルトの名無しさん
2006/10/13(金) 17:14:100145デフォルトの名無しさん
2006/10/14(土) 07:01:15http://www.amazon.co.jp/gp/product/4781905854/
http://www.amazon.co.jp/gp/product/4781905862/
0146デフォルトの名無しさん
2006/10/14(土) 11:54:40実際試したわけじゃないが、たとえばbyteを上下のニブルに対応するASCIIコードに
変換する関数なんかは、アセンブラなら十進補正命令使って効率よく書けるけど
Cのコンパイラでそこまで知恵が回る奴はないだろうな。
0147デフォルトの名無しさん
2006/10/19(木) 01:02:300148デフォルトの名無しさん
2006/10/19(木) 01:56:340149デフォルトの名無しさん
2006/10/20(金) 01:21:25組み込み系のしごとでなけりゃ、使うことねーよ。
0150デフォルトの名無しさん
2006/10/20(金) 01:32:56趣味の人は大いに役立つ。
ていうかC言語の理解の助けにもなる。
0151デフォルトの名無しさん
2006/10/20(金) 09:58:500152デフォルトの名無しさん
2006/10/20(金) 10:53:4932bit同士の掛け算は結果が64bitになる。
Cでも書けるが時間が4倍かかってしまう。
これは遅すぎて耐えられない。
0153デフォルトの名無しさん
2006/10/20(金) 11:02:16たった4倍
10秒が40秒になるんだったら遅すぎて耐えられないだろうけど
1/100msecが4/100msecになったところでたいした変わらないだろ
0154デフォルトの名無しさん
2006/10/20(金) 11:44:54何が遅いって?
誰が何を耐えられないって?
0155デフォルトの名無しさん
2006/10/20(金) 12:27:33アホだろお前さんw
0156デフォルトの名無しさん
2006/10/20(金) 12:44:370157デフォルトの名無しさん
2006/10/20(金) 13:30:260158デフォルトの名無しさん
2006/10/20(金) 14:53:23もちろん10秒が40秒になるケースの話だろ。
こういうときアセンブラは役に立つ。
0159デフォルトの名無しさん
2006/10/20(金) 19:20:260160デフォルトの名無しさん
2006/10/21(土) 06:08:320161デフォルトの名無しさん
2006/10/21(土) 10:49:46馬鹿の発想だね
まあ馬鹿でないのならまともなプログラマの発想とは思えん
まともじゃない、というのは理念的には正しくても非現実的ということだ。
0162デフォルトの名無しさん
2006/10/21(土) 11:00:370163デフォルトの名無しさん
2006/10/21(土) 11:06:49そのまま言ってるんだろうけどね。
もちろんアルゴリズム上の工夫で計算量を減らすのは用途によっては致命的重要だけど、
そんなのこの話の自明の前提だろうに。
0164デフォルトの名無しさん
2006/10/24(火) 11:12:00一億回が27万回に減ったとしても、呼び出された部分を高速化することには意味がある。
0165デフォルトの名無しさん
2006/10/24(火) 11:15:550166デフォルトの名無しさん
2006/10/24(火) 11:37:230167デフォルトの名無しさん
2006/10/25(水) 12:49:110168デフォルトの名無しさん
2006/10/29(日) 19:33:14そんなことは自明なんだよ。
その上で最適化の必要があるのならやらないと。
0169デフォルトの名無しさん
2006/11/07(火) 15:09:42設計を知らない奴に何もできない。
0170デフォルトの名無しさん
2006/11/22(水) 04:15:100171デフォルトの名無しさん
2006/11/22(水) 06:49:150172デフォルトの名無しさん
2006/11/22(水) 07:41:110173デフォルトの名無しさん
2006/11/22(水) 08:10:580174デフォルトの名無しさん
2006/11/22(水) 08:40:110175デフォルトの名無しさん
2006/11/22(水) 08:44:24面白いやつだとドトネトのサブセット実装とか。
0176デフォルトの名無しさん
2006/11/22(水) 17:43:380177デフォルトの名無しさん
2007/01/02(火) 16:51:210178デフォルトの名無しさん
2007/01/03(水) 01:10:49DISK-BIOS位だと、アセンブラで書いた方が小さくて速いコードが書けた。
しかし、先日MS-Windowsのディスクドライバを逆アセンブルしたら、ある意味で非
人間的な最適化が掛かっていてビックリした。
要は、バイト数の少ない命令を使うことと、分岐をできるだけ減らすことで高速化
(というか正確には分岐予測失敗によるパイプラインの乱れをなく)してあるんだ
が、人間だとこんなコト考えつくかよ、と思うような論理演算と算術演算を使って、
条件分岐をなくしてあった。
コンパイラも進化したものだね。
0179デフォルトの名無しさん
2007/01/03(水) 02:37:080180デフォルトの名無しさん
2007/01/10(水) 22:30:110181デルフォトの名無しさん
2007/02/11(日) 22:07:03CODE SEGMENT
ASSUME cs:CODE,ds:CODE
ORG 100H
START: mov ah,09H ;文字列出力
mov dx,OFFSET MSG
int 21H
mov ah,4CH ; 終了
int 21H
MSG BD "Hello World",ODH,OAH,'$'
CODE ENDS
END START
7、10、13行目でエラーが出るんだが何故だろう?
0182デフォルトの名無しさん
2007/02/11(日) 22:22:19全角スペースを表示できるエディタを使おう。
Oと0の判別し易いフォントを使おう。
擬似命令について勉強し直そう。
0183デフォルトの名無しさん
2007/02/12(月) 10:00:360185デフォルトの名無しさん
2007/02/12(月) 17:25:590186デフォルトの名無しさん
2007/02/22(木) 04:17:39ttp://net2.system.to/pc/font.html
0188デフォルトの名無しさん
2007/04/09(月) 17:16:050189デフォルトの名無しさん
2007/04/09(月) 17:47:170190デフォルトの名無しさん
2007/04/10(火) 00:26:45容量の制限やアセンブラにしか出来ないこと以外は生産性とのバランスの問題らよ。
0191デフォルトの名無しさん
2007/04/10(火) 14:48:32>生産性とのバランスの問題らよ。
が解っていながら
>容量の制限やアセンブラにしか出来ないこと以外は
この作為的な前提条件は一体。
0192デフォルトの名無しさん
2007/04/10(火) 15:22:040193・∀・)っ-○◎●
2007/04/15(日) 15:21:28構造化されてないスパゲッティコードばっかし書く人ならそうだな
0194デフォルトの名無しさん
2007/04/15(日) 19:16:13馬鹿が背伸びして話題に参加することないのにw
192の言っていることは疑念の余地無く正しいし、それが分からないとしたら
アセンブラでコーディングしたことがないんだろうな。
0195・∀・)っ-○◎●
2007/04/15(日) 19:39:43他人のコードを読んだり、改修することまで視野に入れれば
処理系によっては構造化マクロがあるのは知ってるが
足し算を1行追加するのなんてたあいもないが、
アセンブリだと下手すりゃレジスタの割り当てを変え
しないといけないことだってある。
>アセンブラでコーディングしたことがないんだろうな。
ないよ。アセンブリ言語でコーディングはたまにやるけど。
アセンブラはバイナリコードの生成に使う。
0196デフォルトの名無しさん
2007/04/17(火) 14:24:440197デフォルトの名無しさん
2007/04/17(火) 20:40:42レジスタが非常に直交性のいい奴か、逆にレジスタが非常に少ない奴だと
そのあたりを気にしなくていい(気にしようが無い)から慣れてればどんどん組んでいける。
いわゆる80系(Z80とか8086あたり)の奴が一番難しいんじゃないかな。
それでもダンプでデバッグできる人がいたりするから、
凄腕なら実は生産性が変わらなかったりして。
最近アセンブラレベルで扱う必要があった石が、これの両極端なんだよね。
片方はそもそも扱えるリソースが少ないのに直交性の高いレジスタが16個。
方や16bitのアキュムレータが二つ、インデックスが二つだけで選びようが無い。
当然PCやSPは別にあるけど。
関係ないが、仕事の回路図に乗っかってた32bitの石のデータシートを見たら、
レジスタセットがZ80の拡張で吹いた。まだこのアーキテクチャ生きてるんだ。
0198デフォルトの名無しさん
2007/04/17(火) 21:10:46http://pc11.2ch.net/test/read.cgi/tech/1161097445/464
0199デフォルトの名無しさん
2007/04/17(火) 23:28:28こいつアセンブラでしかコーディングしたことないのか
16bit時代のWindows3.0だってアセンブラで書かれているのはほんの一部でしかない。
明らかに移植性より生産性を重視しての選択だろ
アセンブリ言語はコードを書くための生産性もそうだが
バグつぶしにかかる時間が高級言語に比べ明らかに落ちる
0200・∀・)っ-○◎●
2007/04/17(火) 23:38:11リアルで知ってる
0201デフォルトの名無しさん
2007/04/17(火) 23:51:55そういうロートルにSIMD書かせたらいいんじゃね?w
>>197
>それでもダンプでデバッグできる人がいたりするから、
特定のニモニックを覚えているだけのレベルなのか、
アセンブラ要らずのレベルを指しているのかによっても違うが。
0202デフォルトの名無しさん
2007/04/18(水) 00:10:38>明らかに移植性より生産性を重視しての選択だろ
ここは「移植性と生産性」って書かないと何の反論にもならないんじゃないの?
アセンブラのコードの移植性が高い、と言ってる人間が誰かいるか?
まあいいや。
さすがにアセンブラと、例えばCを比べたときに、
生産性や可読性がまったく変わらないとまではいえないけど、分野によっては
それほど大差がなかったりするのは経験上事実だと思う。
(逆にいうと、複雑なデータ構造をこねくりまわすようなプログラムは
確かにアセンブラでは辛い場合が多いとは思う。)
もちろんCみたいに文法の足枷がないぶん、ループや分岐といった「構造」が
浮き彫りになるようなコーディングスタイルをきっちり決めないとそういうわけには
いかないと思うけど。
0203199
2007/04/18(水) 00:24:31第三者的な位置から言ってみただけ
ちょっと>>194が狭い世界しか知らない風なのに
「馬鹿」呼ばわりしたのもムカついたし
それに>>192から逆上って読めば理解できるかと思ったから
あえてクドくかかなかっただけ。
0204199
2007/04/18(水) 00:38:59アセンブラの互換性の無さはは当たり前過ぎるし
昔から今に至ってMSはインテル系以外に移植するつもりは無いんだろうと
想像した上で、Cで書くメリットの中に移植性は眼中になかったと思ったからさ
まだ書いてること変かな?
0205デフォルトの名無しさん
2007/04/19(木) 00:07:53>昔から今に至ってMSはインテル系以外に移植するつもりは無いんだろうと
AlphaやMIPSやPowerPCのWindows NTのこともたまには思い出したあげて下さい・・・
0206・∀・)っ-○◎●
2007/04/19(木) 00:30:340207デフォルトの名無しさん
2007/04/19(木) 00:38:350208デフォルトの名無しさん
2007/04/19(木) 00:41:340209デフォルトの名無しさん
2007/04/20(金) 12:58:46黒って何だ?
#白はDreamCastなんだろうけど。
0210デフォルトの名無しさん
2007/04/20(金) 13:25:360211デフォルトの名無しさん
2007/04/20(金) 13:32:23dreamcast R7
0212デフォルトの名無しさん
2007/04/20(金) 15:35:300213デフォルトの名無しさん
2007/04/20(金) 15:41:330215デフォルトの名無しさん
2007/04/21(土) 08:38:561、キャリー・ボローを利用する場合
例:多倍長加算、DDA・DDS
2、回転系の命令を使いたい場合
3、32x32=64の掛け算を使いたい
4、コルーチン等のコンテクスト保存や飛ばしリターンなんかのテクニック
windowsだとコルーチンは自前だとスタック複数確保とか綺麗に出来ないしスレッドで十分
飛ばしリターンは例外で十分だろけどさ
5、PCだとRDTSC
0216デフォルトの名無しさん
2007/04/21(土) 10:14:26これは最適化で使ってくれるコンパイラもある。
0217デフォルトの名無しさん
2007/04/21(土) 11:04:40俺がそれを知ったのは、とあるCソースのコメント
0218デフォルトの名無しさん
2007/04/21(土) 11:33:17DDS Direct Digital Synthesis ?
0219デフォルトの名無しさん
2007/04/21(土) 11:38:250220デフォルトの名無しさん
2007/04/21(土) 11:45:38そもそもxが何かも判らん
0221デフォルトの名無しさん
2007/04/21(土) 11:48:220222デフォルトの名無しさん
2007/04/21(土) 17:30:480223デフォルトの名無しさん
2007/04/21(土) 18:10:500224デフォルトの名無しさん
2007/04/21(土) 18:14:450225デフォルトの名無しさん
2007/04/22(日) 01:59:010226デフォルトの名無しさん
2007/04/22(日) 14:36:380227デフォルトの名無しさん
2007/04/22(日) 22:06:280228デフォルトの名無しさん
2007/04/22(日) 22:27:050229デフォルトの名無しさん
2007/04/22(日) 22:36:320230デフォルトの名無しさん
2007/04/23(月) 11:03:54コンパイラにアセンブラ吐き出させて手で最適化するのはよくやる。
主に出入り口のレジスタ退避を減らすとかだけどね。
俺の仕事ではブロック入出力が多いんで、コンパイラが当ててくれなかった
組み込みループ命令とかを使って組みなおすことも多い。
0231デフォルトの名無しさん
2007/04/23(月) 12:15:57吐かれたアセンブラを必死で最適化したつもりのコード(多少サイズは小さい)が
実行させたら元より遅くなってしまったり・・・・
0232デフォルトの名無しさん
2007/04/23(月) 16:31:110233デフォルトの名無しさん
2007/04/23(月) 16:54:210234デフォルトの名無しさん
2007/04/26(木) 08:17:06割り込みで大量にレジスタ保存するコストが大きく
かつC言語は、レジスタを大量に使うように最適化されているので、
割り込みはアセンブラで書かなければいけないという事になりがち・・・・という話かな >>230
>>231はSHは命令のロードとデータの読み書きを巧くCコンパイラなら配分してくれるが
自作だとコードが短くなってもパイプラインが乱れてストールする事になることもあるという事だろ
SHは型番でそのあたりの事情が違うから、そのあたりの最適化はコンパイラに任せた方がいい。
最近のSHはレジスタバンク持ってるから、割り込みもC言語でOK
0235デフォルトの名無しさん
2007/05/30(水) 22:31:00つーか先にアセンブラ覚えた人間がC使うと、厳格な変数型チェックにぶち切れることになる。
「杓子定規にも程があるだろこのお役所コンパイラがぁ〜〜〜〜!!」とか何度叫んだやら。
逆にCから覚えた奴がCの「初めに変数型ありき」の感覚でアセンブラ使っても
大して速くも短くもならんし、ほとんどメリット無いだろな…
0236デフォルトの名無しさん
2007/05/30(水) 23:03:410237デフォルトの名無しさん
2007/05/30(水) 23:56:290238デフォルトの名無しさん
2007/05/31(木) 01:43:440239デフォルトの名無しさん
2007/05/31(木) 01:57:44ま、警告だけでも大助かりなんだけどね。
警告がでたら闇雲にキャストしてコンパイラを黙らせる輩の気が知れん。
0240デフォルトの名無しさん
2007/05/31(木) 06:30:27漏れはCの型チェックで切れたことは一度もないぞw
Javaと勘違いしてるんじゃないのか?
0241デフォルトの名無しさん
2007/05/31(木) 17:34:21union U
{
int i;
unsigned char b[4];
};
0242デフォルトの名無しさん
2007/05/31(木) 18:12:03そんな環境依存コードを書くぐらいならはじめからアセンブラを使う
0243デフォルトの名無しさん
2007/05/31(木) 18:15:510244デフォルトの名無しさん
2007/06/02(土) 10:09:40文字列の解析なんかだともっと顕著だよな。
一度に4バイト照合出来るCPUでも、
C言語は1バイトずつ4回比較しろって思想で作られてるから。
0246デフォルトの名無しさん
2007/06/02(土) 20:46:26エンディアンが問題になるのは違いが見つかるときだけだろ?
ほとんどのケースでは違いがないことの方が多い
全ファイルにまたがって違いがあるならそれを比較する意味すらない
0247ヒント: alignment
2007/06/02(土) 20:48:040248デフォルトの名無しさん
2007/06/02(土) 20:50:210249デフォルトの名無しさん
2007/06/02(土) 22:57:00納期間近の夜中に泣きながら原因を探し回ってようやく気が付くんだからほうっといてあげようよ
0250・∀・)っ-○◎●
2007/06/03(日) 00:05:22strcmpは一致するかしないかだけじゃなくて、違う場合は大小値
リトルエンディアンだと大小値が必ずしも一致しない
"hage と samaを32ビット
0251・∀・)っ-○◎●
2007/06/03(日) 00:09:30strcmpは、一致しない場合は正か負かの値でどっちが大きいかを表すように仕様で決まってる。
"hage" と "sama" を32ビット値として評価した場合
ビッグエンディアンでint32としてすると先頭が上位になるから後者のほうが大だから
strcmpの仕様通りになるが
リトルエンディアンだと先頭の方が下位になるから前者のほうが大
0252元組み込み屋
2007/06/03(日) 00:31:55それこそ環境に依存しているんじゃないの?
共用体でプログラムを組む場合、それこそ限られた環境で動かすからあんまり当てはまらない
0253デフォルトの名無しさん
2007/06/03(日) 10:15:54ソートする為の比較なら別だが
字句解析や、構文解析での比較なら、同じである事と一意に大小が比較できる事が要件なので
一意に決まるならどっちだろうと問題ないさ。
1バイトしか入力無い場合に他のバイトにゴミが入るような馬鹿な事をしていない限り
0254デフォルトの名無しさん
2007/06/03(日) 11:16:45共用体もビットフィールドもその他も・・・・
0255デフォルトの名無しさん
2007/06/04(月) 21:51:02ビットフィールドもMSBから設定されるもののあればLSBから設定されるのもあって混乱する。
複数の仕事を同時にするときは注意w
0256デフォルトの名無しさん
2007/06/04(月) 21:55:360257デフォルトの名無しさん
2007/06/04(月) 22:31:48共用体の時点で異なる型でアクセスする訳でしょ。
ハードウェア周りは、同じペリフェラルでもバス幅とエンディアンが同時に変わると
レジスタのビットアサイン変わるから面倒。
ifdefだらけになってもややこしくなるから結局共用体もビットフィールドも使えない。
ハード周りでこそ使えると便利なんだけどなぁ。
0258デフォルトの名無しさん
2007/06/04(月) 23:20:41まずはその発想を捨てれ。どこぞのスレでも話題になってたが、それは規格違反だ。
0259デフォルトの名無しさん
2007/06/04(月) 23:23:10そこでアセンブラが使えるわけだ。
0260デフォルトの名無しさん
2007/09/30(日) 17:02:130261デフォルトの名無しさん
2007/10/23(火) 08:03:24センズリに見えたよ
0262デフォルトの名無しさん
2007/10/24(水) 17:00:270263デフォルトの名無しさん
2007/10/24(水) 17:08:260264デフォルトの名無しさん
2007/10/24(水) 19:34:17ループでええやん。
0265デフォルトの名無しさん
2007/10/24(水) 19:43:220266デフォルトの名無しさん
2007/10/25(木) 06:27:180267デフォルトの名無しさん
2007/10/26(金) 16:14:330268デフォルトの名無しさん
2007/11/09(金) 14:44:33出来るはず
昔授業でハノイの塔を
再帰(再起じゃなくて再帰)で解くの作ったことがある
0269デフォルトの名無しさん
2007/11/09(金) 17:50:200270デフォルトの名無しさん
2007/11/09(金) 18:33:370271デフォルトの名無しさん
2007/11/10(土) 06:17:29静的な記憶を持つと破綻の元。
0272デフォルトの名無しさん
2007/11/10(土) 15:36:350273デフォルトの名無しさん
2007/11/11(日) 02:25:09スタックだって静的な記憶を動的に使う手法のことだし。
0274デフォルトの名無しさん
2007/11/11(日) 09:12:290275デフォルトの名無しさん
2007/12/31(月) 08:23:38void movedisk(uchar n, uchar a, uchar b, uchar c) {
if( n > 1 ) movedisk(n-1,a,c,b);
printf("move piece %d from %d to %d\r\n",n,a,b);
if( n > 1 ) movedisk(n-1,b,a,c);
}
void main(void) {
uchar n;
printf("枚数は? "); scanf("%d",&n);
movedisk(n,1,2,3);
}
0276デフォルトの名無しさん
2007/12/31(月) 08:24:20%5 "hanoi.c"
movedisk_:
PUSH B
%6
PUSH D
PUSH PSW
CPI 1+1
JC __2
LXI H,4
DAD SP
MOV L,M
PUSH H
DCR A
LXI H,10
DAD SP
MOV C,M
CALL movedisk_
POP B
__2:
0277デフォルトの名無しさん
2007/12/31(月) 08:25:18POP PSW
POP D
PUSH D
PUSH PSW
LXI H,4
DAD SP
MOV L,M
MVI H,0
PUSH H
MOV L,E
MVI H,0
PUSH H
MOV L,A
MVI H,0
PUSH H
LXI H,Z7
PUSH H
CALL printf_
POP B
POP B
POP B
POP B
0278デフォルトの名無しさん
2007/12/31(月) 08:26:01POP PSW
POP D
CPI 1+1
JC __3
LXI H,4
DAD SP
MOV L,M
PUSH H
MOV C,E
DCR A
LXI H,2
DAD SP
MOV E,M
CALL movedisk_
POP B
__3:
0279デフォルトの名無しさん
2007/12/31(月) 08:28:10POP B
RET
Z7: DB "move piece %d from %d to %d",0Dh,0Ah,0
0280デフォルトの名無しさん
2008/01/01(火) 03:26:56PUSH B
%12
LXI H,Z11
PUSH H
CALL printf_
POP B
LXI H,0
DAD SP
PUSH H
LXI H,Z12
PUSH H
CALL scanf_
POP B
POP B
0281デフォルトの名無しさん
2008/01/01(火) 03:30:02MVI L,3
PUSH H
MVI C,2
MVI E,1
LXI H,2
DAD SP
MOV A,M
CALL movedisk_
POP B
%14
POP B
RET
Z11: DB "枚数は? ",0
Z12: DB "%d",0
0282デフォルトの名無しさん
2008/01/01(火) 03:34:16あと、printf_とscanf_のEXTRN宣言が足りないぐらいかな。
movediskのパラメータをucharにしたのは、intだと8085では重いから。
わりと素直なASMコードになってるとおもう。今度85の仕事やるとき仕込んで動かしてみよう。
0283デフォルトの名無しさん
2008/01/01(火) 05:11:13printf("move piece %d from %d to %d\r\n",n,a,c); ・・・(最後がc)でした。
0284デフォルトの名無しさん
2008/02/24(日) 17:30:06バイナリからそのようなはどのようにすればわかりますか?
0285デフォルトの名無しさん
2008/02/24(日) 18:05:240286デフォルトの名無しさん
2008/02/25(月) 04:54:1300 NOP
01FFFF LXI b,65535
02 STAX B
03 INX B
・・・(略)全ての8085の命令をアセンブルして、左端の欄でsortすればこの表が得られます。
FD DB 0FDH ; JX5 addr
FE80 CPI 128
FF RST 7
バイナリの、どこか開始点が判れば、そこからバイト毎にこの表を引いて、命令後に直せます。
0287デフォルトの名無しさん
2008/02/25(月) 07:22:36呼び出し回数の話してるけど、
一箇所のループで複数の関数を呼び出している場合、
同じ関数を繰り返し呼び出すようにするだけでキャッシュ効率が上がり、10倍くらい早くなる。
一つ一つの命令ロジックよりもキャッシュ効率のほうがよっぽど大事。
>>152
64ビットの精度が必要ならコンパイラだろうがアセンブラだろうがまったく同じ。
精度を落とした場合もまったく同じ。
違うとか言ってるやつは書き方を知らないだけ。
0288デフォルトの名無しさん
2008/04/27(日) 20:06:030289デフォルトの名無しさん
2008/07/19(土) 09:50:44仕事だったら可読性や生産性や移植性の問題があるからアセンブラは避けるなあ
高速化が必要になっても大抵はアルゴリズムとコードの改良で対応できるし
0290デフォルトの名無しさん
2008/07/19(土) 10:50:000291デフォルトの名無しさん
2009/01/18(日) 08:26:170292デフォルトの名無しさん
2009/03/05(木) 15:57:24アセンブラの感覚でアドレスに座標の4倍を加算したつもりが
16倍を加算してしまったり。
0293デフォルトの名無しさん
2009/03/05(木) 18:29:090294デフォルトの名無しさん
2009/03/06(金) 04:14:48intptr_tで計算する。
0295デフォルトの名無しさん
2009/06/19(金) 22:35:59独習アセンブラとか色々参考書は読みましたが、なんか起動できないです
当方プログラムに関してあまり知識はありません
0296デフォルトの名無しさん
2009/06/20(土) 15:14:230297デフォルトの名無しさん
2009/06/20(土) 15:20:08アセンブラをダウンロードしてインストールすればいい。
0298デフォルトの名無しさん
2009/06/20(土) 16:35:06PC初心者板にでも行けよ
0299デフォルトの名無しさん
2009/06/21(日) 13:09:16それを「いう」なら,だろ?
0300デフォルトの名無しさん
2009/06/21(日) 13:45:09古くは「いふ」「ゆふ」の両方の表記が見られた。
何で日本人が「いう」と書かないといけないと思い込んでるかというと、
「現代仮名遣い」によって「『言う』は常に『いう』と書け」と例外規定されているからだが、
日本語は日本国だけで使用される言語でもないので、
日本語を使用するにあたって、日本政府の決めた表記法に必ずしも従う必要はない。
0301デフォルトの名無しさん
2009/06/21(日) 13:46:120302デフォルトの名無しさん
2009/06/21(日) 13:47:570303デフォルトの名無しさん
2009/06/21(日) 15:25:00日本語が公用語の国って日本以外にあるの?
なにゆってんの?w
0304デフォルトの名無しさん
2009/06/22(月) 09:37:11日本国内であっても従う義務がないのは確かだな。
0305デフォルトの名無しさん
2009/06/22(月) 10:53:33義務って何?w
0306デフォルトの名無しさん
2009/06/22(月) 11:34:5370年ばかり時間を遡ればさにあらず
アルアルヨ〜
0307デフォルトの名無しさん
2009/06/22(月) 12:07:03義務も知らんのか。伊達に草生やしてないな。
0308デフォルトの名無しさん
2009/06/22(月) 12:56:58何で「義務」なんて言葉を使ってるのかきいてるんだよ。
俺は「いう」で習ったしそれが一般的だと思ったから指摘したまで。
従う必要があるとかないとかそんな話始めから誰もしてないっつーの。
「ゆう」がいいなら勝手に使ってなw
0309デフォルトの名無しさん
2009/06/22(月) 14:13:50俺は >>303 のオナニー解釈を揶揄しただけなんだが。
>俺は「いう」で習ったしそれが一般的だと思ったから指摘したまで。
>>303 がその「指摘」なの?
0310デフォルトの名無しさん
2009/06/22(月) 18:00:200311デフォルトの名無しさん
2009/06/22(月) 18:12:250312デフォルトの名無しさん
2009/06/22(月) 18:39:51いや、標準的な発音(もちろんこれも勝手に決められたものだが)でわ、「言う」は終止形と連体形の時に「ゆう」となるが、
未然形では「いわ」と発音するのが正しいとされているので、俺は「ゆわない」とわ書かない。
しかし仮に「言わない」お「ゆわない」と発音する人がいれば「ゆわない」と書いてもいいと思う。
0313デフォルトの名無しさん
2009/06/22(月) 18:54:11つまりあんたは、「お」と「を」の発音を区別できないわけだ。
0314デフォルトの名無しさん
2009/06/22(月) 19:02:540315デフォルトの名無しさん
2009/06/22(月) 19:05:410316デフォルトの名無しさん
2009/06/22(月) 19:38:540317>>299,303,305,308
2009/06/22(月) 20:11:46すまんが>>303は失言だった。すまん。取り消させてくれ。
> >>303 がその「指摘」なの?
いや,>>299のことだ。
「ゆう」もありってのは勉強になったよ。ありがとな。
ここまでにする。
0318デフォルトの名無しさん
2009/06/22(月) 20:29:21何が文言一致論者だ
ただの文盲じゃん
0319デフォルトの名無しさん
2009/06/23(火) 14:28:56両者違う場合があるのですが、何故ですか?
0320デフォルトの名無しさん
2009/06/23(火) 14:32:12たとえば、ソースorデスティネーションがAXの場合の専用のコードがあって
それを使うか使わないかとか。
0321デフォルトの名無しさん
2009/06/23(火) 14:49:45レスありがとうございます。
それについて詳しく載っているサイトや書籍等がありましたら教えていただきたいのですが、
0322デフォルトの名無しさん
2009/06/23(火) 20:41:14皆さんと対等に話せるレベルになりたい
0323デフォルトの名無しさん
2009/06/23(火) 21:17:040324デフォルトの名無しさん
2009/06/23(火) 22:02:350325デフォルトの名無しさん
2009/06/23(火) 22:09:56ここの掲示板って知ったかぶりでメーカーの商品の批判ばっかりしてる奴ばっかりだね。
どうせ文句言いながらも使ってるくせに。メーカーさんの苦労もかんがえろ。そんなに
そんなに嫌ならOSもパーツも自分で作れ。どうせお前らには出来ないが。今大学院で
OSの研究をしているが、純粋にみんな凄いって感心している。オタクの集まりっていうのは
ほんまウザいねん。お前らに電子工学の知識があるのか?情報科学を学んだことがあるのか?
お前らまともに勉強してから文句言え。
0326デフォルトの名無しさん
2009/06/23(火) 22:22:59理由を聞かせてください。
0327デフォルトの名無しさん
2009/06/23(火) 22:36:13そりゃ、日本語じゃろくな情報ないってことだろ。
0328デフォルトの名無しさん
2009/06/23(火) 23:31:00昔のCPUは簡単だったが、今じゃ命令の実行時間の予測が難しいんで、適当に力任せで俺は書いている。
0329デフォルトの名無しさん
2009/06/24(水) 01:35:33NASMを使うのとVSがはくアセンブリを見ながら勉強
どちらを先にすればいいと考えますか?
0330デフォルトの名無しさん
2009/06/24(水) 02:28:090331デフォルトの名無しさん
2009/06/24(水) 02:43:45基礎を知らずにやるなんて恐ろしいです
0332デフォルトの名無しさん
2009/06/24(水) 05:19:10アセンブリレベルの最適化を学ぶということは、CPUアーキテクチャを学ぶこととほぼ同義。
インテルのサイトからマニュアル落としてこいよ。
>>319のような質問をするってことは、「80386/80486プログラミングガイド」辺りを読んで
より造詣を深めたほうがほうがいいかもしれない。最適化の話は全く出てこないが。
その後はせいぜいSIMD命令くらいだし。
0333デフォルトの名無しさん
2009/06/24(水) 13:56:57書籍を買ってみます。
0334デフォルトの名無しさん
2009/06/24(水) 17:15:46はじめて読む486ではいけませんか?
絶版になっていたので、
0335デフォルトの名無しさん
2009/06/24(水) 17:43:480336デフォルトの名無しさん
2009/06/24(水) 17:54:35わかりました。ではやはり買ったほうがいいということですね。
詳しく探してみます。
0337デフォルトの名無しさん
2009/06/24(水) 18:54:53http://www.amazon.co.jp/dp/4874085881
最適化テクニックはこれで学んだ
http://www.amazon.co.jp/dp/4756107974
最近のSSEはIntelのPDFで確認している。
自分でコードを組んでのSSEの最適化関係はWeb上でもあまり見かけんね。
0338デフォルトの名無しさん
2009/06/25(木) 14:23:08基本的なマシン語やアセンブラを知ってる人を対象として、
プロテクトモードを活用する話がメインになっているので、
ちょっと特殊。
はじめて読むPentiumならおk。
0339デフォルトの名無しさん
2009/07/04(土) 07:53:11プラグイン作者なんかに詳しい人間がごろごろいる。
0340デフォルトの名無しさん
2009/07/08(水) 14:02:070341デフォルトの名無しさん
2009/07/09(木) 22:07:240342デフォルトの名無しさん
2009/07/14(火) 19:20:47命令単位ではわかっても全体で何やってるのかわかりません。
定型文とかあるんですか。
0343デフォルトの名無しさん
2009/07/14(火) 19:32:14だけだと思うんだが。
逆アセンブルしたものを、どう解釈するか、なら色々知識とか必要かもだけど。
0344デフォルトの名無しさん
2009/07/14(火) 22:16:25ずれたまま逆アセンブル開始した場合
ずれたことに気付くためには何をすれば良いですか
0345デフォルトの名無しさん
2009/07/14(火) 22:24:07そしてスレ違いだから消えろ
0346デフォルトの名無しさん
2009/07/15(水) 00:23:33C/C++辺りを有る程度熟知した上で慣れる事。自分で書いたコードがどう変化するかを何度か見れば多少理解できる。
あるけど、コンパイラとコンパイラのバージョンとコンパイルオプションと前後の文脈に依存する。その辺の癖は慣れるしかない気がする。
>>344
プリフィックスが変だったりムダにLOCKとかの指定がついてたり、jmp先が命令の狭間になってないかで見る。
つっても逆アセンブラってわりとその辺間違えることは少ないようにも思うが。
>>345
こういう話好きなんで誘導お願いします。
0347デフォルトの名無しさん
2009/07/15(水) 00:55:48自分で自分を書き換えるタイプのプログラムだと
命令の狭間にjmpしててもおかしくはないような気もする
いまどきのCPUでも出来るのかどうかはしらないけど
0348デフォルトの名無しさん
2009/07/15(水) 03:56:14そゆのは例外でしょ。同じコードに複数の意味を持たせる場合も有るし、そういうガチガチに手を加えてある箇所は手で位置を指定しなおさないと。
広範囲の自己書き換えはパッカー(UPX等)とか耐タンパ手法とかで今でも使われてるから出来なくは無いかと思うけど、命令のキャッシュ機能はあるはず。
Win32APIにFlushInstructionCacheってのがあるけど、これはマルチプロセッサで命令キャッシュをクリアするモノらしい。
IFだけで実装無しってオチ・・・だったりしないよな?
0349デフォルトの名無しさん
2009/07/15(水) 04:30:530350デフォルトの名無しさん
2009/07/15(水) 11:24:05http://pc12.2ch.net/test/read.cgi/tech/1199952217/l50
0351デフォルトの名無しさん
2009/07/15(水) 16:21:37PC向けならLinkers & Loadersを読んだらどうか
組み込みのROMとかならターゲットマシンかそのCPUのアプリケーションマニュアルに指定があるはず
0352デフォルトの名無しさん
2009/07/15(水) 21:12:49そのまさかだったらしい。
ttp://blogs.msdn.com/oldnewthing/archive/2003/12/08/55954.aspx
call/retでのキャッシュクリアが目的だそうで。
0353デフォルトの名無しさん
2009/07/15(水) 22:49:150354デフォルトの名無しさん
2009/07/16(木) 00:05:04そのページの記事のコピー元の投稿日が分らないし、英語苦手なんで単語拾っただけだが、親投稿自体は98年以前の記事の様に見えるが・・・
VC++6.0付属のMSDN Libraryを参照すると
>This function is valid only on multiprocessor computers.
>この機能はマルチプロセッサコンピュータのみで有効です。
で
>Windows 95 and Windows 98: The FlushInstructionCache function always returns TRUE.
>Windows 95 and Windows 98 support only single-processor computers.
>Windows 95 and Windows 98:このFlushInstructionCache機能は常に非0を返します
>Windows 95 and Windows 98はシングルプロセッサコンピュータのみをサポートします。
とのことだから、"Win9xでダミー関数なのは"公式らしい。
コメントの方だと広域ジャンプでパイプラインハザードが起きてパイプラインが破棄されるとかその辺の話をしている・・・のか?
MSDNだとマルチプロセッサで有効(もしくは有効にする予定)の機能らしいが、コメントでマルチ〜に触れてる奴がいないしちょっとアテにならん気がする。
95年代のCPU事情だとマルチコアはPC用途では考慮もされずワークステーションのごく一部実装されたマルチプロセッサで走るNT系のみをターゲットにしたAPI設計なのだろうけれど、現代のHT/マルチコアではどう作用するのだろう?
>>353
retはアトミックにスタックのポップを実行すると思われる。
pop ecx
jmp ecx
とかだとアトミックに実行されることは保障されないし、レジスタも一個浪費する。
あと、解析系のプログラムはretを期待するはずなのでその辺の違い。
0355デフォルトの名無しさん
2009/07/16(木) 05:46:33だろうと見当はつくと思うんだが、先頭の実行開始点はどうやって見つけるんだろう。
0356デフォルトの名無しさん
2009/07/16(木) 06:16:33call xxxx を見つければいいんじゃね?
0357デフォルトの名無しさん
2009/07/16(木) 09:17:04キャッシュを共有していない場合は悲しいことになる。
まあ普通はkernelの方でフラッシュしてるはずなので、
アプリケーションが気にする必要はない。
0358デフォルトの名無しさん
2009/07/16(木) 17:11:06あーごめん、たしかに9xだけの話かも。
自分もきちんと読んだのはあのブログではなくて、書籍化されたほうの翻訳だし。すまん。
ttp://www.amazon.co.jp/dp/4756150004
0359デフォルトの名無しさん
2009/07/17(金) 03:18:56そういう実行開始点はどうやって識別すればいい?
スタックポインタへのロード命令のパターンを見つけるのかな?
0360デフォルトの名無しさん
2009/07/17(金) 04:48:370361デフォルトの名無しさん
2009/07/24(金) 17:02:00Windows XP上で実現するためにはどうすればいいですか?
0362デフォルトの名無しさん
2009/07/24(金) 18:02:370363デフォルトの名無しさん
2009/07/24(金) 18:04:14嘘だといってよ兄ちゃん
0364デフォルトの名無しさん
2009/07/24(金) 20:59:2616ビットアプリとして作ってWindows XP上で動かす。
ところで、なんでそんな苦行をするの?
0365デフォルトの名無しさん
2009/07/24(金) 21:07:31書籍に載っているソースコードだけを見て、それを理解したとは言えません。
小学校の理科の教科書に載っている実験結果を見て、その実験について
本当に理解した、といえるのか・・・
そういう点から私は、・・・はい
0366デフォルトの名無しさん
2009/07/24(金) 21:38:05HDD壊すようになって一人前
0367デフォルトの名無しさん
2009/07/24(金) 21:45:14現にSSE書きまくりのプロの俺だが、セグメントを使用したアクセスは扱った事がない。
x86アセンブラなんてコンパイルとリンクの仕方覚えれば十分。
0368デフォルトの名無しさん
2009/07/24(金) 21:49:41では、最後に団子さんの考えを聞いて質問を終える事にします。団子さんは・・・
どう思われますか
0369デフォルトの名無しさん
2009/07/24(金) 22:19:090370デフォルトの名無しさん
2009/07/25(土) 12:47:592011年からもっと酷くなりますよ
ですが、、ここでとやかく言っても仕方がないですよ
0371デフォルトの名無しさん
2009/07/25(土) 12:55:37全くだな。今時x86の16ビットコードを書くとか無駄もいいところ。
OSのローダーを書きたいなら別だが、セグメントなんて糞。
0372デフォルトの名無しさん
2009/07/25(土) 20:10:01kwsk
0373デフォルトの名無しさん
2009/08/09(日) 00:52:160374デフォルトの名無しさん
2009/09/27(日) 05:20:150375デフォルトの名無しさん
2009/09/28(月) 12:35:40{
return a + 1.0;
}
をアセンブラで書くとどうなる?
0376デフォルトの名無しさん
2009/09/28(月) 12:44:03f load [paras]0, reg0
add1 reg0
store reg0, [rets]0
ret
end f
だな。
0377デフォルトの名無しさん
2009/09/28(月) 12:54:25cc -S してみれば?
0378デフォルトの名無しさん
2009/09/28(月) 13:52:14.globl __Z10myfunctiond
.def __Z10myfunctiond; .scl 2; .type 32; .endef
__Z10myfunctiond:
pushl %ebp
movl %esp, %ebp
fldl 8(%ebp)
fld1
faddp %st, %st(1)
popl %ebp
ret
やっぱりわけわからん
0379デフォルトの名無しさん
2009/09/28(月) 14:05:37命令のリファレンスマニュアル見れば、わからないことなんでないだろう。
0380デフォルトの名無しさん
2009/09/28(月) 14:25:33せめて、自分が使っているCPUが何で、どんなコンパイラでアセンブリ出力したのか位は書こうぜ。
つーか、>378でわけわからんのなら何やってもわからんだろ。
0381デフォルトの名無しさん
2009/09/28(月) 16:46:13俺のはクロスコンパイラだから、ソフトの加算ルーチン呼び出しがコンパイルされる。
0382デフォルトの名無しさん
2009/09/28(月) 20:51:03f proc r:real8
fld r
fadd dConst
ret
f endp
やっとわけわかったわ
0383デフォルトの名無しさん
2009/10/09(金) 12:00:45とあるのですが、
DS及びESセグメントがどうして出てくるのかがわかりません。ESIもEDIも32bitのレジスタであるのですから、
セグメント機構を使う必要はないだろう、と私は考えたのですが、、、
0384デフォルトの名無しさん
2009/10/09(金) 12:54:33http://thebbl.hideyosi.com/material/84.html
0385デフォルトの名無しさん
2009/10/09(金) 12:56:290386デフォルトの名無しさん
2009/10/09(金) 13:09:050387デフォルトの名無しさん
2009/10/14(水) 21:08:570388デフォルトの名無しさん
2009/10/14(水) 21:15:470389デフォルトの名無しさん
2009/10/14(水) 21:28:04どうしてそのような仕様になったのですか?
そうする必要性がどこにあったのですか?
0390デフォルトの名無しさん
2009/10/14(水) 21:55:41AXがオペランドになる場合専用の短縮形命令コードとか、
そういう非対称な設計があちこちにある。
どうしてとか必要性とかじゃなくて、そういうものとして設計されてる。
0391デフォルトの名無しさん
2009/10/14(水) 22:09:40レジスタ決めうちして専用回路を作れば
その他のレジスタを無視できるからセレクタと結線が少なくなる。
0392デフォルトの名無しさん
2009/10/14(水) 22:44:140393デフォルトの名無しさん
2009/10/14(水) 22:52:50その分だけ命令の数が増えるわけで
命令が増えた分だけプログラムが大きくなるわけで。
0394デフォルトの名無しさん
2009/10/14(水) 22:55:33セグメントを意識しないで済む
0395デフォルトの名無しさん
2009/10/14(水) 23:41:12セグメント機構に関して私はもう一つ気になることがあります。
1MBのメモリにアクセスすることの出来るリアルモード時のセグメント機構について、
16bitのレジスタでは2^16=64kb, アドレスバスが20bitで2^20=1024kb
例えば、セグメントレジスタ群にコードセグメントというプログラムコードを格納する用途に使うものがありますが、
このコードセグメントレジスタに基点位置を設定し、オフセットアドレスを使ったところで基点位置から64kbまでの範囲しか利用できず
もし実行したいプログラムが64kbyte以上であれば、それは実行出来ないものです。
これでは1MBという膨大なメモリを最大限に使う事が出来ていないように思われます。
1MBという膨大なメモリをリアルモード時では、どのようにして利用していたのでしょうか?
0396デフォルトの名無しさん
2009/10/14(水) 23:53:37頭大丈夫?
0397デフォルトの名無しさん
2009/10/14(水) 23:58:05(2) 高級言語でFARモデルとかHUGEモデルを使う
(3) あきらめて68000に乗り換える
0398デフォルトの名無しさん
2009/10/15(木) 00:03:5400000--------------------コードセグメントプギャー
00100far jumpで00600ぷぎゃーすおぎゃ
00102--------------------データセグメントバロッシュ
00600,追加のプログラムコード
という具合でしょうか?
0399デフォルトの名無しさん
2009/10/15(木) 00:11:490400デフォルトの名無しさん
2009/10/15(木) 00:26:18普通はサブルーチン毎に適当にセグメント割り当てて、
それをfar callしてた。
一個の塊が64K越えることなんてないし。
というか64Kに収まらんコードをx86アセンブラで書く気力はないので、
コンパイラとリンカに全部お任せ。
どっちかってえと64K越えデータを扱う方がめんどかった。
farはセグメント自分で管理するのがめんどいし、
hugeはいちいち正規化するからおせえし。
で、今時こんな化石な知識は必要なのか?
0401デフォルトの名無しさん
2009/10/15(木) 00:38:150402デフォルトの名無しさん
2009/10/15(木) 00:46:071Mって広大だよ。
0403デフォルトの名無しさん
2009/10/15(木) 00:52:33farポインタをつかう。farポインタはセグメントとオフセットをセットにして扱うポインタ。
メモリモデルによって、1つの配列の大きさが64kバイト以下に制限されるものと、64kを超えられるものがある。
0404デフォルトの名無しさん
2009/10/15(木) 01:24:33DJNZ
0405デフォルトの名無しさん
2009/10/15(木) 08:58:57LSIのマスクパターンのデザインのことを言ってるんだよ。
8086のころはCADがどばーっと配置してくれるとかそういう時代じゃないから。
0406デフォルトの名無しさん
2009/10/15(木) 18:48:00どこの古い情報をコピペしたの?
0407デフォルトの名無しさん
2009/10/15(木) 18:50:310408デフォルトの名無しさん
2009/10/15(木) 20:25:340409デフォルトの名無しさん
2009/10/15(木) 20:44:460410デフォルトの名無しさん
2009/10/15(木) 22:03:15SRAM 32kb (8000-FFFF)
set sp
copy BIOS to (8000-)
jump to 8000
and switch ROM to SRAM 32kb (0000-7FFF)
write vector (0000, 0066) and system call for CP/M (0003)
0411デフォルトの名無しさん
2009/10/15(木) 22:16:100412デフォルトの七誌さん
2009/10/16(金) 09:51:05(1)プログラムの実行終了直後の記号番地HOGEの内容を10進符号付き整数で表すとどうなるのか
(2)EX03Qの実行終了直後の記号番地Xの内容を10進符号付き整数で表すとどうなるのか
(3)EX03Qの実行終了直後の記号番地FUGAの内容を10進符号付き整数で表すとどうなるのか
(4)EX03Qの実行終了直後の記号番地HENAの内容を10進符号付き整数で表すとどうなるのか
助けてください・・・
0413デフォルトの名無しさん
2009/10/16(金) 10:01:08アセンブラの質問はアセンブラ質問スレへ、
アセンブラの宿題はアセンブラ宿題スレへ。
って、両方とも落ちているのか。ご愁傷様。
0414デフォルトの名無しさん
2009/10/16(金) 10:04:29でもまぁ、その程度の課題でしかもなんのアセンブラかも書かないようじゃ相手にされないだろうけどね。
0415デフォルトの名無しさん
2009/10/16(金) 10:06:05特に難しい部分があるわけでもないのに。
0416デフォルトの名無しさん
2009/10/16(金) 10:22:200417デフォルトの名無しさん
2009/10/16(金) 11:24:21これで分かるならぴゅうた買ってきた方がいい
EX03Q 開始
読む GR3 に X の内容を
読む GR1 に ONE の内容を
足す GR1 に GR1 を
足す GR3 に GR1 を
書く GR3 の内容を HOGE に
引く GR1 から GR1 を
書く GR1 の内容を HENA に
書く GR3 の内容を FUGA に
戻る
X はドリームキャスト 119
ONE はドリームキャスト 2
HOGE はドリームキャスト 123
FUGA はドリームキャスト 1
HENA はドリームキャスト 1
終わる
0418デフォルトの名無しさん
2009/10/16(金) 11:25:58FUGA はニンテンドーDS 1
HENA はニンテンドーDS 1
0419落ちにも何にもなりゃしない
2009/10/16(金) 11:26:38FUGAとHENEはドリキャスじゃなくてDSだぞ。
0420デフォルトの名無しさん
2009/10/16(金) 11:27:240421デフォルトの名無しさん
2009/10/16(金) 11:36:23指摘サンクス
あやうくぴゅう太が落ちるところだったぜ
0422デフォルトの名無しさん
2009/10/16(金) 19:58:19お前らPGだろ?
0423デフォルトの名無しさん
2009/10/16(金) 20:01:400424デフォルトの名無しさん
2009/10/16(金) 22:00:070425デフォルトの名無しさん
2009/10/17(土) 03:31:27思い出したくねえなw
アセンブラ自体もう忘れたほうがいいような気もするんだが、
なぜか縁が切れないというか、なまじ知っているから使ってしまうんだよね。
コードインジェクション用にリモートプロセスに埋め込む関数を書いたりとか。
C#でバイナリコードを実行する方法を思いついちゃったりとか。
0426デフォルトの名無しさん
2009/10/17(土) 10:58:17この場合コードセグメントの内容はどうなるのですか?
0x07c0、もしくは0?
0427デフォルトの名無しさん
2009/10/17(土) 11:06:470428デフォルトの名無しさん
2009/10/17(土) 23:05:34難しいですが、かなり充実した生活を送る事が出来ています。
0429デフォルトの名無しさん
2009/10/18(日) 00:02:300430デフォルトの名無しさん
2009/10/18(日) 00:07:020431デフォルトの名無しさん
2009/10/18(日) 01:20:510432デフォルトの名無しさん
2009/10/18(日) 07:40:46すまない
コンパイルはLinux上、as86及びgccを使用しています
0433デフォルトの名無しさん
2009/10/18(日) 10:37:13リファレンスマニュアル見ると確実。
0434デフォルトの名無しさん
2009/10/18(日) 12:32:420435デフォルトの名無しさん
2009/10/18(日) 12:38:350436デフォルトの名無しさん
2009/10/18(日) 13:26:39つまり、ただのfarジャンプ。
0437デフォルトの名無しさん
2009/10/18(日) 16:46:21メーカーがタダで配ってるマニュアルくらい持っとけよ。jmpiなんて載ってないけど。
as86の独自記法?
http://download.intel.com/jp/developer/jpdoc/IA32_Arh_Dev_Man_Vol2A_i.pdf
http://download.intel.com/jp/developer/jpdoc/IA32_Arh_Dev_Man_Vol2B_i.pdf
0438デフォルトの名無しさん
2009/10/18(日) 17:22:05Linuxブートアップソースコードの解析っていうPDFに書いてある
リアルモードからプロテクトモードへ以降した直後の命令は、JMP命令でなければなりません。
このプロテクトモードでの最初のJMP命令は次のようにして作られます。
> db 0x66 ; オペランドのサイズリフィクス
> db 0xEA ; これはjmpiのコード
> dw 0x1000 ; プログラムの最初の番地のオフセット
> dw 0x10 ; コードセレクタ
これは「jmpi 0x1000:0x10」と同じです。このコードを実行すると、
コードセレクタ0x10で示すGDTのベースアドレスに0x1000を加えたアドレスの命令から実行が始まります。
0439デフォルトの名無しさん
2009/10/18(日) 21:49:080440デフォルトの名無しさん
2009/10/18(日) 23:11:11どんだけ機械語脳なんだよ
0441デフォルトの名無しさん
2009/10/19(月) 05:48:030442デフォルトの名無しさん
2009/10/19(月) 14:51:11逆汗したコードをアセンブルしても、同じバイナリにならないことがあったよ。
0443デフォルトの名無しさん
2009/10/19(月) 15:16:460444デフォルトの名無しさん
2009/10/19(月) 18:20:050445デフォルトの名無しさん
2009/10/19(月) 18:33:54『IA-32 インテル(R) アーキテクチャー・ソフトウェア・デベロッパーズ・マニュアル、下巻: システム・プログラミング・ガイド』 の5章
http://www.intel.co.jp/jp/download/index.htm#ia32
0446デフォルトの名無しさん
2009/10/19(月) 18:50:20ありがとうございます。
0447デフォルトの名無しさん
2009/10/20(火) 15:43:25わかりやすく解説されているWebサイト等ありましたらお教えください。
0448デフォルトの名無しさん
2009/10/20(火) 15:45:230449デフォルトの名無しさん
2009/10/20(火) 17:36:01直感的に捉えたいと考えております、図とかモリモリの...
0450デフォルトの名無しさん
2009/10/20(火) 18:05:280451デフォルトの名無しさん
2009/10/20(火) 18:36:33ページングの図がたくさん出てくるが・・・果たして直観で理解できるものかどうか?
0452デフォルトの名無しさん
2009/10/20(火) 19:05:03mov ax, [0100]論理アドレス?
↓
アドレス変換回路は、
「セグメントレジスタに格納されたセレクタ値と対になっているセグメントベース値を取り出す」
「そしてオフセットアドレス0100を加算してリニアアドレスを算出する」
↓
ページテーブルを参照して実際の物理アドレスを計算
という具合でしょうか?
リニアアドレスってのがいまいちなんだかわかりません。
0453デフォルトの名無しさん
2009/10/20(火) 19:14:59アドレス空間全体が00000000〜FFFFFFFFで線形に番地付けされた、セグメント化されていないフラットな様子を表している
0454デフォルトの名無しさん
2009/10/20(火) 19:33:11ということですか?
0455デフォルトの名無しさん
2009/10/20(火) 19:53:32ページングはオフに出来るようですが、オフにする状況といえばどんな場合がありますか?
0456デフォルトの名無しさん
2009/10/20(火) 19:57:18物理アドレスか仮想アドレスか、物理メモリをどれだけ搭載しているか、等は関係がない
今現在実際に使用中でないアドレス値の範囲を指して、空いているアドレス空間などと呼ぶが、
物理アドレス空間が空いてるなら、そこに新しいハードウェアとのI/Oをマップする余地があるかもしれないし、
仮想アドレス空間が空いてるなら、OSに要求してそこにページを割り当ててもらえるかもしれない
0457デフォルトの名無しさん
2009/10/20(火) 20:02:07ページテーブルがまだ準備されていないので
0458デフォルトの名無しさん
2009/10/20(火) 20:18:08こんがらがってしまいました、リニアアドレスっていうのは仮想アドレスと同じ意味ですか?
0459デフォルトの名無しさん
2009/10/20(火) 20:28:400460デフォルトの名無しさん
2009/10/20(火) 20:30:47ええ、調べた上で聞いています。
ITPRO : -仮想アドレス空間は,プロセスごとに割り当てられた論理的なメモリー領域です。これは,連続したアドレスで示された領域であり,リニア・アドレス空間とも呼ばれます。
0461デフォルトの名無しさん
2009/10/20(火) 20:41:020462デフォルトの名無しさん
2009/10/20(火) 20:45:28ごめwわからないw
0463デフォルトの名無しさん
2009/10/20(火) 20:55:10僕がmov ax, [100]
↓
アドレス変換回路
↓
変換されるアドレスは全部連番に対応出来るぜ(リニアアドレス)
連番ってのがキーポイント?
0464デフォルトの名無しさん
2009/10/20(火) 21:09:370465デフォルトの名無しさん
2009/10/20(火) 21:13:53物理アドレス→アドレスバス上でプロセッサが指定出来るアドレス空間
であっていますか?
0466デフォルトの名無しさん
2009/10/20(火) 21:20:00例えばアプリ側からだとリニアにアドレスが見える
リニアにアドレス
リニアアドレス、のような感じでしょうか?
まぁまぁん〜かすかにわかるような感じが...
0467デフォルトの名無しさん
2009/10/20(火) 21:32:191. -同一セグメント内ジャンプ→nearジャンプ
2. -セグメント化さてていないアドレス空間
3. -アプリケーションから見たらリニアなアドレス
リニアアドレスふひひwwwという具合でしょうか?
0468デフォルトの名無しさん
2009/10/20(火) 21:52:09物理アドレス=プログラマの知ったことか
ドライバやカーネルをいじる人はまた別よ。
0469デフォルトの名無しさん
2009/10/20(火) 22:03:32カーネルレベルで教えてください。
0470デフォルトの名無しさん
2009/10/20(火) 22:14:541. -セグメントオフセットがそのままnearジャンプ出来る(リニアアドレッシング?)
2. -セグメント化されていないアドレス空間
3. -アプリケーションから見たらリニアなアドレス
>>468
仮想アドレスとリニアアドレスというのは
仮想とリニアって単語の意味が違うように、なんていうか違うんだよ、という感じですか?
0471デフォルトの名無しさん
2009/10/20(火) 22:22:54物理アドレス - CPUからアドレスバスから実際に出力されるアドレス
仮想アドレス空間 - ページングと仮想メモリが有効な時の論理アドレス空間
リニアアドレス空間 - ページングが有効な時の論理アドレス空間
であっていますか?
0472デフォルトの名無しさん
2009/10/20(火) 22:22:58(セグメントまたはセレクタ) + オフセットで得られるアドレスがリニアアドレス。
ページング使っていないときは、リニアアドレスがそのまま物理アドレスとして扱われる。
ページングを使う場合、リニアアドレスから物理アドレスへの変換が行われる。
IntelのPDFにも書いてあるでしょ。
0473デフォルトの名無しさん
2009/10/20(火) 22:27:03ページングが非有効なとき 論理アドレス空間=物理アドレス空間
ページングが有効なとき 論理アドレス空間≠物理アドレス空間
ありがとうございます。今からIntelのPDFを見てきます。
0474デフォルトの名無しさん
2009/10/20(火) 22:38:23仮想アドレスのほうが一般的な言葉だけど、
IntelのPDFではリニアアドレスのほうをよく用いていたと思う。
セグメント・セレクタとオフセットのほうも見方によっては仮想アドレスであると言えるので、
x86固有の低水準な話をするときなどは、リニアアドレスの言葉を用いることが多い気がする。
0475デフォルトの名無しさん
2009/10/21(水) 03:30:49#define MOVHD _asm_c("\n\tMOV\tA,M\n\tINX\tH\n\tSTAX\tD\n\tINX\tD\n")
typedef void (*const t_parm2)(char*,char*);/* strcommaの最初のcall型*/
void strcomma(void) { /* 入出力:HL,DE = ソース、デスティネーションのポインタ */
do{ } while( (MOVHD)!=',' );
_asm_c("\n\tXRA\tA\n\tSTAX\tD\t; (DE)<--0\n");/*%sのトレーラchar*/
}
呼び出し側:
((t_parm2)strcomma(srcparm(buf+3,2),wk+7); /* src,dstのポインタ */
strcomma();
strcomma();
strcomma();
strcat(wk,"\r\n");コンマで区切られたパラメータを順に移動できてASM効率のコードが出た
strcomma(char*src, char*dst) { みたいにc文法の関数書くと、移動コードの4倍ぐらい
ポインタ変数の演算が出て、鬱陶しいし、重たいし。3Mの8085使ってるとこんな小技が効く(w
0476デフォルトの名無しさん
2009/10/21(水) 13:57:020477デフォルトの名無しさん
2009/10/21(水) 14:10:380478デフォルトの名無しさん
2009/10/21(水) 14:51:400479デフォルトの名無しさん
2009/10/21(水) 15:37:490480デフォルトの名無しさん
2009/10/21(水) 20:06:010481デフォルトの名無しさん
2009/10/21(水) 20:10:020482デフォルトの名無しさん
2009/10/21(水) 20:15:25同じ命令セットでも色々なアーキテクチャのCPUがあるのだが
0483デフォルトの名無しさん
2009/10/21(水) 20:59:440484デフォルトの名無しさん
2009/10/21(水) 22:38:35no
0485デフォルトの名無しさん
2009/10/21(水) 22:40:39俺はMSDN会員だから既に入れてるが結構優秀で
不備はほぼ見られないからお勧めするよ
操作は慣れるまでちょっとかかるだろうけどVistaユーザなら
すんなりいけるレベルじゃないかな
このスレでVistaがメインPCのやつがいるかはわからないが。。
0486デフォルトの名無しさん
2009/10/22(木) 00:34:120487デフォルトの名無しさん
2009/10/22(木) 01:04:09CPU機能みて既存のOSで扱える?
それとも特別なコードがいるのかなっと。
ふと新OSじゃないと扱えないのかな〜っと思った。
0488デフォルトの名無しさん
2009/10/22(木) 06:17:22相変わらず MOV EDI,EDI は健在だな。
0489デフォルトの名無しさん
2009/10/22(木) 12:16:01Windowsに注目する時代ではなくなった
0490デフォルトの名無しさん
2009/10/22(木) 14:11:17とか言う奴が何年も前からいるわけだが。
0491デフォルトの名無しさん
2009/10/22(木) 17:54:480492デフォルトの名無しさん
2009/10/22(木) 20:28:53jne 1fの違いがわかりませんお。
0493デフォルトの名無しさん
2009/10/22(木) 20:37:47?
ジャンプ先の違いじゃないの?
0494デフォルトの名無しさん
2009/10/22(木) 22:17:38アセンブリのソースコードのほうで、
int_4096: /* 0x0000番地 */
org 0x1000
C言語のソースコードのほうで、
extern long intvel[1024];と宣言されているのですが、
こういう使い方って珍しいですか?
0495デフォルトの名無しさん
2009/10/22(木) 22:22:49アセンブリのソースコードのほうで、
int_4096: /* 0x0000番地 */
org 0x1000
C言語のソースコードのほうで、
extern long int_4016[1024];と宣言されているのですが、
..すみません、間違えました。。
0496デフォルトの名無しさん
2009/10/22(木) 22:45:370497デフォルトの名無しさん
2009/10/22(木) 23:00:39すみません、正直に言います。
linux0.01のソースコードを今読んでいまして、
head.s内にて
.code32
.text
.globl idt,gdt,pg_dir,startup_32
pg_dir:
startup_32:
hlt // ここから処理が色々と、
head.h(0x0000000000000000)にて、
extern long pg_dir[1024];
としてpg_dirがC言語ソースコード中にて利用されているのです。
0498デフォルトの名無しさん
2009/10/23(金) 04:16:560499デフォルトの名無しさん
2009/10/23(金) 12:06:080500デフォルトの名無しさん
2009/10/23(金) 12:08:170501デフォルトの名無しさん
2009/10/23(金) 12:22:58ありがとうございます。
0502デフォルトの名無しさん
2009/10/23(金) 14:44:03jmp 1f
1: jmp 1f
1:
jmp 1fのfとは一体何を表しているのでしょうか_?
0503デフォルトの名無しさん
2009/10/23(金) 15:02:200504デフォルトの名無しさん
2009/10/23(金) 15:02:401fを含むインストラクションがあるロケーションよりも前方(表示イメージだと下)にある最初に見つかったラベルの 1:
0505デフォルトの名無しさん
2009/10/23(金) 15:04:43てか、アセンブラ何? as86じゃないよね。
0506デフォルトの名無しさん
2009/10/23(金) 15:26:23なるほど、前方参照とは気づきませんでした。
0507デフォルトの名無しさん
2009/10/23(金) 18:58:10gasだべ
0508デフォルトの名無しさん
2009/10/23(金) 20:01:59#define _set_gate(gate_addr,type,dpl,addr) \
__asm__ ("movw %%dx,%%ax\n\t" \
"movw %0,%%dx\n\t" \
"movl %%eax,%1\n\t" \
"movl %%edx,%2" \
: \
: "i" ((short) (0x8000+(dpl<<13)+(type<<8))), \
"o" (*((char *) (gate_addr))), \
"o" (*(4+(char *) (gate_addr))), \
"d" ((char *) (addr)), \
"a" (0x00080000))
上記をgcc -S test.c、にて出力したアセンブリリスト及び、上記をコンパイルしてobjdump -d test.cでのアセンブリリストが違うのですが
どうしてですか?
0509デフォルトの名無しさん
2009/10/23(金) 20:53:19http://www.mars.sannet.ne.jp/sci10/on_gcc_asm.html#K_SS
ここだけではあまりわからなかったので、
0510デフォルトの名無しさん
2009/10/23(金) 21:48:360511デフォルトの名無しさん
2009/10/23(金) 23:28:46・・・
...
・・・
…
0512デフォルトの名無しさん
2009/10/23(金) 23:31:59答えられないなら黙ってなよ
0513デフォルトの名無しさん
2009/10/24(土) 00:09:300514デフォルトの名無しさん
2009/10/24(土) 00:46:35static int local;
int main(void)
{
int in=5, out;
// 256
__asm__("movl $0x100, %edx\n\t");
// 破壊レジスタにedxを設定
__asm__("movl $1, %%edx\n\t"
"incl %%edx\n\t"
"movl %%edx, %0\n\t"
:"=b" (out)
:"a" (in)
:"%edx"
);
// edx = 2になってしまう、期待していた値は256
__asm__("movl %edx, local\n\t");
printf("edx = %d", local);
return 0;
}
破壊レジスタにedxを指定したのですが、拡張インラインアセンブラ内で変化させた値がそのまま表示されてしまいます。
破壊レジスタとは、拡張インラインアセンブラ内にて、この場合edxに変な数値を入れても拡張インラインアセンブラの処理が終われば
元に戻っていうという事ではないのでしょうか?
0515デフォルトの名無しさん
2009/10/24(土) 01:28:240516デフォルトの名無しさん
2009/10/24(土) 01:46:410517デフォルトの名無しさん
2009/10/24(土) 09:28:58例をあげると、こう。
# ソース1
int in=1, out;
asm("movl %1, eax; incl %eax; movl eax, %0;" :"=r"(out) :"r"(in));
# 出力1
movl %eax, %eax
incl %eax
movl %eax, %eax
# ソース2
int in=1, out;
asm("movl %1, eax; incl %eax; movl eax, %0;" :"=r"(out) :"r"(in) :"%eax", "%ebx", "%ecx", "%edx", "%esi");
# 出力2
movl %edi, %eax
incl %eax
movl %eax, %edi
なお、全ての汎用レジスタを指定すると、
「冗談は顔だけにしとけよ。割り当てられるレジスタが無いじゃんか。」
とコンパイラが文句を言う。
0518デフォルトの名無しさん
2009/10/24(土) 10:30:50int main(void)
{
int in=1, out;
__asm__("movl %1, %%eax\n\t"
"incl %%eax\n\t"
" movl %%eax, %0\n\t"
:"=r"(out)
:"r"(in)
:"%eax", "%edi", "%ebx", "%ecx", "%edx", "%esi");
printf("in = %d, out = %d\n", in, out);
return 0;
}
破壊レジスタに指定されたeax,edi,ebx,ecx,edx,esiは、
出力オペランド及び入力オペランド(%0,%1)では使用されない
ということでしょうか?
0519デフォルトの名無しさん
2009/10/24(土) 14:54:290520デフォルトの名無しさん
2009/10/24(土) 15:06:45見た上で聞いています。
0521デフォルトの名無しさん
2009/10/24(土) 15:19:410522デフォルトの名無しさん
2009/10/24(土) 15:28:14:"%eax", "%edi", "%ebx", "%ecx", "%edx", "%esi");
この部分のエラーの事なら察してください
破壊レジスタにeax,edi,ebx,ecx,edx,esiのいずれかを指定した場合は、
出力オペランド及び入力オペランド(%0,%1)の演算等では使用されない
ということでしょうか?
0523デフォルトの名無しさん
2009/10/24(土) 15:33:010524デフォルトの名無しさん
2009/10/24(土) 15:34:56へーそうなんだ
0525デフォルトの名無しさん
2009/10/24(土) 15:48:34模範回答をお願いします。
0526デフォルトの名無しさん
2009/10/24(土) 18:06:20> :"%eax", "%edi", "%ebx", "%ecx", "%edx", "%esi");
察して下さいとあるけど、一応。
この例だと割当可能な汎用レジスタが一つもないから、不可能な指示がある、と
コンパイラが泣き言を言って止まる。
いずれかを指定したならば、明示的・暗黙的を問わず、そのasm文中では破壊しては
いけない用途で使用済みと見なし、%0や%1への割当を行わないだけ。
足りなくなった場合は、使用可能なレジスタの再利用を試み、それが不可能ならば、
やはりエラーを吐いてコンパイル停止する。
0527デフォルトの名無しさん
2009/10/24(土) 18:44:46int func(void){
register int i1 = 1;
register int i2 = 1;
asm("addl $1000, %eax;");
i1*=i2;
return i1;}
↑の場合、i1 がeax、i2にedxが割当られてしまい、この関数は1000を返す。
int func(void){
register int i1 = 1;
register int i2 = 1;
asm("addl $1000, %%eax;" :::"%eax");
i1*=i2;
return i1;}
↑の場合、i1とi2にeaxを割り当てるのを避けてくれるから、この関数は1を返す。
0528デフォルトの名無しさん
2009/10/24(土) 19:01:250529デフォルトの名無しさん
2009/10/26(月) 21:47:000530デフォルトの名無しさん
2009/10/26(月) 21:55:540531デフォルトの名無しさん
2009/10/26(月) 22:35:358086の場合のことを言ってる?
0532デフォルトの名無しさん
2009/10/26(月) 23:50:24IA-32では動作モードによって異なる。
16バイト境界に整列することが推奨された32ビットアドレスである可能性もある。
インテルが無料でPDFを配布してるから、それを読んで。
会員登録とか面倒な事は一切無く、日本語で読める文書を無料で配布してくれてるから。
IA-32 インテルR アーキテクチャソフトウェア・デベロッパーズ・マニュアル
下巻:システム・プログラミング・ガイド
上中下巻あわせて4つ、これらはダウンロードしていつでも参照できるようにしておくことが大前提。
0533デフォルトの名無しさん
2009/10/27(火) 01:06:45ダウンロード場所はですか?
0534デフォルトの名無しさん
2009/10/27(火) 01:12:060535デフォルトの名無しさん
2009/10/27(火) 01:12:590536デフォルトの名無しさん
2009/10/27(火) 09:18:52従ってリアルモードでも一応32bitアドレスのアクセスが可能
0537デフォルトの名無しさん
2009/10/27(火) 15:57:28IA-32 インテルR アーキテクチャソフトウェア・デベロッパーズ・マニュアル
↑これで検索すると一発で出てくる。
0538デフォルトの名無しさん
2009/10/28(水) 00:38:520539デフォルトの名無しさん
2009/10/31(土) 04:08:30ふっつーに、セグメントを跨ぐデータのコピー時には、同じセグメントレジスタだと不都合だからじゃねーの?
>>538
あの資料、少し古い日本語版を良く使っている。
・・・命令セットの章が、PDFを跨いだ分割収録にされる前の物を。
命令セット見るだけならCPUの対応時期も書かれてるからhttp://moon.gmobb.jp/hero/のx86CPU.CHMの方が便利なのかもしれないが、どうなんだろうな。
0540デフォルトの名無しさん
2009/10/31(土) 09:22:140541デフォルトの名無しさん
2009/11/02(月) 10:45:04そういや8086はセグメントオーバーライド+REPプレフィックス使うときは
DI/EIで挟む必要があったなー、と今思い出した。
0542デフォルトの名無しさん
2009/11/02(月) 11:40:070543デフォルトの名無しさん
2009/11/02(月) 12:30:40ブロックコピーの範囲が重なる問題には関係ないな。
0544デフォルトの名無しさん
2009/11/02(月) 12:33:290xddと0xfd?
インストラクションセットにない組み合わせも使えた辺りは確かにオーバライドプレフィックスのようだった。
0545デフォルトの名無しさん
2009/11/03(火) 23:49:40 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\ :::::::::ゝ‐;----//::::::ヾ.、
|. \ :::}二. \ ::::::::|.r-'‐┬‐l l⌒::::| }
゙l / :: リ ̄ヽ / :::::::|l:::::::::::!ニ! !⌒:://
_______________/ _,ノ':::::::::::::::::ゞ)ノ./
` ー==--‐'´(__,. ..、  ̄ ̄ ̄ :::::::::::::::::i/‐'/ 菊池ビーーーーーーーーーーーーーーーーム!!!
i , .:::υ_,,_,,,,;;-=、ヾ i::::::::::::::::::::l、_/::|
! '!ヽ_=─'''" ,__) !::::::::::::::::::::|:::::::::::|
ヽ. ゙i ::フ二-r──'''",,,,i' ":::::::::::::::::::!::::::::::::::ト、
/ヽ;. |/二/''"''ヽ-‐'" / ,,:::::::::::::::::::::;!::::::::::::::::::::ヽ、
' i |‐、/ / /:::::::::::::::::/:::::::::::::::::::::::::::::ヽ、
/ | |'' ,.‐''i "::::::::::::::/:::::::/::::::::::::::::::::::::::: ^ヽ
" :l !,゙ヽ--‐─‐'''"ノ:::::::::::::::/::::::::/:::::::::::::::::::::::: `ーフ^ゝ〜ヽ、
,イ ..! \_ ,/:::::::::::::/.:::::::/ ::::::::::::::::: :::/ /.:::. `ー-、
-一⌒ `ヽ、 ....:::::::`、 ` ̄"'''":::::::::::;/.:::::::::::/ ::::::: ./、 /.::::. ー
http://changi.2ch.net/test/read.cgi/csaloon/1257171544/299
『騙すンじゃねぇ、ジパング板から来ちゃったじゃねぇか!!』
0546デフォルトの名無しさん
2009/11/04(水) 03:19:55でも ring[rpointer] を参照するにはLXI H,ring で DEreg<--00rpointer を入れて DADする
コードが出ちゃうんだよね。HL<--XXrpointer を入れて MOV A,M するような書式
書けないものかな。
0547デフォルトの名無しさん
2009/11/04(水) 05:29:13あとは、行儀悪いけど
#define ring 0xXX00
unsigned int hl;
hl = ring | rpointer;
a = *(char *)hl;
とか。
ring[rpointer]は、リンクするまでringの値が確定しないので、
ど〜しても16bit足し算することになるんでないかい。
0548546
2009/11/04(水) 13:39:39LDA rpointer ; return( ring[rpointer++] ); の最適化
MOV L,A
INR A
STA rpointer
MVI H, HIGH ring
MOV A,M ここまでを_asm_cで書いて、
} にしたらRETは出ました(w
0549デフォルトの名無しさん
2009/11/06(金) 22:54:08あああああああああ
アセンブラを書くとき、MIPSとSHの作り易さは異常
その中でも、俺の中ではSHが一歩リードかな
某スセ社の「プスプ」がMIPSでなくSH採用してりゃもっと良かったのに
RISCのくせに命令が豪華でサイコー
0550デフォルトの名無しさん
2009/11/06(金) 23:00:030551デフォルトの名無しさん
2009/11/06(金) 23:03:54本スレ
ttp://science6.2ch.net/test/read.cgi/denki/1254737313/
0552デフォルトの名無しさん
2009/11/25(水) 13:55:260553デフォルトの名無しさん
2009/12/14(月) 04:13:25register _UWORD Rx=c0s_wpt; // loop中はRegに持つ
do { /* サイズ回 loop */
s0ring[Rx] = *srcp++; /* 1 キャラ put, srcp++ */
Rx = (_UWORD)((Rx+1)&(sizeof s0ring-1));// カウンタ更新
} while( *srcp );
c0s_wpt = Rx; // ringポインタ更新
SCI0.SCR.BYTE = 0xF0; /* TIE,TE ON */
} 石はH8S。まあ、ふつうに素直なringバッファに書き込むルーチンなんだが
0554デフォルトの名無しさん
2009/12/14(月) 04:24:22RxにE0を使い、loop中でE0→ER1に毎回ゼロ拡張が起きる。RxにR1を使えばloop前に
E1を1回だけゼロにしとけば済むのに。&演算も R1=R1&07FF とワードになる。
R1H=R1H&7 でイイのに。これだからへうのコンパイラ嫌いなんだ。
0555デフォルトの名無しさん
2009/12/14(月) 05:13:55register _UWORD Rx=c0s_wpt; MOV.W @_c0s_wpt:32,R1 EXTU.L ER1
do { L100:
s0ring[Rx] = *srcp++; MOV.B @ER0+,R2L MOV.B R2L,@(_s0ring:32,ER1)
Rx = (_UWORD)((Rx+1)&(sizeof s0ring-1)); INC.W #1,R1 AND.B #7,R1H
} while( *srcp ); MOV.B @ER0,R2L BNE L100:8
c0s_wpt = Rx; MOV.W R1,@_c0s_wpt:32
SCI0.SCR.BYTE = 0xF0; MOV.B 0F0h,R0L MOV.B R0L,@H'00FFFF7A:8
} RTS これがいちばん自然なReg使いなのに
0556デフォルトの名無しさん
2009/12/14(月) 06:11:080557デフォルトの名無しさん
2009/12/14(月) 06:40:580558デフォルトの名無しさん
2009/12/14(月) 14:31:420559デフォルトの名無しさん
2009/12/14(月) 16:33:14現在では携帯ユーザの総合的知性も絡んでくるかも
0560デフォルトの名無しさん
2009/12/14(月) 16:43:54共用体とか使うことで人的に最適化しないと
0561デフォルトの名無しさん
2009/12/16(水) 14:22:04register _UDWORD Rx とすると、添え字のアドレス計算の箇所でRxから別のレジスタへの
コピーが出て、Rxをオフセットに使いません。
結局、555の右側のコードを__asm { } ブロックの中に書きました。
ライフボートのコンパイラのほうがお利口だったなあ・・・
0562デフォルトの名無しさん
2009/12/17(木) 12:06:200563デフォルトの名無しさん
2009/12/21(月) 05:06:180564デフォルトの名無しさん
2009/12/21(月) 11:00:08{
unsigned int WORD;
struct
{
uncigned char high;
unsigned char low;
} BYTE;
} c0s_wpt;
cos_wpt.WORD++;
c0s_wpt.BYTE.high&=7;
0565563
2009/12/21(月) 15:07:35void ch1puts(_UBYTE* srcp) { // CH1
_ch1puts:
SUBS.L #2,SP
typedef union {
unsigned int WORD;
struct {
unsigned char high;
unsigned char low;
} BYTE;
} t_wreg;
register t_wreg Rx;
Rx.WORD = c0s_wpt; // loop中はRegに持つ
MOV.L ER0,ER2
MOV.W @_c0s_wpt:32,R0
MOV.W R0,@SP
0566つづき
2009/12/21(月) 15:08:56do { // サイズ回 loop
s0ring[Rx.WORD] = *srcp++; // 1 キャラ put, srcp++
MOV.B @ER2+,R0H
MOV.W @SP,E0
MOV.W E0,R1
EXTU.L ER1
MOV.B R0H,@(_s0ring:32,ER1)
Rx.WORD++;
INC.W #1,E0
MOV.W E0,@SP
Rx.BYTE.high &= 7;
MOV.B @SP,R1L
AND.B #7:8,R1L
MOV.B R1L,@SP
MOV.B @ER2,R0L
BNE L4706:8
} while( *srcp );
c0s_wpt = Rx.WORD; // ringポインタ更新
MOV.W @SP,R1
MOV.W R1,@_c0s_wpt:32
0567563
2009/12/21(月) 15:14:18>>564は1,2番目に対しては何も言っていませんね。3番目に対して的外れな提案しただけ。
0568デフォルトの名無しさん
2009/12/21(月) 17:24:38hewはそんなコードを吐くんだ。
0569デフォルトの名無しさん
2009/12/21(月) 17:28:080570デフォルトの名無しさん
2009/12/21(月) 18:40:320571デフォルトの名無しさん
2009/12/21(月) 19:00:310572デフォルトの名無しさん
2009/12/21(月) 21:19:54理由は最適化にバグがあるあら止まるかもしれんって内容だったと記憶してる。
0573デフォルトの名無しさん
2009/12/21(月) 21:22:090574デフォルトの名無しさん
2009/12/21(月) 21:37:100575567
2009/12/22(火) 04:05:36コンパイラにはこれ以上最適化できないことが多いです。
ライフボートのコンパイラにかけたらもっとおバカなコードが出ました。
0576デフォルトの名無しさん
2009/12/22(火) 10:10:35重要な箇所はアセンブリ言語で書くのが当然。
0577567
2009/12/22(火) 11:34:57私のは趣味の領域だし。
0578デフォルトの名無しさん
2009/12/22(火) 12:06:180579567
2009/12/22(火) 17:00:59H8系は仕事で使う+趣味も兼ねて凝り倒すので、ライフボートとルネサス落としてますが。
ライフボートのコンパイラに同じコード食わせたら、個々のモジュールはおバカでもLINKした結果は
ルネサスの1/4になりました。20995 bytes 対、5732 bytes。LIBの出来で勝負!みたい
ですね。くっついてくるLIBを除いたuser部のコードは、ルネサス400h〜1005h、ライフB 400h〜103Bh
ライフBのほうが僅かにおバカですが、大差ではない。 ライフBは、組み込み向けに、
「整数型変換だけの printf/sprintf のLIB」 を提供していて、これが効いています。
LIBの差で15KBですからね。まあ、今のROMは32KBや64KBが無いから、それが何?
なんですけど(^^; とにかく小ささに燃えるシーラカンスPGのぼやきです(^o^)
火星に飛ばす8085をコードしたかったなあ・・・
0580デフォルトの名無しさん
2009/12/22(火) 17:04:180581デフォルトの名無しさん
2009/12/22(火) 17:30:13バカは忙しいな
0582デフォルトの名無しさん
2009/12/22(火) 17:52:33その「俺は頭悪いです」って自己紹介してるような文章をまずなんとかしたら?
0583デフォルトの名無しさん
2009/12/22(火) 18:07:520584デフォルトの名無しさん
2009/12/22(火) 18:11:380585デフォルトの名無しさん
2009/12/22(火) 19:59:00使ってる人はそれしか使わないから、
みんなが使ってると錯覚するのかもしれんが。
0586デフォルトの名無しさん
2009/12/22(火) 20:58:250587デフォルトの名無しさん
2009/12/23(水) 03:25:31哀れやのう
0588デフォルトの名無しさん
2009/12/23(水) 04:29:29知らない奴は、恐ろしく狭い世界で生きてるんだろうなぁという予想は出来る
本当に哀れなのは誰なんだろうな
0589567
2009/12/23(水) 06:25:21unix登場以前からPGやってたんだから、今の標準的な教養と違ってるのは自覚してます。
趣味を仕事にしていられるのは、いい境地だと思いますけど。2年程前まで年\700平均
ぐらい貰えてたし。ここ2年で \150 \100 ぐらいに減ってきたけど、年金が始まったし(w
今は下積み2足の草鞋+年金ほぼ3等分ですね。
今ライフボートの本見てるんだけど、表紙の写真が3.5インチのフロッピー。
0590デフォルトの名無しさん
2009/12/23(水) 11:27:35そうでもない。
0591567
2009/12/23(水) 16:26:22ファイルにして読み込ませればいいですか? 割禁とかマシン依存な機能はどう書けば
いいのでしょう? 割り込み処理関数の書き始めも文法違うみたい。
展開したフォルダの中にマニュアルみたいのが見つからないんです。
0592デフォルトの名無しさん
2009/12/23(水) 17:34:18h8 gcc
で検索すると親切な人と出会えるかも
0593デフォルトの名無しさん
2009/12/23(水) 21:27:49キモチワルイ;;
0594デフォルトの名無しさん
2009/12/24(木) 09:50:54おたくは一体なにがしたいの?
0595591
2009/12/27(日) 15:15:23gdlという物を教わったのでそれで開発してみようとしたのです。
売り物のコンパイラと違ってnetのマニュアル見るとオプションが多すぎてパニクったり。
DEFファイルとか雛形を読んでstartupファイルやリンク情報やベクタ部の書き方とか、
どこに置けばよいか、など見当がついてきたところです。
今はlinkでerror: no memory region specified for loadable section `.data.align4 という
ので引っかかってます。h8rom.xというlink制御文ファイルのどこかがいけないんだと
思うんですが、これの文法が見当つかない。
0596591
2009/12/27(日) 16:35:26linkまで行ったので、割り込みハンドラ関数を書こうと思い、
void rxrdy0(void) __attribute__ (( interrupt_handler ));
void rxrdy0(void) {/* SCI0受信 int. */
r0ring[c0r_wpt++] = SCI0.RDR; // ringバッファに格納
SCI0.SSR.BIT.RDRF = 0; // 割り込み要因 リセット
} という関数を書いてみたのですが、-SでASMコード見るとこの関数が出てない。なんで?
0597デフォルトの名無しさん
2009/12/27(日) 16:44:50は思ってるコードが出ないかもしれないよ
0598591
2009/12/27(日) 22:15:22上のほうにr0ring[c0r_rpt++]から読み出す関数はコンパイルされて命令出てるんです。
0599591
2009/12/28(月) 00:27:21関数の入り口出口で必ずスタックフレーム確保/返却とか、
引数のレジスタはそのまま使わず、関数内で使うレジスタに移すとか、
cの標準に従った展開するらしいので、しょうがないですね。
LIBもフルセットのが付いてくるみたい。 ルネサスもライフボートもそれなりの性能を
提供しているんだな、とおもいました。
0600デフォルトの名無しさん
2009/12/28(月) 00:36:140601591
2009/12/28(月) 00:52:27最適化レベル2と3で、簡単な関数は手ASM並になりました。
割り込み関数も、起動しなおしたせいか、最適化レベルを設定し直したせいか、
出るようになりました。 後は割禁命令だな。3694.hファイル見てたら、
#define DI asm("orc.b #0xc0,ccr")
#define EI asm("andc.b #0x3f,ccr")
と、ありました。H8Sはbit7に対してこのマクロを書けばいいですね。
startupは、初期値コピー不要でRAMクリヤは後で実行したいから、JMP _main だけにします。
これで外回りは全部埋まったかな。
0602591
2009/12/28(月) 01:32:150603591
2009/12/28(月) 03:48:50というエラーで失敗するようになった。ちゃんとファイルは開いてるのに。
0604デフォルトの名無しさん
2009/12/28(月) 18:11:54volatileがついてるとそうなる。
volatileを外すとBCLR/BSETを使ってくれるけど、
書き方によっては最適化されて思ったコードがでなくなることがある。
gccのソースにパッチを当てれば、
volatile付きでもBCLR/BSETのコードを吐かせることは出来るけど
gccのビルドが大変かな
0605602
2009/12/29(火) 03:40:53#define BITON(x) asm("BSET @" #x "\n") とか・・・(これはLSIC85のマクロですが)
1行の |= とか &= をDI/EIで挟むのってうるさいですよね。
0606602
2009/12/29(火) 04:43:33デフォのセクション名の領域だけをクリヤする、ってことをできたんです。
GCCで似たようなことをするにはどういう手法がありますか?
0607602
2009/12/29(火) 08:42:14どうやらLINKまでたどりつきました。objcopy -I coff-h8300 -O srec a.out 167.MOT
とやると、a.out: Invalid bfd target というエラーが出ます。これは何がいけないんでしょう?
0608602
2009/12/30(水) 04:18:18MOTに変換できました。BIT操作は素直に割禁使うことにしました。
RAMクリヤが必要な空間だけ隔離できないのがちょっと残念ですが性能上は問題無い。
でもRAM16Kのうち2Kもlibが使うし、ROMもアプリ6Kでlibが28K。どちらも余っているから
いいけど、なんかグヤジー・・・
0609デフォルトの名無しさん
2010/01/04(月) 13:07:28かな?
0610デフォルトの名無しさん
2010/01/05(火) 18:25:59__attribute__ ((section ("bar")))
0611デフォルトの名無しさん
2010/01/06(水) 05:58:300612611
2010/01/06(水) 13:28:00セクションbarをbssの前にすることで、クリヤ範囲を大幅に減らせました。
0613デフォルトの名無しさん
2010/01/06(水) 20:52:330614デフォルトの名無しさん
2010/01/06(水) 21:48:460615デフォルトの名無しさん
2010/01/06(水) 21:52:200617611
2010/01/07(木) 05:39:45思い直しました。 でも609の書き方は理解したいので教えてください。
SCI0.SSR.BIT.RDRF = 0; // 割り込み要因 リセット の行を書く場合、
asm [volatile] ("BCLR %1,@%a0:8"::"i"(&SCI0.SSR.BIT.RDRF),"i"(6)) ; と書いて、
BCLR #6,@FFFF7C:8 になるんですか? volatileは必須ですか?
"i" がどこに展開されるか判らないのが不安です。
0618デフォルトの名無しさん
2010/01/07(木) 05:46:07%1 <- "i"(6)
%a0 <- "i"(&SCI0.SSR.BIT.RDRF)
asmの使い方は、このあたり見てみて
ttp://www.sra.co.jp/wingnut/gcc/gcc-j.html#Extended%20Asm
0619611
2010/01/07(木) 08:41:360620611
2010/01/07(木) 08:47:010621611
2010/01/07(木) 09:10:53ビットフィールドのアドレスを書いてはいけないと怒られました。
volatile はこの場合はつけなくても大丈夫なようです。
0622611
2010/01/07(木) 09:12:46これを16進で表現させる手段はありますか? 基数で検索が引っかからない・・・
0623デフォルトの名無しさん
2010/01/07(木) 12:07:09パラメータ使わないときはこんな書き方になる
asm volatile ("bclr #6,@0xFFFF7C:8")
0624611
2010/01/07(木) 15:03:46例えばcの上のほうで asm ("RDRF EQU 6") を書いて、下の方で asm ("bclr #RDRF,@・・・
なんて書き方も許されるのでしょうか?
0625デフォルトの名無しさん
2010/01/07(木) 16:31:26gccのasmって、なんでもありみたいなところがある。
自分は関数の外でこんな書き方したことがある。
asm ("\n\
\t.equ\tB7\t,\t7\n\
\t.equ\tB6\t,\t6\n\
\t.equ\tB5\t,\t5\n\
\t.equ\tB4\t,\t4\n\
\t.equ\tB3\t,\t3\n\
\t.equ\tB2\t,\t2\n\
\t.equ\tB1\t,\t1\n\
\t.equ\tB0\t,\t0\n\
");
-Sオプション使うより
h8300-elf-gcc -O2 -fomit-frame-pointer -c sci.c -Wa,-L,-a=sci.lst
で,アセンブラのリスト出した方が見やすいかも
0626デフォルトの名無しさん
2010/01/07(木) 17:10:280627611
2010/01/08(金) 16:36:03これだとポートアドレスなんか確認しやすいですね。
7F7A7250 BCLR #5,@16777082:8 ポートFFFF7Aと判ります。
0628デフォルトの名無しさん
2010/01/09(土) 16:55:45newlibを-O2 -fomit-frame-pointerでビルドしなおせば、少し小さくなるような気が
0629デフォルトの名無しさん
2010/01/10(日) 02:52:24小さくしたいなら-Osだな。
0630608
2010/01/10(日) 04:57:26task1{ core(&cont1); } task2{ core(&cont2); } みたいに、構造体を使って制御構造を
共有するタスクを複数書いたら、constの構造体が指す変数を直接使って同じ制御構造を
複数のタスクの中に展開形で書いたコードが出ました。
>>628 printfのフルセットが付いてくるのが本質なので、その手法は歌丸にワカメだと思います。
ライフボートは、整数型変換だけの代替printfを用意することで解決しました。
0631デフォルトの名無しさん
2010/01/10(日) 11:37:17を無効にしてみるとか
0632デフォルトの名無しさん
2010/01/10(日) 14:41:24asm volatile ("bclr %1,%0.B"::"Q"(IR215),"i"(IRn_IR_BIT))
0633デフォルトの名無しさん
2010/01/22(金) 04:45:54_UWORD ch1_empq(void) { return ((c0s_wpt - c0s_rpt)&2047); } はOKなのに、
そのlstの内容を.s37にcopyして、AH8 -ml -L でアセンブルするとエラーになるの。
MOV.W @c0s_wpt:32,R6 が Illegal effective address になる。
ど〜すりゃいいんじゃ!
0634633
2010/01/22(金) 05:06:520635デフォルトの名無しさん
2010/01/27(水) 05:05:420636デフォルトの名無しさん
2010/01/27(水) 07:24:230637デフォルトの名無しさん
2010/01/27(水) 13:24:05だから部分的にアセンブラで書くことは良くあるよ。
0638デフォルトの名無しさん
2010/01/27(水) 13:24:490639デフォルトの名無しさん
2010/01/27(水) 13:26:38馬鹿か。
nProtectとかX-Trapみたいなゲームのセキュリティ機能をぶっ潰すのにそういう知識が必要なんだよ。
0640デフォルトの名無しさん
2010/01/28(木) 00:19:19いつもいつも同じ台詞。聞き飽きた。
チート関係は升スレでやればいいだろ。
0641デフォルトの名無しさん
2010/01/28(木) 00:27:30升プログラミング
ttp://pc12.2ch.net/test/read.cgi/tech/1264605964/
0642デフォルトの名無しさん
2010/01/30(土) 01:16:59それ困ったよなあ
x64はインラインアセンブラ禁止とか困った事やってくれるし
0643デフォルトの名無しさん
2010/01/30(土) 01:38:080644デフォルトの名無しさん
2010/01/30(土) 15:45:550645デフォルトの名無しさん
2010/01/30(土) 20:09:46mov eax,55555556
imul dword ptr [n]
mov eax,edx
shr eax,1f
add eax,edx
//eaxに答えが入る
0646デフォルトの名無しさん
2010/01/30(土) 20:30:07勝手に人の質問をマルチにするのやめれ
0647デフォルトの名無しさん
2010/01/31(日) 03:10:18じゃあn*(2^31/3)*2^31とも直せるわけだ
0648デフォルトの名無しさん
2010/01/31(日) 03:11:22n * ((2^31) / 3) / (2^31)ね・・・
0649デフォルトの名無しさん
2010/01/31(日) 04:18:410650デフォルトの名無しさん
2010/01/31(日) 04:46:17探すのめどい
0651デフォルトの名無しさん
2010/01/31(日) 17:01:230652デフォルトの名無しさん
2010/01/31(日) 17:22:47マルチって書いてるからヒントくらいで十分だと思ったんだよ
で、どこで解説されてるんですか?
0653デフォルトの名無しさん
2010/01/31(日) 17:34:47ここの495氏
0654デフォルトの名無しさん
2010/02/01(月) 06:25:150655デフォルトの名無しさん
2010/02/01(月) 10:06:320656デフォルトの名無しさん
2010/02/01(月) 13:49:330657デフォルトの名無しさん
2010/02/01(月) 13:56:240658デフォルトの名無しさん
2010/02/01(月) 14:06:52実行してみてもわかんない。そんな感じ。
0659デフォルトの名無しさん
2010/02/03(水) 11:45:41cpu次第。
で、asmコードをみてクロック数調べればいい。
0660デフォルトの名無しさん
2010/02/03(水) 11:50:580661デフォルトの名無しさん
2010/02/03(水) 11:57:34周辺に演算結果による分岐がないなら、
そうだろうけど、演算速度気にするくらいだから、
多少は回すんじゃない?
x86前提とも限らないし。
0662デフォルトの名無しさん
2010/02/03(水) 22:33:05いまどき論理CPUがないやつなんかないわけだから
実CPUで動くか論理CPUで動くかによっても違ってくるだろ。
当然実CPUで動くか論理CPUで動くかは、OSによってもその確率は変わってくる。
また、プログラムサイズが微妙なときはキャッシュに入りきるかどうかも影響してくるし
母数によっても違ってくるんじゃないかな。
86命令なら短いけど、
命令長が全部同じ長さのCPUとかでは命令が増えた分だけ大きくなるし。
0663デフォルトの名無しさん
2010/02/16(火) 22:46:020664デフォルトの名無しさん
2010/02/20(土) 11:01:33その仕様を残さなかった団塊の弟子(ベビーブーマー)
C/C++が読めないとお冠です。
Cでかいてコンパイラ掛けて読めよ。もう好きにしてくれ。
老人介護はたくさんだ
0665デフォルトの名無しさん
2010/02/20(土) 11:06:080666デフォルトの名無しさん
2010/02/20(土) 11:13:330667デフォルトの名無しさん
2010/02/20(土) 12:52:150668デフォルトの名無しさん
2010/02/20(土) 14:54:000669デフォルトの名無しさん
2010/03/02(火) 21:26:420670デフォルトの名無しさん
2010/03/02(火) 23:20:18日本語でおk
0671デフォルトの名無しさん
2010/03/09(火) 04:15:38オブジェクトエイダとかもあるのかな
0672デフォルトの名無しさん
2010/03/15(月) 05:50:52mov #ring,ER5 ; ER5 = FFxx00
mov @rpt,R5L ; + リードポインタ
mov @ER5+,R6L ; これが最適化のミソ!
mov R5L,@rpt ; return( r0ring[c0r_rpt++] )
rts [256]のringはLINKでFFxx00に配置する。cだとアドレス演算が出てこの倍
0673デフォルトの名無しさん
2010/03/15(月) 12:52:490674デフォルトの名無しさん
2010/03/15(月) 13:45:400675デフォルトの名無しさん
2010/03/30(火) 22:25:55Monate
ttp://sourceforge.net/projects/monate-oop-asm/
>>674
オブジェクト指向という点だな。マクロは所詮プリプロセッサだろ。
0676672
2010/03/31(水) 04:04:160677デフォルトの名無しさん
2010/09/12(日) 09:38:58ロジックはすぐできた
ディスプレイ表示で幽体離脱するほど苦しみ厨
0678デフォルトの名無しさん
2010/09/12(日) 12:34:45クライアントの画面に出せば良い
0679デフォルトの名無しさん
2010/09/17(金) 23:20:070680デフォルトの名無しさん
2010/09/19(日) 14:13:00a[i]^=(d[i]+c[i])%16;
このプログラムをSSE2で書きたいのですがわかりません。
教えてください。よろしくお願いします。
C言語からインラインアセンブラで呼び出したいと思うのですが、
うまくいきません。
moveq d,%xmm0
moveq c,%xmm1
paddb %xmm1,%xmm0
moveq a,%xmm1
pxor %xmm1,%xmm0
配列のデータをレジスタにセットするところもわかりません。
0681デフォルトの名無しさん
2010/09/19(日) 15:49:43> このプログラムをSSE2で書きたいのですがわかりません。
なにが、どう、わからないんだ?
> C言語からインラインアセンブラで呼び出したいと思うのですが、
> うまくいきません。
どううまくいかないんだ?
エラーがでるのか?でるならエラー内容は?
> 配列のデータをレジスタにセットするところもわかりません。
SSE2の前にアセンブリ言語はわかるのか?
0682デフォルトの名無しさん
2010/09/19(日) 15:53:350683デフォルトの名無しさん
2010/09/19(日) 15:55:49はよくわかりません。
ただC言語で書いたプログラムをSSE2で書き変えたら早くなるだろうと思ってます。
アセンブラの命令は書いてあるのですがインラインアセンブラを使って書けない
のです。丸投げで悪いのですが教えてほしいです。
0684デフォルトの名無しさん
2010/09/19(日) 15:58:49SSE2とかいう以前の問題
まずはハロワ並みのコードをアセンブラで練習するべき
0685デフォルトの名無しさん
2010/09/19(日) 16:01:450686デフォルトの名無しさん
2010/09/19(日) 16:03:49ケースバイケースなのでなんとも言えない
十分独立した演算を行う場合でも、
レジスタに出し入れするのに複雑なデータ変換や余分なメモリアクセスが挟まると
場合によって遅くなったり
0687デフォルトの名無しさん
2010/09/19(日) 16:08:26データの配列の添え字を計算する16バイトの配列どうしの計算を
paddbとpxorを使ってループなしで計算できるのではと思っています。
0688デフォルトの名無しさん
2010/09/19(日) 16:19:18ハローワーク並のコード?と一瞬納得してしまいかけて
0689デフォルトの名無しさん
2010/09/19(日) 16:45:010690デフォルトの名無しさん
2010/09/19(日) 16:45:52多分速くなるんじゃない
やってみないと何とも言えないけど
0691デフォルトの名無しさん
2010/09/19(日) 16:52:16というオプションがあるので試してみたけど全然変わらなかった。
0692デフォルトの名無しさん
2010/09/19(日) 18:21:13gccでは変数をインラインアセンブラ内に直接書けないぞ
ttp://caspar.hazymoon.jp/OpenBSD/annex/gcc_inline_asm.html
0693デフォルトの名無しさん
2010/09/19(日) 18:37:50早くなったとは体感できないけど、アセンブラソースは小さくなった。
0694デフォルトの名無しさん
2010/09/19(日) 18:49:100695デフォルトの名無しさん
2010/09/19(日) 18:50:02ベクトル処理向けには上手く最適化されないぞ。
0696デフォルトの名無しさん
2010/09/19(日) 18:58:33for(j=0;j<16;j++){
for(i=0;i<16;i++){
d1[i]^=GF[((FG[a[j]]-1)+(FG[h1[i][FG[b[j]]]]-1)%255)+1];
d2[i]^=GF[mlt(FG[a[j]],FG[h2[i][FG[b[j]]]])];
}
}
0697デフォルトの名無しさん
2010/09/19(日) 19:30:36int b[]={131, 94, 131, 129, 131, 84, 131, 140, 131, 139, 131, 95, 131, 67, 131, 96};
int c[]={123,111,222,231,132,125,124,133,122,147,158,210,1,2,3,4};
int main(void){
int i;
for(i=0;i<16;i++)
a[i]^=(b[i]+c[i])%16;
}
$ gcc -O3 -ftree-vectorize -ftree-vectorizer-varbose=5 -mmmx -msse2 -S v.c[1P[1@e
v.c:8: note: dependence distance = 0.
v.c:8: note: accesses have the same alignment.
v.c:8: note: dependence distance modulo vf == 0 between a[i_21] and a[i_21]
v.c:8: note: vect_model_load_cost: aligned.
v.c:8: note: vect_model_load_cost: inside_cost = 1, outside_cost = 0 .
v.c:8: note: vect_model_load_cost: aligned.
v.c:8: note: vect_model_load_cost: inside_cost = 1, outside_cost = 0 .
v.c:8: note: vect_model_load_cost: aligned.
v.c:8: note: vect_model_load_cost: inside_cost = 1, outside_cost = 0 .
v.c:8: note: vect_model_simple_cost: inside_cost = 1, outside_cost = 0 .
v.c:8: note: not vectorized: relevant stmt not supported: D.1523_11 = D.1522_10 % 16
v.c:5: note: vectorized 0 loops in function.
ベクトル化できない。なぜ?
0698デフォルトの名無しさん
2010/09/19(日) 20:49:25for(i=0;i<16;i++)
a[i]^=(b[i]+c[i])&0xff;
0699デフォルトの名無しさん
2010/09/19(日) 20:52:37a[i]^=(b[i]+c[i])&0xff;
って同じことをするんですか
0700デフォルトの名無しさん
2010/09/19(日) 21:13:060701デフォルトの名無しさん
2010/09/19(日) 21:53:31の間違い。
0702デフォルトの名無しさん
2010/09/19(日) 21:55:40そもそも、アドレスの遷移が複雑すぎて
ベクトル処理向きじゃないんじゃねえか?
テーブルがキャッシュに載りきるぐらいなら
別の方法で速くはなりそうだが。
>>698
0xFF は 255 だぞ。
0703デフォルトの名無しさん
2010/09/19(日) 22:01:23256は要らない。
行列の大きさは4kbyte位なのでキャッシュに入りそうです。
別の高速化でもいいので教えてください。
配列のメモリアクセスがボトルネックになっている可能性があります。
0704デフォルトの名無しさん
2010/09/19(日) 22:04:34時より10倍くらい遅くなってしまいます。
なぜでしょう?
0705デフォルトの名無しさん
2010/09/19(日) 23:41:540706デフォルトの名無しさん
2010/09/19(日) 23:43:22GF[256]
FG[256]
配列はこれだけです。
0707デフォルトの名無しさん
2010/09/19(日) 23:45:220708デフォルトの名無しさん
2010/09/19(日) 23:50:45-O3 -ftree-vectorize -ftree-vectorizer-verbose=5 -mmmx -msse2
0709デフォルトの名無しさん
2010/09/19(日) 23:55:100710デフォルトの名無しさん
2010/09/20(月) 00:03:46128ビット演算なのでSSE2で最適化できるかと思ったのです。
0711デフォルトの名無しさん
2010/09/20(月) 00:08:02見間違いかな
0712デフォルトの名無しさん
2010/09/20(月) 01:45:360713デフォルトの名無しさん
2010/09/20(月) 02:05:010714デフォルトの名無しさん
2010/09/20(月) 02:11:44a[i]^=(d1[i]+c[i])&0xff;
こっちはintにすれば自動的にベクトル処理してくれます。ただ32ビット
なので16個いっぺんに計算してくれているかどうかはわかりません。
本体部分が
for(j=0;j<16;j++){
for(i=0;i<16;i++){
d1[i]^=GF[((FG[a[j]]-1)+(FG[h1[i][FG[b[j]]]]-1)&0xff)+1];
d2[i]^=GF[mlt(FG[a[j]],FG[h2[i][FG[b[j]]]])];
}
}
です。SIMD以外でもキャッシュを工夫して高速化できればいいかと思います。
何かいい方法があったら教えてください。
0715デフォルトの名無しさん
2010/09/20(月) 08:52:240716デフォルトの名無しさん
2010/09/20(月) 09:13:392秒ほど高速になりました。
for(k=0;k<500000;k++){
for(j=0;j<16;j++){
o=FG[a[j]];
p=FG[b[j]];
for(i=0;i<16;i++){
e1[j][i]=((o-1)+(h1[p][i]-1))&0xff+1;
e2[j][i]=((o-1)+(h2[p][i]-1))&0xff+1;
// d1[i]^=FG[mlt(o,h1[p][i])];
// d2[i]^=FG[mlt(o,h2[p][i])];
}
}
for(j=0;j<16;j++){
for(i=0;i<16;i++){
d1[j]^=GF[e1[j][i]];
d2[j]^=GF[e2[j][i]];
}
}
for(i=0;i<16;i++)
a[i]^=(d1[i]+c[i])&0xff;
for(i=0;i<16;i++)
b[i]^=(d2[i]+c[i])&0xff;
}
0717デフォルトの名無しさん
2010/09/20(月) 12:11:15GPGのAESは7秒 orz
0718デフォルトの名無しさん
2010/09/22(水) 09:23:22#include <stdlib.h>
int main(void){
unsigned long long int a,b;
a=strtoull("0x1111111111111111",(char **)NULL,16);
b=strtoull("0x2222222222222222",(char **)NULL,16);
a=a^b;
printf("%llu\n",a);
return 0;
}
このプログラムをMMXを使って最適化したいのですがわかりません。
アセンブラで書くしかないのでしょうか。
0719デフォルトの名無しさん
2010/09/22(水) 09:38:14どうせ文句言いながらも使ってるくせに。メーカーさんの苦労もかんがえろ。そんなに
そんなに嫌ならOSもパーツも自分で作れ。どうせお前らには出来ないが。今大学院で
OSの研究をしているが、純粋にみんな凄いって感心している。オタクの集まりっていうのは
ほんまウザいねん。お前らに電子工学の知識があるのか?情報科学を学んだことがあるのか?
お前らまともに勉強してから文句言え。
0720デフォルトの名無しさん
2010/09/22(水) 09:59:120721デフォルトの名無しさん
2010/09/22(水) 11:09:17C言語なら俺に聞け(入門編)Part 69
http://hibari.2ch.net/test/read.cgi/tech/1284477697/464-
0722デフォルトの名無しさん
2011/02/11(金) 20:06:45どうも 64-bit でアセンブルされてるように見えるんだけど
Debug | i386 構成だとちゃんと 32-bit でアセンブルされてるようだ
Release 構成でも 32-bit でアセンブルされる方法はないのかな?
OS: Mac OS X 10.6.6
CPU: Intel Core 2 Duo
XCode: 3.2.3 (64-bit)
0723デフォルトの名無しさん
2011/02/11(金) 20:17:580724デフォルトの名無しさん
2011/02/16(水) 11:21:480725デフォルトの名無しさん
2011/03/10(木) 07:16:19.45****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
http://sky.geocities.jp/ttl_ttl_ttl_pic/
NASMでC言語を作る NASMで高度な設計書類とNASMの簡単な利用方法のサイトです
C言語のHEADの作り方 DLLファイルの作り方が書いてあります
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
0726デフォルトの名無しさん
2011/03/10(木) 07:25:36.870727デフォルトの名無しさん
2011/03/10(木) 08:18:00.85○Cの下請け処理を汗で書く?
0728デフォルトの名無しさん
2011/03/15(火) 22:00:57.52ttp://n.xxad.net/watch/sm13809685
【どうすればこの欲望の渦巻く堕落した世界に私の名を残せるだろうか】
※名を残したいとは思わないがw。
【狂乱のマシンを残せばいい】
【この狂乱の世界に相応しい野獣のようなマシンを】
【狼が来たからやってきた】
【お前の平和な街は今はもう安全ではない】
0729デフォルトの名無しさん
2011/03/16(水) 00:13:45.990730デフォルトの名無しさん
2011/03/16(水) 12:53:02.83は〜い、逝きますwww。
0731デフォルトの名無しさん
2011/03/22(火) 10:54:41.99アセンブラインタプリタみたいなので利用したい
0732福盛俊明
2011/03/27(日) 03:00:55.530733デフォルトの名無しさん
2011/03/27(日) 03:22:48.69意味がわからん
0734デフォルトの名無しさん
2011/03/27(日) 10:34:45.54?
クロスアセンブラって知ってる?
インタプリタは無理だけど(てか、インタプリタ自体に32bit/64bitが有っても、ソースにbitは関係無いし)、バイナリ作るだけなら、理論上、16bitOS上でも64bitのバイナリ作れるよ
ちょっと調べればアセンブラは32bitでも64bitのバイナリ作れるのは有るんじゃ無い?
0735デフォルトの名無しさん
2011/03/27(日) 10:41:35.65クロスアセンブラは簡単にアーキテクチャの壁を超えられる良い例ですね
(アセンブラの場合、アーキテクチャの壁とハード仕様の壁、両方超える必要が有りますが)
0737デフォルトの名無しさん
2011/03/30(水) 11:38:30.63そうそうだから文字列をバイナリに変換するライブラリが欲しい
作れるだけでいいんです
例えばプログラムでアセンブラを変換してバイナリを生成して
メモリに投入して関数ポインタで呼び出して実行するみたいなことがしたい
もちろん逆もしたいので逆アセンブル機能も欲しい
0738デフォルトの名無しさん
2011/03/30(水) 11:40:47.63そういうレベルのデバッガを作ろうとしてて、アセンブラライブラリが欲しいんです
0739デフォルトの名無しさん
2011/03/30(水) 11:47:30.970740デフォルトの名無しさん
2011/03/30(水) 14:00:15.93理論上は、数値入りの命令は工夫が居るけど、全種類のデータあれば単純に検索だけで実装できるよね。
0741デフォルトの名無しさん
2011/03/30(水) 14:21:59.95大した手間かからんべ
命令コード汚いと泣きたくなることもあるが
0742デフォルトの名無しさん
2011/03/30(水) 16:05:25.07自分で実装すると変数やラベルまでやるのは大変だから
ライブラリであると助かるんだよな
0743デフォルトの名無しさん
2011/03/30(水) 19:34:31.880744デフォルトの名無しさん
2011/03/30(水) 20:32:50.07アセンブリ言語から利用するライブラリ、にしろ
普通にあるものだと思うが
0745デフォルトの名無しさん
2011/03/30(水) 20:35:52.510746デフォルトの名無しさん
2011/03/30(水) 20:43:00.220747デフォルトの名無しさん
2011/03/30(水) 23:46:27.15バイナリをあらかじめ用意するとか出来ないし
オフセットが変わるとごろっと変わってくるからね
というかリアルタイムでメモリをいじって挙動を調べたりすることをやってるもんで
まさにアセンブラのインタプリタが欲しいのですよ
0748デフォルトの名無しさん
2011/03/31(木) 00:19:13.630749デフォルトの名無しさん
2011/03/31(木) 14:12:58.87作れないとダメだろう
0750デフォルトの名無しさん
2011/03/31(木) 21:55:29.04何千行のソースは約束されてるし
0751デフォルトの名無しさん
2011/04/01(金) 17:11:15.680752デフォルトの名無しさん
2011/04/03(日) 15:34:37.060753デフォルトの名無しさん
2011/04/03(日) 16:49:47.77あほか
思いっきり機種依存の話をしてどうする
0754デフォルトの名無しさん
2011/04/03(日) 17:03:45.86実用的なアプリ = 速度が要求されるアプリとは限らないし、移植性や保守性を考えたら、アセンブラは使わないに越した事はない
0755デフォルトの名無しさん
2011/04/03(日) 17:10:56.46ちなみに今度8種類目
0756デフォルトの名無しさん
2011/04/03(日) 17:23:45.86マジで涙目だな。。。
体壊すなよ
0757デフォルトの名無しさん
2011/04/03(日) 23:15:13.50アセンブラを確認してる。
0758デフォルトの名無しさん
2011/04/04(月) 04:27:16.760759デフォルトの名無しさん
2011/04/07(木) 18:57:10.42C、アセンブリ語、マシン語を紙に書く時代に戻るの?
0760デフォルトの名無しさん
2011/04/07(木) 19:21:44.330761デフォルトの名無しさん
2011/04/09(土) 00:40:44.470762デフォルトの名無しさん
2011/04/10(日) 13:11:42.790763デフォルトの名無しさん
2011/04/10(日) 13:16:13.280764デフォルトの名無しさん
2011/04/10(日) 15:18:35.940765デフォルトの名無しさん
2011/04/10(日) 15:31:26.190766デフォルトの名無しさん
2011/04/10(日) 16:10:04.87hello,worldをコンパイルするだけで4分ぐらいかかってました。その間フロッピードライブが
ものすごい勢いで動き続けるのでいつか壊れるだろうと思ってました。
ゲームが完成する頃には総コンパイル時間が1時間ぐらいだったと思います。
完成したゲームをMSX-FANに投稿しましたが、採用されませんでした。
私の苦労は・・・。
ちなみに当時のソースをひっぱりだしててきて、Phenom II 3GHzという環境上で、CP/Mエミュ
レータ+コンパイラでコンパイルしたら物の数秒でコンパイル完了しました。
0767デフォルトの名無しさん
2011/04/10(日) 18:46:21.98CPUがざっと1000から1万倍、ディスクがざっと1000倍速くなっていることを考えると遅過ぎる。
0768デフォルトの名無しさん
2011/04/11(月) 01:53:07.49あの時代だとBDS-Cあたりか
俺は耐えられなかったのでTurbo Pascalで遊んでた
>>767
Z80エミュレーターで走ってるんだから十分速いだろう
0769デフォルトの名無しさん
2011/04/13(水) 23:27:49.58誰かマルチコア cortex-a9 の使い方、
どこでどう勉強したらいいか教えてください。
0770デフォルトの名無しさん
2011/04/13(水) 23:31:14.67atomicな処理が出来れば、ハマることはないと思うけど
0771デフォルトの名無しさん
2011/04/15(金) 18:49:31.58例えば0から100の処理をループする時に
偶数用スレッドと奇数用スレッドを用意してインデックスを渡して
後の処理内容はまったく同じ
0772デフォルトの名無しさん
2011/05/02(月) 18:09:16.43メモリバリア・キャッシュ、
グローバルなリソースの排他、
プライオリティ インバージョン
の3つが解っていればあとは応用編。
単にスレッド3本走らせるだけなら
>>770-771 のとおり何も変わらん。
待ち合わは wfe とかか。
0773デフォルトの名無しさん
2011/05/15(日) 05:53:53.62INVDやWBINVDは特権命令なので実行しようとすると例外が出て止まります
0774デフォルトの名無しさん
2011/05/15(日) 07:05:35.700775デフォルトの名無しさん
2011/05/15(日) 12:44:10.33ハード絡みならそっちからフラッシュ要求だしてもらうべきだろう
0776デフォルトの名無しさん
2011/05/16(月) 19:23:42.04そうですねデバイスドライバモドキを作ってそこで実行するかな
>>775
2つのアルゴリズムを比較したい時に前のデータがキャッシュに残っていたら
アレなので両方ともキャッシュをフラッシュしてから実行開始する簡単な方法が
あればと思いました
0777デフォルトの名無しさん
2011/05/16(月) 20:39:36.410778デフォルトの名無しさん
2011/05/16(月) 21:24:45.67それで行くか
0779デフォルトの名無しさん
2011/05/16(月) 21:58:38.600780デフォルトの名無しさん
2011/05/17(火) 12:21:13.04それでいいんだよ
それぞれのアルゴリズムのテスト前にキャッシュから追い出せばいいわけ
0781デフォルトの名無しさん
2011/05/17(火) 20:05:00.84実行時間計測?
0782デフォルトの名無しさん
2011/05/17(火) 20:18:43.68キャッシュフラッシュの用途で、それ以外何があると
0783デフォルトの名無しさん
2011/05/17(火) 21:26:48.920784! 【24.1m】 【東電 66.0 %】
2011/09/23(金) 18:59:44.48ハッキリ言えよ
0785デフォルトの名無しさん
2011/09/23(金) 19:17:57.440786デフォルトの名無しさん
2011/09/24(土) 20:08:45.150787デフォルトの名無しさん
2011/10/01(土) 21:24:40.70色々ネットをgoogleで調べたのですが、良くわかりません。
Darwinと64bitタイプ向けのサンプルは発見できたのですが。
0788デフォルトの名無しさん
2011/10/01(土) 21:32:41.39コンパイルして動作させようとしたのは、"hello world"を表示するものでした。
ソフト割り込み(かな int 0x80でシステムコールしてました)は上手く動作しました。
0789デフォルトの名無しさん
2011/10/01(土) 23:02:10.33コンテキストスイッチの時にキャッシュ汚染されるから同じようなもんだろうが
0790デフォルトの名無しさん
2011/10/01(土) 23:59:37.68cpuidのsep立ってればできる
今時のCPUなら全部対応していると思うが
0791uy
2011/10/03(月) 14:00:28.26たとえそいつがかけても、そいつがいなくなったら誰もメンテできないという自体になる
アセンブラでやるっていうのは最終手段になりつつある
>>1のいうように下手にかけば遅いし、
速いアセンブラコードかくには、アセンブラである程度何か書いた事がないと
コンパイラの最適化の下をいく
アセンブラで速いコードをかけるとか、
そんな技術者はもうほとんどいないし、これから若手がそういう人材になる見込みも
0792uy
2011/10/03(月) 14:03:04.75所詮、いまだアセンブラは奥の奥で使われているから、誰も使えない、誰もかけないなんて状況には
ならないんだけどな、 本当の意味で正しくアセンブラ言語を発音できるやつは、いずれ絶滅危惧種になる
才能のないやつがプログラマとして生きるなら「ここ」だよ
「ここ」だけは才能がいらず、知識量だけでやっていける
アセンブラはそういうもの
ゴミみたいなやつでもできる あ、だけどバカにしているわけじゃないよ
がんばれ
0793デフォルトの名無しさん
2011/10/03(月) 14:54:22.63「ゴミみたいなやつ」とは自己紹介乙
079450代スレの古参PG
2011/10/03(月) 17:07:16.45実際、古代の石でASM開発された奴の保守は私ぐらいしか出す先がありません。
狭い狭いニッチですが、フジツボみたいにしがみついてます。 趣味+実益(w
0795! 【13.8m】 【東電 70.4 %】
2011/10/03(月) 22:55:49.410796デフォルトの名無しさん
2011/10/04(火) 09:46:25.720797デフォルトの名無しさん
2011/10/04(火) 09:58:57.31そういう理由でもない限り、C/C++で書かない理由が見当たらない。
0798デフォルトの名無しさん
2011/10/04(火) 10:34:47.90画像のピクセル毎の処理とかで、かつSSE命令を使うとか、飽和加算が必要とか、
いくつか可能性は考えられるけどね。けどまぁほんとにごく一部のコードに限られるはず。
0799デフォルトの名無しさん
2011/10/04(火) 10:42:10.18マシン語でプログラム書くの大変でしょ
修正するたびにjmpのアドレス値を全部書き換えなきゃいけないとか
0800デフォルトの名無しさん
2011/10/04(火) 20:03:12.90シムとかプロフなしに速いループを書くのはやっぱり難しいよ。
0801デフォルトの名無しさん
2011/10/04(火) 21:52:36.02それ以上はそんなことする気にもなれん
0802デフォルトの名無しさん
2011/10/04(火) 22:08:48.76禁止しない限り人が書いたコードを最適化する RISC チップ用アセンブラもあることだしねぇ
0803デフォルトの名無しさん
2011/10/05(水) 03:04:51.650804デフォルトの名無しさん
2011/10/05(水) 11:45:19.56バイトマシンであるところのx86は8bitかよと
0805デフォルトの名無しさん
2011/10/05(水) 15:25:26.720806デフォルトの名無しさん
2011/10/05(水) 18:30:34.350807デフォルトの名無しさん
2011/10/05(水) 20:38:48.710808デフォルトの名無しさん
2011/10/05(水) 22:11:15.33>>804 可変長OPコードだぞ。
0809デフォルトの名無しさん
2011/10/06(木) 02:21:52.64そうそう、x86は8ビットマシンに見えてしまって。
0810デフォルトの名無しさん
2011/10/06(木) 05:54:11.26たしかに、今では >>808 が正解のようだ。
0811デフォルトの名無しさん
2011/10/06(木) 11:26:09.270812デフォルトの名無しさん
2011/10/06(木) 16:41:51.510813デフォルトの名無しさん
2011/10/06(木) 17:54:12.22なにその、無理矢理な定義wwwww
0814デフォルトの名無しさん
2011/10/06(木) 22:25:23.330815デフォルトの名無しさん
2011/10/07(金) 15:04:00.810816デフォルトの名無しさん
2012/02/12(日) 17:00:40.61>>21
ARMは、そろそろ使用に耐えなくなる頃合だよん
0817デフォルトの名無しさん
2012/02/13(月) 05:40:19.89ROTL R6 ; MSBから出力 石とASMはH8S
BST #1,@P4DR
BSET #0,@P4DR
BCLR #0,@P4DR
これをbit数分、並べた。forのカウントもしないし、cだとportを読んでmaskで変更して
書き戻すコードしか出ないから、cでは書けない関数の好例。
0818デフォルトの名無しさん
2012/02/13(月) 16:09:54.46*P4DR | = 1;
else
*P4DR & = ~1;
て書いたら
bld #bit,RnL
bst #0,@P4DR
て最適化してくれるようになればいいんでないかと思う
0819デフォルトの名無しさん
2012/02/14(火) 04:13:33.73ROTL R6 BST #1,@P4DR ではなくR6→R5 R5からBLDでCYに取り出してBSTする。
c中にASMコードも書けないのでASMの関数コールを用意するしかなかった。
AduCという所のcはCYまで使えるので817の書き方ができるお利口さんだが、
すごくローカルな方言。
0820817
2012/02/14(火) 04:38:59.09#pragma function = intrinsic(0)
int rotlw (int count, int data);
・・・
void bset (unsigned char bit_no, unsigned long address);
void bclr (unsigned char bit_no, unsigned long address);
#pragma function = default
これを真似してbset/bclrの辺りに
void bst (unsigned char bit_no, unsigned long address);
を書いてみたけど、BST命令は出ずに関数コールになった。
bset/bclrを書いたらコンパイラが狂い死にした(w
ルネサスのcなら書けるんだけど。
0821デフォルトの名無しさん
2012/02/14(火) 22:14:36.01速度を必要としてるのか
データシートに書いてある最高速度で動かしたいのか
速さが必要ないのに汗で書くことも無いような
ほんとに速さが必要になった時に汗でも書けるぐらいでいいんじゃねえの
Cであがいて最後は全部汗とか、はまりパターンにならんように
最初にどっちで書くのがいいか見極めが必要なのかも
0822817
2012/02/15(水) 04:09:34.73同じ部署の次世代製品だったから、企画の時からこれ以上出せない文句無しの
出してやろうと決めていました。動き出してから、書き込み速いねって誉められました。
動作周波数は、分周してuartの適切なレートが出る奴を選ぶので、CPUの最高より
若干低め:16.588とかの半端なクロックが使われます。
別の部署の製品では、seup/holdが4μのPLLでCPUが20MHzだったため、1パルス
毎にディレイかまさなくちゃいけなくて、なんかくやしかったり(w
ハード屋さんに聞いたら、(回路をケチるためらしいんだけど)横浜コンチみたいな
波形なので、トロくさせることで確実にしてるみたい。
0823817
2012/02/18(土) 05:03:46.970824デフォルトの名無しさん
2012/04/30(月) 05:22:50.090825デフォルトの名無しさん
2012/05/07(月) 23:18:48.43訳分からないnopとかいっぱい入ってるし、命令ブロックの配置とか
元のロジックの順番変わったりするしそんなの手作業でハンドアッセンブルなんて
不可能じゃないの?初期のペンティアムのUパイプだのVパイプだのの時点でもう
訳わからん
0826デフォルトの名無しさん
2012/05/08(火) 10:28:53.350827デフォルトの名無しさん
2012/05/08(火) 18:26:40.260828デフォルトの名無しさん
2012/05/08(火) 19:49:03.15いっぱい入ったりする、命令ブロックの配置とか元のロジックの順番変わったりする
今のCPUって、手作業でハンドアッセンブルなんて不可能じゃないの?初期のペンティ
アムのUパイプだのVパイプだのの時点でもう訳わからん」
せめてこう書くべき
0829デフォルトの名無しさん
2012/05/08(火) 22:26:11.83http://www.cpubenchmark.net/cpu_list.php
こういう所もあるけどな
■ このスレッドは過去ログ倉庫に格納されています