Cで書くかアセンブラで書くか・・・

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん

下手なアセンブラコードよりも、Cで書いてコンパイラに任せた方が速い場合もあります。
こういう場合はアセンブラで、こういう場合はCで書いた方がいいよという情報をみんなで交換していきましょう。


このスレはCあるいはC++の中で使用するアセンブラに特化したスレです。アセンブラの全般の話題はこちらへ

アセンブラ… (°Д°)ハァ?
http://pc5.2ch.net/test/read.cgi/tech/1093519463/l50
2デフォルトの名無しさん:04/09/30 02:39:25
速度はもう殆ど気にすることはなくなった。
速度が理由でアセンブラ使うことを検討したことはここ数年ないな。
アプリケーションプログラマだからこういう答になるけど、
サイズを気にする組み込み系だとまた話は違ってくるんだろうね。
3デフォルトの名無しさん:04/09/30 07:40:12
アセンブラ使うのは、Cでサポートされない部分を書く時くらいだな。
4デフォルトの名無しさん:04/09/30 14:20:13
OpenSSLはセンブリを上手く使ってるように思う。
5デフォルトの名無しさん:04/09/30 14:23:22
>速度はもう殆ど気にすることはなくなった
んなわけねー
6デフォルトの名無しさん:04/09/30 15:52:40
思いつく限り
1.高速化のために使う場合
 コンパイラがサポートしない特種命令を持つCPUの時、
 もしくは命令スケジュール等が実質サポートできていない命令を使いたい時。
2.ハードウエアをキックする場合
 オプティマイザがポートのキック順序を勝手に変えてしまい問題を引き起こしてしまう場合。
 もしくはアクセスタイミングが正確でなければ動作しないハードをキックする場合。
3.割り込み関連のコードを書く場合
 コンパイラがサポートしていないケースが多い。
4.言語間ブリッジを書く場合
 二つの言語間インターフェイスを取れる言語はアセンブラのみ。
5.コンパイラそのものを作るとき
 出力先にC等を使わないネイティブコンパイラには必須。
6.OSのような物を作る場合
 スタック操作やスレッドの実現に使う。
 プログラムのロード実行、その他自己書き換えのようなものを実現する場合。

以上
7デフォルトの名無しさん:04/09/30 16:05:53
アセン( ・Д・)ブルァ
8デフォルトの名無しさん:04/10/01 11:13:36
gccないでアセンブラを使うにはどうしたらよいのですか?
9デフォルトの名無しさん:04/10/01 11:46:46
asm
10マイク ◆yrBrqfF1Ew :04/10/01 14:52:02
11デフォルトの名無しさん:04/10/01 14:58:23
>>8
1:gcc内でアセンブラを使うには
2:gcc無いでアセンブラを使うには
12デフォルトの名無しさん:04/10/01 14:59:21
>>8
アセンブラのソース渡せばそのままアセンブルしてくれるだろ。
13 ◆FIcNi4f8js :04/10/03 03:23:42
基本はハンドアセンブル
14デフォルトの名無しさん:04/10/09 12:23:03
alphaのアセンブラを学べるサイとか本を教えてください
15デフォルトの名無しさん:04/10/09 12:29:30
http://www.amazon.co.jp/exec/obidos/ASIN/4320026489/qid%3D1097292504/249-4699941-6264320
好きなだけ勉強するといい、このCPUに流行って欲しかったと心の底から思えるよ。
16デフォルトの名無しさん:04/10/09 12:56:05
試作品みたいな名前だから人気も知名度もなさそうですね
17デフォルトの名無しさん:04/10/09 13:02:12
>>15
思わず完全無料ライブチャットの方をクリックしてしまった。
18デフォルトの名無しさん:04/10/09 18:09:24
>>16
>試作品みたいな名前
Alpha 知らないってのは痛いな。
19デフォルトの名無しさん:04/10/09 20:01:37
Alpha がゲーム機で復活してくれないかな
8bit/16bitの処理の遅さが弱点(命令セットを持っていない)と言われているけれど、
ゲームの場合は使わなきゃいいって選択肢があるからね。
20デフォルトの名無しさん:04/10/09 23:31:28
アルファはサーバ分野でひっそり生きてください
21デフォルトの名無しさん:04/10/11 03:07:20
ゲーム機には既にARMという最高のチップがある
22デフォルトの名無しさん:04/10/11 20:19:26
>>21
ARMは、そろそろ使用に耐えなくなる頃合だよん
23デフォルトの名無しさん:04/11/04 11:23:41
アセンブラを基礎から学べるサイトを教えてください
24デフォルトの名無しさん:04/11/04 11:32:25
情報処理試験の仮想マシンでもやってな
25デフォルトの名無しさん:04/11/04 11:37:24
26デフォルトの名無しさん:04/11/04 13:29:34
27デフォルトの名無しさん:04/11/04 21:57:00
>>26
それ、面白そうだね。
電気回路知識がなくても大丈夫?
28デフォルトの名無しさん:04/11/04 22:03:35
最適化を考える上でアセンブラを考慮するけど、殆どは「読む」だけ。
同じ処理の異なるロジックをCで一通り書いて、それをコンパイラでアセンブラコードに落として比較する。
これが一番確実で有効なアセンブラの利用法。
29デフォルトの名無しさん:04/11/09 17:35:09
gccのコードの中でアセンブラを使う場合、どの書式に則って書けばよいのでしょうか
30デフォルトの名無しさん:04/11/10 08:08:48
>>29
gccでコンパイルできる書式
つかマニュアルくらい嫁
31デフォルトの名無しさん:04/11/10 17:11:17
[ラベル:] 命令 アドレス [;コメント]<改行>
32デフォルトの名無しさん:04/11/11 10:15:42
本当にアドレスでいいのか
貴方は
33デフォルトの名無しさん:04/11/22 04:24:05
いや、そりゃアドレスがレジスタを指すことも、アドレス部が無いこともあるけど、
>31は>29に対するしゃれだから
34デフォルトの名無しさん:04/11/22 16:29:41
35デフォルトの名無しさん:04/12/07 03:22:22
パチンコ/パチスロ特殊技術裏掲示板
http://jbbs.livedoor.jp/sports/19329/index.htm
36デフォルトの名無しさん:04/12/07 12:16:52
細かい事考えずにnasm使えよ。
37デフォルトの名無しさん:05/02/03 05:04:00
アセンブラを学ぶにはどの本からはいるのがいい?
38デフォルトの名無しさん :05/02/03 05:13:49
>37
CPU書かんと答えようが無い。
39デフォルトの名無しさん:05/02/03 05:51:08
6809
40デフォルトの名無しさん:05/02/03 20:48:59
情報処理なんとか試験の教科書でいいんじゃない?
そうなん?
42デフォルトの名無しさん:05/02/03 20:54:55
CASLはこれ使って実用的なものはほぼ作れないとはいえ、
その分仕様がシンプルだからね。勉強には良い。
CASLって話には聞いたこと歩けど、使ったことないなぁ。
44デフォルトの名無しさん:05/02/03 21:02:40
CASLは使う物じゃなくて勉強する物だからね。

当たり前だけど、CPUによって命令がばらばら共通仕様が無い言語から
どのCPUにでもあるであろう命令のみをシンプルに集めた物。
45デフォルトの名無しさん:05/02/04 00:02:54
そこでCAP-Xですよ。
46デフォルトの名無しさん:05/03/05 03:00:28
bcbでアセンブラを使いたいのですが、何をそろえればよいのでしょうか?
47デフォルトの名無しさん:2005/04/04(月) 13:28:37
アセンブラの"IN"コマンドって何をするんですか?
エミュレーター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
48デフォルトの名無しさん:2005/04/04(月) 14:16:28
>>47
入力ポートからの読み込み。
つーか、そのくらいマニュアルに書いてあるが。
その例だと、0x2fdポートから読み込んだデータの最下位ビットが0の間ループし、
その後0x2f8ポート、0x2faポート、0x2fcポートから順次読み出してスタックに積み、
最後に積んだ結果のアドレスに戻ろうとしてアボーンする。
49デフォルトの名無しさん:2005/04/04(月) 14:23:07
てんきゅ!
50デフォルトの名無しさん:2005/04/04(月) 16:13:32
内容:
Cコードからキーパッドを使って固定小数点をタイプし、
その打ち込んだ全ての固定小数点とその合計を足したものをLCDに
ディスプレイするという問題なのですが、以下のコードを書きました。
小数点をLCDにディスプレイする事は成功したんですが、その数字の
足した合計をディスプレイするのにてこずってます。
コードが多少長いですが、もし何か気づく点があったら指摘お願いします。


51デフォルトの名無しさん:2005/04/04(月) 16:18:58
void main(void)
{
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();
52デフォルトの名無しさん:2005/04/04(月) 16:19:28
if((x >= '0') && (x<='9'))
{
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);
}
{
53デフォルトの名無しさん:2005/04/04(月) 16:19:55
{
int 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);
}
54デフォルトの名無しさん:2005/04/04(月) 16:37:15
まるち (メ)!
55デフォルトの名無しさん:2005/04/04(月) 17:14:58
>>50
>気づく点
固定小数点って何? 固定小数点小数のこと?
合計の計算ができないのか、出力ができないのか、自力で分離できない?
そんな環境依存のコードを見せられても解析するのも面倒なんだけど。
#つーか、マルチかよ!
56デフォルトの名無しさん:2005/04/04(月) 17:42:21
うるせーたーこ。
57デフォルトの名無しさん:2005/04/04(月) 20:01:52
それが人に物聞く態度か?
甘ったれチャンは自己解決しろ(ぷ
58ビル・ジョブス: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が定数だったりするとコンパイラのオプティマイズで三項演算コードも生成されない。

やっぱりローテート演算子要らないな。
59デフォルトの名無しさん:2005/04/05(火) 06:14:09
ローテートをサポートしているcの方言もあるけど、ワード/バイト内のローテートだけで
ROTATE with CARRY はまずないね。 欲しいのはこちらなんだけど。
ポートサンプリング処理などで、CY<--port, A<--byte, RRC/RLC A, byte<--A とやると
高速なコードにできるのだが、cだとシフトしてからportを判定して左端か右端をORするコード
にするしかない。
60デフォルトの名無しさん:2005/04/05(火) 13:33:43
>>47
(´-`).。oO(コマンド?)
61デフォルトの名無しさん:2005/05/15(日) 09:42:57
初心者はアセンブラに手を出さない方がよいのでしょうか?
コンパイラの最適化よりなかなか速くなりません。
62デフォルトの名無しさん:2005/05/15(日) 09:52:28
>>61
まずはコンパイラの出力をさらに最適化することから始めれば良い
63デフォルトの名無しさん:2005/05/16(月) 04:43:47
>>61 たとえばこういうとこ。lifeboatのH83シリーズで
  rxsft2 >>= 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:
6463:2005/05/16(月) 04:50:58
ポート8のbit0をrxsft2というchar変数に右シフトして取り込むコードだけど、
cでは上のように書くしかない。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  ;これで同じ結果が得られる。
変数がワードでも同じ手法が使える。割り込み処理などぎりぎり速くしたい部分は
こういう書き方をするよ。
65デフォルトの名無しさん:2005/05/25(水) 22:57:10
>>6
7.バイナリ配布のソフトを弄らんとならんとき
66デフォルトの名無しさん:2005/05/28(土) 20:48:10
{ void *code = ©_row;
__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環境です。

67デフォルトの名無しさん:2005/05/29(日) 14:17:28
>>66
char 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;
68デフォルトの名無しさん:2005/05/29(日) 18:29:58
>>67
どうもありがとうございます!
69デフォルトの名無しさん:2005/05/30(月) 05:56:47
質問します!

ライブラリとかを複数の環境に対応するように作成するとき、
だいたい何種類ぐらいの環境に対応させるものですか?

たとえば
文字ライブラリや数学ライブラリを環境依存無くかつ高速で動作させるには、
アセンブラを使わざる終えないでしょうが、どんなCPUに対応しますか?
x86系CPU や Alpha の他にはなにがありますか?
70デフォルトの名無しさん:2005/05/30(月) 06:53:34
>>69
H8 と Z8000 と SX-8
71デフォルトの名無しさん:2005/05/30(月) 07:01:22
>>70
ありがとうございました。
一般的かつ平均的に5種類のCPU用にアセンブラをマスターすれば、
高速な汎用ライブラリをとりあえずは書けるということになりますね。
72デフォルトの名無しさん:2005/05/30(月) 08:54:54
>>71
なりません。
73デフォルトの名無しさん:2005/05/30(月) 13:22:05
Cとアセンブラで書いとけばほとんど賄える
74データボックス:2005/05/31(火) 01:35:28
俺はまだ、高級アセンブリ言語でしかWindowsプログラムを作れないが、
アセンブリ言語を学習してWindowsプログラムを作りたい。
75デフォルトの名無しさん:2005/05/31(火) 08:50:01
H8マイコン?
Z800016bit?
SX-8スパコン?
で、iMacのサポートは?ふつうはPCとWSで動けばいいじゃん。
76デフォルトの名無しさん:2005/05/31(火) 13:11:44
>>75
ポケコンとワンダースワン?
77デフォルトの名無しさん:2005/05/31(火) 21:10:45
PCとWSがターゲットのライブラリなら普通は高級言語で書くと思うが。
78デフォルトの名無しさん:2005/06/25(土) 20:52:26
ワンダースワンはV30MZ(16bit-x86互換)。
79デフォルトの名無しさん:2005/06/26(日) 03:44:03
C言語+Windows APIを使っているのですが、 
最大化やウィンドウのリサイズを禁止するにはどうすればいいんでしょうか? 
最小化はそのまま使えるようにしたいのですが… 
80デフォルトの名無しさん:2005/06/26(日) 04:26:31
最大化やリサイズのイベントを見張れば?
81デフォルトの名無しさん:2005/06/26(日) 11:37:22
つーか、マルチすなや。
82デフォルトの名無しさん:2005/11/20(日) 23:55:11
スレチガイかもしれないけど、

main(){
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 デス
83デフォルトの名無しさん:2005/11/20(日) 23:56:49
モダンなコンパイラがやる以上のチューニングを
人手で出来るケースや能力ってかなり限定されてるんじゃないか?
84デフォルトの名無しさん:2005/11/21(月) 00:01:52
mov edx, s;
mov dword ptr [edx], eax;
85デフォルトの名無しさん:2005/11/21(月) 00:06:32
>>84
ありがとうございました。
86デフォルトの名無しさん:2005/11/21(月) 23:21:14
>>83
最新のインストラクションを使う場合は書かざるえないんですが。
87デフォルトの名無しさん:2005/11/22(火) 14:55:49
そうだね。
それだけだけど
88デフォルトの名無しさん:2005/11/22(火) 16:28:28
俺の仕事のCPUにモダンなコンパイラなど無い
89デフォルトの名無しさん:2005/11/22(火) 18:33:29
俺の仕事のCPUにモダンなCPUなど無い
90デフォルトの名無しさん:2005/11/22(火) 18:55:59
コンパイラぐらい書けよ
91デフォルトの名無しさん:2005/11/22(火) 19:07:50
仕事なら
Cで書ける時は全てCで書く
どうしてもアセンブラじゃないと書けないときだけアセンブラで書く。

趣味なら
面白そうな方で書く
92デフォルトの名無しさん:2005/11/22(火) 19:20:36
Cで書くときでもC++コンパイラが使えるのならBetter CとしてC++を使う。
93デフォルトの名無しさん:2005/11/22(火) 19:52:12
>>90
コンパイラ書く手間工数に入れていい?
94デフォルトの名無しさん:2005/11/22(火) 22:30:13
おれも92のスタイル。
new,delete コンテナはできれば使いたい。
95デフォルトの名無しさん:2005/12/05(月) 15:15:01
超音波をAD変換させてポート1に出力したいのですが
#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;
}
}

どこがいけないのでしょうか?


96デフォルトの名無しさん:2005/12/05(月) 15:48:39
以上が課題の全文です。
よろしくお願いします。
97デフォルトの名無しさん:2005/12/05(月) 16:07:26
98デフォルトの名無しさん:2005/12/05(月) 18:47:45
>>95
3048.hの中身が分からない事には、何も言えません。
本の中身を、タイトルだけ見て当てろと言ってるのと同じだよ。
99デフォルトの名無しさん:2005/12/06(火) 08:20:27
>>98

>>97 のリンク先の人たちにとっては 3048.h の中身は stdio.h と同じくらい常識ですよ
100デフォルトの名無しさん:2005/12/06(火) 10:05:19
>>99
じゃあそのスレで質問しろ。
状況判断能力のない奴だ。
101デフォルトの名無しさん:2005/12/06(火) 11:25:17
(・∀・)ニヤニヤ
102デフォルトの名無しさん:2005/12/06(火) 15:25:26
>>95
3048.hってもしかしてルネサスのCPUじゃない?
ADってA→Dコンバートだから入力なんだが・・・
103デフォルトの名無しさん:2005/12/06(火) 16:03:59
全然、知らないけど、

超音波装置:電圧出力 → AD変換でデジタル値に変換
そのデジタル値を出力ってこと?
デジタルの出力ってどんなの?
104デフォルトの名無しさん:2005/12/06(火) 16:16:56
>>95
> どこがいけないのでしょうか?
お前の無能力
105デフォルトの名無しさん:2005/12/06(火) 16:35:09
>>103
普通は
DA変換でデジタル値をアナログ電圧に変換 → 超音波装置:電圧入力
106デフォルトの名無しさん:2005/12/06(火) 21:22:23
>>105
そうすると>>95は実は、>>105の意味?
107デフォルトの名無しさん:2005/12/06(火) 21:30:04
>>106
>>95はADコンバートのスキャン開始を設定しているだけ
H8/3048のAD端子にかかっている電圧を一定時間毎に
デジタル値に変換してCPUの内部レジスタに転送してくれる機能が
あるんだけど、それを作動させたにすぎない
無論、超音波なんて出ない
108デフォルトの名無しさん:2005/12/06(火) 21:38:42
>>107
つーことは、>>102が正解ってことか。
109102=105=107=109:2005/12/06(火) 21:40:46
>>108
つーかそれ、俺
110デフォルトの名無しさん:2005/12/06(火) 23:36:47
>>109
つーことはあなたと私と二人で会話をしていたわけか・・・
111ハーピィ:2005/12/17(土) 18:43:53
E・∇・ヨノシ <111ゲット♫
112デフォルトの名無しさん:2006/03/23(木) 11:30:12
↑ばーか
113デフォルトの名無しさん:2006/04/13(木) 07:04:09
優れたトップというのは、なかなか常人には理解できないもの。そういうトップのもとでは出世一つとってみても、
なかなか難しいものであるし、出世できたとしても真正面からトップと対峙するので、さらに仕事は難しくなる。
その典型例として、現実の世界を例にとるとあまりにドロドロした話となってしまうので、「宇宙戦艦ヤマト」にお
けるデスラー総統とヒス副総統(将軍)の関係から、どういった処方があるのかを見ていきましょう。
114デフォルトの名無しさん:2006/04/13(木) 07:05:46
「宇宙戦艦ヤマト」の内容については、いちいちここでは取り上げません。
ヤマトの敵方として設定されている大ガミラス帝国は、デスラー総統を絶
対的指導者としている独裁国家です。設定そのものの多くをナチスドイツ
に求めることができるので、そういったものだという理解があれば十分です。
その絶対的指導者の副官としてヒスという人物があるのですが、おそらく
彼は天賦の才で副官に登りつめたのではなく、官僚的な指導者層の中から
この地位を得たと思われ、組織的な根回しには向いているが、対外的な
処方についてはあまり得意ではないように感ずる人物です。
まずは、この二人のやり取りから行ってみましょう。
115デフォルトの名無しさん:2006/04/13(木) 07:06:43
太陽系を脱出したヤマトは、ガミラス絶対防衛圏にさしかかる。そこで、それまで小事と考えられて
きたヤマトについて、デスラー総統に経過を説明する必要が生じた。説明担当はもちろん、副官的
位置付けにあったヒス将軍(当時は副総統ではなかった)。

ヒス 「ヤマトの愚かな航海ぶりについてご説明いたします。」

と切り出し、地球から太陽系脱出までの概略について説明し、その説明途中で、

ヒス 「木星にある我が前線をピストルで撃破…」

という表現を用います。すると、すかさずデスラー総統は、

デスラー 「ヒス君、ピストルだったかねぇ。」
ヒス 「は、波動砲とやらですが、私の目にはピストルみたいなもので…」
デスラー 「君の感想はいらん。事実だけを報告しなさい。」
116デフォルトの名無しさん:2006/04/13(木) 07:07:49
というやりとりで、ご機嫌取りの様子がありありと伺えるヒス将軍の説明を揶揄します。
実際、ビジネスの現場でも見られるやり取りですね。ということで、ヒス将軍はその後
の説明を「ようするに〜」とあっさり終わらさざる得ず、せっかく用意していたであろう
台本は意味を失します。そこで、すかさずフォロゥに入ったタラン将軍(「さらば宇宙戦艦ヤマト」
では、デスラーのいい副官としての登場だったが、本作ではドメル将軍軍事裁判等で
あまり良い印象はない)。総統の名をいただいたというデスラー機雷の説明を行い、最後に

タラン 「ヤマトが紙飛行機よりも脆く燃え果てる様を、夕食後の座興に総統に
お楽しみいただきたく、ご連絡申し上げたわけでございます。」

と、ヤマト航海経過の報告から、デスラー機雷によるヤマト殲滅の説明へと鮮やかに
話題を転換(ヒス将軍からタラン将軍への主役交代)。デスラーの損ねた機嫌を
回復しようとします。それに対しデスラーも、

デスラー 「いや、ありがとうタラン将軍。面白いアトラクションを用意してくれて
今宵の酒は一段と味がよいだろう。」

と返します。そして、やや不満が残りながらも次の言葉を続けます。
117デフォルトの名無しさん:2006/04/13(木) 07:09:34
デスラー 「諸君、宇宙戦艦ヤマトの無事を祈って乾杯しようではないか。」

と。しかし、この言葉が終わらぬうちに、ある将軍は急に馬鹿笑いをはじめ、

某将軍 「はっはっはっはっはっ…、ヤマトの無事を祈ってか、これは面白い。
総統も相当冗談がお好きで…。はっはっはっはっはっ…」

と顰蹙を買う行為を始めたのです。これでは、せっかくフォロゥを入れたタラン将軍の
苦労も水の泡。哀れ、自業自得とはいえ、この将軍は抹殺されてしまったのです。
ヒス将軍によって損なわれた機嫌が、何とかタラン将軍のフォロゥで良くはなった。
しかし、完全ではなく、ヒス将軍に対する不満は下品な男(デスラー総統評)に
すべて被さる結果となったものの、しこりが残ったのは間違いないと見ていいでしょう。
118デフォルトの名無しさん:2006/04/13(木) 07:58:03
そして、せっかくのご機嫌取りのデスラー機雷によるヤマト封じ込めは失敗。
この一部始終をビデオモニタで鑑賞していたデスラー総統は、

デスラー 「ヤマトの最期が見られなかったが、結構楽しいショウだった。諸君! 
私への心遣い、深く感謝しよう。私はゆっくり眠りにつくとしよう。おやすみ、諸君。」

と精一杯の強がりを言った後、

デスラー 「あぁ、ヒス君。ヤマトの艦長は何と言ったかね?」
ヒス 「オキタ…、でございますが。」
デスラー 「オキタか、お見事だったと祝電を打ってやってくれ。デスラーの名でな。」
ヒス 「はい、デスラー総統。」

というやりとりで、ヤマト艦長沖田に『ヤマト諸君の健闘をたたえる。今後の対決が楽しみだ。
ガミラス総統デスラー』という内容の祝電を打ったのです(ヤマトでは、祝電の発信源を
なぜ捉えなかったのかと沖田艦長が相原を叱責する場面がある。こういうこだわりが当時としては凄かった)。
119デフォルトの名無しさん:2006/04/13(木) 08:01:01
ヒス将軍は、なぜヤマトに祝電を打ったのかというデスラーの真意は伝わっていないでしょう。
それが証拠に、デスラー機雷突破後のデスラー自らが考案した作戦が失敗したときの以下の
やりとりから、それを十分に汲み取ることができます。

(デスラーの寝室に報告に上がるヒス将軍。)
デスラー 「な・に・ご・とだね、ヒス君。まぁ、入りたまえ。」
ヒス 「はぁ。(しばしの沈黙)。総統、ヤマトのことで…。」
デスラー 「ヤマトなぞの最期を報告せんでいいと言った筈だ。」
ヒス 「いえ、それが……。切り抜けました。」
デスラー 「なにぃっ!」
ヒス 「総統のガスはコロナの中におびき寄せられ焼き尽くされました。ヤマトは前に立ちはだかるコロナを波動砲で粉砕し、見事な作戦です。艦長オキタに祝電を打ちましょう。」
デスラー 「祝電? ヒス将軍、君はバカかね?」
ヒス 「はぁっ?」
デスラー 「もういい、戻って休みたまえ。」
ヒス 「はっ! 総統、ばんざい!」

どこがどう、ということは敢えて指摘しませんが、こういう部下を持つ上司は辛いと
感ずるところです。では、優れた対応とはどういうものなのか。それは、ドメル将軍
凱旋の時のデスラーとのやり取りの中に見ることができます。短いやり取りながら、
デスラーの意を十分に汲んだやり取りだといえましょう。
120デフォルトの名無しさん:2006/04/13(木) 08:03:27
ドメル 「総統、ちょっと小耳に挟んだのですが、ヤマトは冥王星基地を破り、太陽系から外へ出てきた。」
デスラー 「ふっふっふ、目下、銀河系をうろうろしてるようだがな。暇つぶしにからかってやったのだ。」
ドメル 「総統、よろしければ私が捻り取ってまいりましょう。」
デスラー 「はっはっ、また君に勲章が一つ増えるだけだろうが、ま、休養半分で軽くやってきてもらおうか。」
ドメル 「はっ、かしこまりました。」

これである。
ドメル将軍凱旋後、ヤマト撃破はドメル将軍の担当となる。バラン星での作戦が失敗し、責任を問われる
ドメル将軍は軍事法廷で死刑を宣告される(軍事法廷の責任担当はヒス副総統)。その判決の署名を
デスラー総統に持ち込むヒス副総統だったが相手にされず、判決書は破り捨てられ、ドメル将軍に
男としての最後のチャンスを与えた。
一方、ガミラス本星での戦いで、勝ち目のない戦いに和平を進言したヒス副総統は、デスラーに
射殺される(珍しくまともな進言だったのに)。もし、和平を進言したのがヒス副総統でなく、
亡きドメル将軍だったなら結果は同じといえるだろうか。

「宇宙戦艦ヤマト」というのは、お話であるからあまりそういったことを考えても仕方がないことかもしれない。
だが、しかし、たかがお話だからこそ見えるもの、示唆できるものがあるのも事実だろう。
所詮、社会は人付き合い。そういったものなのだから、教訓として得られるものであれば積極的に吸収していきたいものだ。
121デフォルトの名無しさん:2006/04/17(月) 22:39:54
パチンコ&スロット解析用ソケット

メイン基盤上のチップLE2080,2280,4280のプログラムが
市販品のロムライターで読み込みできます。
確率や連チャンの仕組みが一目瞭然!
攻略法はあなた自身で見つける時代です。

http://www.3-you.com/
122デフォルトの名無しさん:2006/04/27(木) 23:41:53
保守
123デフォルトの名無しさん:2006/06/12(月) 16:54:11
アセンブラって今時使う意味あるの?SSEだって、コンパイラが自動的に使ってくれるというのに、
使うとしたらどんな時?
124デフォルトの名無しさん:2006/06/12(月) 17:08:11
この処理は全体の90%で登場するからとかいうケース
125デフォルトの名無しさん:2006/06/12(月) 17:42:18
>>123
何で PC (しかも x86) 前提?
126デフォルトの名無しさん:2006/06/12(月) 18:16:35
>>123
前人未到なトリッキーアルゴリズムを実装するとき。
コンパイラがAI積んだエキスパートシステムになる時代がくるまでは
まだまだ人間の頭脳が役立つ時はある。
127デフォルトの名無しさん:2006/06/13(火) 03:46:32
趣味の話しだけどCが苦痛の人もいます
アセンブラの方がやりやすくてイライラする
そういう場合に使う
128デフォルトの名無しさん:2006/06/13(火) 05:17:36
>>127
きみ なんさい?
おじさんに こっそり おしえてよ。
129デフォルトの名無しさん:2006/06/13(火) 15:28:18
先週、アセンブラでチューニングしたら、コンパイラの吐いたコードの四倍の速さで処理が終わったよ。
処理がいっぱいいっぱいだったのにCPUのHALT期間が七割くらいになったんでそれなりの省電力も。
130デフォルトの名無しさん:2006/06/13(火) 18:17:21
>>129
それなんてダメコンパイラ?
まさか最適化の指定をしてないなんて落ちじゃないよな。
131デフォルトの名無しさん:2006/06/13(火) 18:34:43
>>129

当然 VTune 使ったんだよね!?
132デフォルトの名無しさん:2006/06/13(火) 19:48:54
>>128
20代後半くらい
133デフォルトの名無しさん:2006/06/13(火) 20:34:27
>>130
実はしていない。
最適化するとエラーでコンパイルが通らなくなる駄目コンパイラなんだよ。まじで。
134デフォルトの名無しさん:2006/06/13(火) 20:38:47
あー、言っておくが、下手すると現時点で俺しか使ってないかもしれないようなマイナーCPUでのこと。
このたびめでたくCPUがディスコンになる運びだ。
135デフォルトの名無しさん:2006/06/16(金) 01:39:43
そんなコンパイラは窓から投げ…… あ、ディスコンなのね。
136デフォルトの名無しさん:2006/06/19(月) 12:03:56
>>128
俺は年齢より、>127 の日本語歴が気になる。
137デフォルトの名無しさん:2006/08/14(月) 09:31:08
単純計算のCのソースと、それをそのままインラインアセンブラに書き換えたソースとを
実行速度で比較して、「ほらこんなに違うでしょ」という良い例あるかな。
138デフォルトの名無しさん:2006/08/14(月) 09:36:48
自動ベクトル化の性能って、今はどうなの?
コレが出来ない限り人間じゃなきゃ出来ない最適化って多そうな。
ベクトル化されたクラスを使えば少しはよくなったりするのかね。
139デフォルトの名無しさん:2006/08/14(月) 10:01:46
漏れ程度のアセンブラの知識では、iccの自動ベクタ化を上回る速度は出なかったよ。
まぁ、人間ならではの分岐予測やループ回数予測はできるけどね。
#でもそれらはプロファイリング最適化やプラグマ指定でも同じことができるわけだけど。

少なくともループの中身だけをインラインアセンブラ化しても全く太刀打ちできないと思う。
140デフォルトの名無しさん:2006/08/14(月) 10:11:01
>>137
Z80辺りなら殆どアセンブリの勝ちだな
スタックフレームまで展開してくれるコンパイラがあれば話は別だが
141デフォルトの名無しさん:2006/10/12(木) 02:43:18
はげ
142デフォルトの名無しさん:2006/10/13(金) 16:18:52
C言語をアセンブラに変換するにはどうすればいいですか??
はじめたばかりなので分かりやすくお願いします.
143デフォルトの名無しさん:2006/10/13(金) 16:58:14
>>142
コンパイルする。
144デフォルトの名無しさん:2006/10/13(金) 17:14:10
マルチなのはいけないと思います
145デフォルトの名無しさん:2006/10/14(土) 07:01:15
146デフォルトの名無しさん:2006/10/14(土) 11:54:40
>>137
実際試したわけじゃないが、たとえばbyteを上下のニブルに対応するASCIIコードに
変換する関数なんかは、アセンブラなら十進補正命令使って効率よく書けるけど
Cのコンパイラでそこまで知恵が回る奴はないだろうな。
147デフォルトの名無しさん:2006/10/19(木) 01:02:30
コンパイラを作るのにアセンブラって必要なの?
148デフォルトの名無しさん:2006/10/19(木) 01:56:34
必要ではない
149デフォルトの名無しさん:2006/10/20(金) 01:21:25
いまさらアセンブラを勉強して何になるの?
組み込み系のしごとでなけりゃ、使うことねーよ。
150デフォルトの名無しさん:2006/10/20(金) 01:32:56
>>149
趣味の人は大いに役立つ。

ていうかC言語の理解の助けにもなる。
151デフォルトの名無しさん:2006/10/20(金) 09:58:50
チートコードとか?
152デフォルトの名無しさん:2006/10/20(金) 10:53:49
>>149
32bit同士の掛け算は結果が64bitになる。
Cでも書けるが時間が4倍かかってしまう。
これは遅すぎて耐えられない。
153デフォルトの名無しさん:2006/10/20(金) 11:02:16
>>152
たった4倍
10秒が40秒になるんだったら遅すぎて耐えられないだろうけど
1/100msecが4/100msecになったところでたいした変わらないだろ
154デフォルトの名無しさん:2006/10/20(金) 11:44:54
>>152
何が遅いって?
誰が何を耐えられないって?
155デフォルトの名無しさん:2006/10/20(金) 12:27:33
>>153
アホだろお前さんw
156デフォルトの名無しさん:2006/10/20(金) 12:44:37
>>155 アホ決定!!!
157デフォルトの名無しさん:2006/10/20(金) 13:30:26
>>155 は三国無比のアホ!!!
158デフォルトの名無しさん:2006/10/20(金) 14:53:23
>>153
もちろん10秒が40秒になるケースの話だろ。
こういうときアセンブラは役に立つ。
159デフォルトの名無しさん:2006/10/20(金) 19:20:26
呼出回数が多い部分はアセンブラで書くことを検討すべきだな。
160デフォルトの名無しさん:2006/10/21(土) 06:08:32
呼び出し回数を減らすのが先
161デフォルトの名無しさん:2006/10/21(土) 10:49:46
>>160
馬鹿の発想だね
まあ馬鹿でないのならまともなプログラマの発想とは思えん
まともじゃない、というのは理念的には正しくても非現実的ということだ。
162デフォルトの名無しさん:2006/10/21(土) 11:00:37
>>160 は空前絶後の馬鹿
163デフォルトの名無しさん:2006/10/21(土) 11:06:49
まあたぶん学生クンがアルゴリズムの講義で習ったことを
そのまま言ってるんだろうけどね。

もちろんアルゴリズム上の工夫で計算量を減らすのは用途によっては致命的重要だけど、
そんなのこの話の自明の前提だろうに。
164デフォルトの名無しさん:2006/10/24(火) 11:12:00
呼び出し回数を減らしても、一億回が五千万回にしかならないこともあるのだ。
一億回が27万回に減ったとしても、呼び出された部分を高速化することには意味がある。
165デフォルトの名無しさん:2006/10/24(火) 11:15:55
一億回が五千万回になるなら十分にやる価値はあると思うが
166デフォルトの名無しさん:2006/10/24(火) 11:37:23
呼び出し回数を減らした後の話じゃないのか?
167デフォルトの名無しさん:2006/10/25(水) 12:49:11
プロファイルして決めろ馬鹿ども
168デフォルトの名無しさん:2006/10/29(日) 19:33:14
呼び出し回数を減らすのはそもそも最初にやることだろ。
そんなことは自明なんだよ。
その上で最適化の必要があるのならやらないと。
169デフォルトの名無しさん:2006/11/07(火) 15:09:42
へたくそなCはアセンブラに劣る。
設計を知らない奴に何もできない。
170デフォルトの名無しさん:2006/11/22(水) 04:15:10
ロボットのプログラムって今でもアセンブラ?
171デフォルトの名無しさん:2006/11/22(水) 06:49:15
どのロボットだよ
172デフォルトの名無しさん:2006/11/22(水) 07:41:11
お前のことだよ
173デフォルトの名無しさん:2006/11/22(水) 08:10:58
はわわ〜わたしですか?
174デフォルトの名無しさん:2006/11/22(水) 08:40:11
10年前だけどCだったよ。
175デフォルトの名無しさん:2006/11/22(水) 08:44:24
MINDSTORMSはNQCとかRobot CとかCに似たのが多いな。
面白いやつだとドトネトのサブセット実装とか。
176デフォルトの名無しさん:2006/11/22(水) 17:43:38
カブロボはJavaだよ
177デフォルトの名無しさん:2007/01/02(火) 16:51:21
PICは Cよりもアセンブラで書くのが一般的なんですかね?
178デフォルトの名無しさん:2007/01/03(水) 01:10:49
インテル86系の話ね。
DISK-BIOS位だと、アセンブラで書いた方が小さくて速いコードが書けた。
しかし、先日MS-Windowsのディスクドライバを逆アセンブルしたら、ある意味で非
人間的な最適化が掛かっていてビックリした。
要は、バイト数の少ない命令を使うことと、分岐をできるだけ減らすことで高速化
(というか正確には分岐予測失敗によるパイプラインの乱れをなく)してあるんだ
が、人間だとこんなコト考えつくかよ、と思うような論理演算と算術演算を使って、
条件分岐をなくしてあった。
コンパイラも進化したものだね。
179デフォルトの名無しさん:2007/01/03(水) 02:37:08
やっぱPICマイコンには Cがいい?
180デフォルトの名無しさん:2007/01/10(水) 22:30:11
PICマイコンより78K使った方がいい。
181デルフォトの名無しさん:2007/02/11(日) 22:07:03
;************as_first.asm************
CODE 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行目でエラーが出るんだが何故だろう?
182デフォルトの名無しさん:2007/02/11(日) 22:22:19
>>181
全角スペースを表示できるエディタを使おう。
Oと0の判別し易いフォントを使おう。
擬似命令について勉強し直そう。
183デフォルトの名無しさん:2007/02/12(月) 10:00:36
これはひどい
184デルフォトの名無しさん:2007/02/12(月) 17:18:50
>>182
なるほど

>>183
お恥ずかしい
確かにひどい間違いやらかした
185デフォルトの名無しさん:2007/02/12(月) 17:25:59
うわ
186デフォルトの名無しさん:2007/02/22(木) 04:17:39
ゆたぽんフォントを使ってみては?
ttp://net2.system.to/pc/font.html
187デフォルトの名無しさん:2007/04/09(月) 15:20:54 BE:203011182-2BP(77)
age
188デフォルトの名無しさん:2007/04/09(月) 17:16:05
まぁ、OS作るのにはアセンブラのほうが良い
189デフォルトの名無しさん:2007/04/09(月) 17:47:17
んなこたーない。
190デフォルトの名無しさん:2007/04/10(火) 00:26:45
なにごともアセンブラで作れればそれに越したことはないんじゃないの
容量の制限やアセンブラにしか出来ないこと以外は生産性とのバランスの問題らよ。
191デフォルトの名無しさん:2007/04/10(火) 14:48:32
>>190
>生産性とのバランスの問題らよ。
が解っていながら
>容量の制限やアセンブラにしか出来ないこと以外は
この作為的な前提条件は一体。
192デフォルトの名無しさん:2007/04/10(火) 15:22:04
生産性は大して変わらないが移植性が明らかに落ちるのが問題
193・∀・)っ-○◎●:2007/04/15(日) 15:21:28
>生産性は大して変わらない

構造化されてないスパゲッティコードばっかし書く人ならそうだな
194デフォルトの名無しさん:2007/04/15(日) 19:16:13
>>193
馬鹿が背伸びして話題に参加することないのにw
192の言っていることは疑念の余地無く正しいし、それが分からないとしたら
アセンブラでコーディングしたことがないんだろうな。
195・∀・)っ-○◎●:2007/04/15(日) 19:39:43
>>194が背伸びしてる馬鹿であることは疑念の余地無いな。やったことないだろ。

他人のコードを読んだり、改修することまで視野に入れれば
処理系によっては構造化マクロがあるのは知ってるが

足し算を1行追加するのなんてたあいもないが、
アセンブリだと下手すりゃレジスタの割り当てを変え
しないといけないことだってある。

>アセンブラでコーディングしたことがないんだろうな。

ないよ。アセンブリ言語でコーディングはたまにやるけど。
アセンブラはバイナリコードの生成に使う。
196デフォルトの名無しさん:2007/04/17(火) 14:24:44
ダンゴ如きに同意なんぞしたくはないが、これには全面同意せざるを得ない。
197デフォルトの名無しさん:2007/04/17(火) 20:40:42
環境と規模による気も駿河。
レジスタが非常に直交性のいい奴か、逆にレジスタが非常に少ない奴だと
そのあたりを気にしなくていい(気にしようが無い)から慣れてればどんどん組んでいける。
いわゆる80系(Z80とか8086あたり)の奴が一番難しいんじゃないかな。
それでもダンプでデバッグできる人がいたりするから、
凄腕なら実は生産性が変わらなかったりして。

最近アセンブラレベルで扱う必要があった石が、これの両極端なんだよね。
片方はそもそも扱えるリソースが少ないのに直交性の高いレジスタが16個。
方や16bitのアキュムレータが二つ、インデックスが二つだけで選びようが無い。
当然PCやSPは別にあるけど。

関係ないが、仕事の回路図に乗っかってた32bitの石のデータシートを見たら、
レジスタセットがZ80の拡張で吹いた。まだこのアーキテクチャ生きてるんだ。
198デフォルトの名無しさん:2007/04/17(火) 21:10:46
一部の専門学校では現役のようです
http://pc11.2ch.net/test/read.cgi/tech/1161097445/464
199デフォルトの名無しさん:2007/04/17(火) 23:28:28
>>194
こいつアセンブラでしかコーディングしたことないのか

16bit時代のWindows3.0だってアセンブラで書かれているのはほんの一部でしかない。
明らかに移植性より生産性を重視しての選択だろ
アセンブリ言語はコードを書くための生産性もそうだが
バグつぶしにかかる時間が高級言語に比べ明らかに落ちる
200・∀・)っ-○◎●:2007/04/17(火) 23:38:11
アセンブラはやったことあるけど高級言語の苦手なロートルって
リアルで知ってる
201デフォルトの名無しさん:2007/04/17(火) 23:51:55
>>200
そういうロートルにSIMD書かせたらいいんじゃね?w

>>197
>それでもダンプでデバッグできる人がいたりするから、
特定のニモニックを覚えているだけのレベルなのか、
アセンブラ要らずのレベルを指しているのかによっても違うが。
202デフォルトの名無しさん:2007/04/18(水) 00:10:38
>>199
>明らかに移植性より生産性を重視しての選択だろ
ここは「移植性と生産性」って書かないと何の反論にもならないんじゃないの?
アセンブラのコードの移植性が高い、と言ってる人間が誰かいるか?

まあいいや。
さすがにアセンブラと、例えばCを比べたときに、
生産性や可読性がまったく変わらないとまではいえないけど、分野によっては
それほど大差がなかったりするのは経験上事実だと思う。
(逆にいうと、複雑なデータ構造をこねくりまわすようなプログラムは
確かにアセンブラでは辛い場合が多いとは思う。)

もちろんCみたいに文法の足枷がないぶん、ループや分岐といった「構造」が
浮き彫りになるようなコーディングスタイルをきっちり決めないとそういうわけには
いかないと思うけど。
203199:2007/04/18(水) 00:24:31
>>202に反論するけど別に>>194に反論してる訳じゃないし
第三者的な位置から言ってみただけ
ちょっと>>194が狭い世界しか知らない風なのに
「馬鹿」呼ばわりしたのもムカついたし
それに>>192から逆上って読めば理解できるかと思ったから
あえてクドくかかなかっただけ。


204199:2007/04/18(水) 00:38:59
ごめん今焼酎やりながら書いてるからなんか変になっちまったが
アセンブラの互換性の無さはは当たり前過ぎるし
昔から今に至ってMSはインテル系以外に移植するつもりは無いんだろうと
想像した上で、Cで書くメリットの中に移植性は眼中になかったと思ったからさ

まだ書いてること変かな?
205デフォルトの名無しさん:2007/04/19(木) 00:07:53
>>204
>昔から今に至ってMSはインテル系以外に移植するつもりは無いんだろうと
AlphaやMIPSやPowerPCのWindows NTのこともたまには思い出したあげて下さい・・・
206・∀・)っ-○◎●:2007/04/19(木) 00:30:34
箱○はWindows XP Embeded EditionのカスタムPPC64版が動いてる
207デフォルトの名無しさん:2007/04/19(木) 00:38:35
Windows CEのことも・・・あ、ドリームキャストは忘れてください。
208デフォルトの名無しさん:2007/04/19(木) 00:41:34
うちじゃ白黒二台とも現役なのに……
209デフォルトの名無しさん:2007/04/20(金) 12:58:46
>>208
黒って何だ?
#白はDreamCastなんだろうけど。
210デフォルトの名無しさん:2007/04/20(金) 13:25:36
サターンのことじゃないのか?あれOS載ってたっけ
211デフォルトの名無しさん:2007/04/20(金) 13:32:23
>>209
dreamcast R7
212デフォルトの名無しさん:2007/04/20(金) 15:35:30
PS3かとおもった<黒いの
213デフォルトの名無しさん:2007/04/20(金) 15:41:33
初代箱はWindows 2000のカスタム版だな
214208:2007/04/21(土) 03:34:29
>>211
そそ。最後のチャンスと思って買ったのよね。
215デフォルトの名無しさん:2007/04/21(土) 08:38:56
俺がアセンブラを使った例

1、キャリー・ボローを利用する場合
   例:多倍長加算、DDA・DDS

2、回転系の命令を使いたい場合

3、32x32=64の掛け算を使いたい

4、コルーチン等のコンテクスト保存や飛ばしリターンなんかのテクニック
  windowsだとコルーチンは自前だとスタック複数確保とか綺麗に出来ないしスレッドで十分
  飛ばしリターンは例外で十分だろけどさ

5、PCだとRDTSC
216デフォルトの名無しさん:2007/04/21(土) 10:14:26
> 32x32=64の掛け算を使いたい
これは最適化で使ってくれるコンパイラもある。
217デフォルトの名無しさん:2007/04/21(土) 11:04:40
>>216
俺がそれを知ったのは、とあるCソースのコメント
218デフォルトの名無しさん:2007/04/21(土) 11:33:17
DDA Digital Differential Analyzer
DDS Direct Digital Synthesis ?
219デフォルトの名無しさん:2007/04/21(土) 11:38:25
32x32は1024だよな
220デフォルトの名無しさん:2007/04/21(土) 11:45:38
アセンブラスレなんだから 32x32は9C4かも判らんし1244かも判らん
そもそもxが何かも判らん

221デフォルトの名無しさん:2007/04/21(土) 11:48:22
32bit整数かける32bit整数の結果を64bit整数に保存する命令を使いたい、の意味だと受け取ったが
222デフォルトの名無しさん:2007/04/21(土) 17:30:48
そんなの解っててネタレスしてるんだろうが無粋な八目
223デフォルトの名無しさん:2007/04/21(土) 18:10:50
八目鰻は鰻じゃないらしいね。
224デフォルトの名無しさん:2007/04/21(土) 18:14:45
voidさんがいると聞いて飛んできました
225デフォルトの名無しさん:2007/04/22(日) 01:59:01
あれは魚のうちでもとりわけ下等な奴らしいぞ
226デフォルトの名無しさん:2007/04/22(日) 14:36:38
八目鰻の目は二つ
227デフォルトの名無しさん:2007/04/22(日) 22:06:28
メクラウナギってのは名前変えるんだっけ
228デフォルトの名無しさん:2007/04/22(日) 22:27:05
メクラ>227って名前になるらしい
229デフォルトの名無しさん:2007/04/22(日) 22:36:32
当然、「目の不自由な人のような鰻」となります。
230デフォルトの名無しさん:2007/04/23(月) 11:03:54
割り込みのレスポンスがシビアなときには、とりあえずのコードをCで書いて
コンパイラにアセンブラ吐き出させて手で最適化するのはよくやる。
主に出入り口のレジスタ退避を減らすとかだけどね。
俺の仕事ではブロック入出力が多いんで、コンパイラが当ててくれなかった
組み込みループ命令とかを使って組みなおすことも多い。
231デフォルトの名無しさん:2007/04/23(月) 12:15:57
SHなんかは、Cである程度最適化(構造体のサイズを届く範囲にするとか)した後、
吐かれたアセンブラを必死で最適化したつもりのコード(多少サイズは小さい)が
実行させたら元より遅くなってしまったり・・・・
232デフォルトの名無しさん:2007/04/23(月) 16:31:11
RISCマシンでアセンブラなんて、狂気の沙汰だ。
233デフォルトの名無しさん:2007/04/23(月) 16:54:21
VLIWはちょっとイヤだがRISCならいけるだろ
234デフォルトの名無しさん:2007/04/26(木) 08:17:06
レジスタ沢山持ってるCPUだと、
割り込みで大量にレジスタ保存するコストが大きく
かつC言語は、レジスタを大量に使うように最適化されているので、
割り込みはアセンブラで書かなければいけないという事になりがち・・・・という話かな >>230

>>231はSHは命令のロードとデータの読み書きを巧くCコンパイラなら配分してくれるが
自作だとコードが短くなってもパイプラインが乱れてストールする事になることもあるという事だろ
SHは型番でそのあたりの事情が違うから、そのあたりの最適化はコンパイラに任せた方がいい。
最近のSHはレジスタバンク持ってるから、割り込みもC言語でOK
235デフォルトの名無しさん:2007/05/30(水) 22:31:00
Cで書いたら変数型の制約がうっとうしくてやってられんような場面ではアセンブラ便利。
つーか先にアセンブラ覚えた人間がC使うと、厳格な変数型チェックにぶち切れることになる。
「杓子定規にも程があるだろこのお役所コンパイラがぁ〜〜〜〜!!」とか何度叫んだやら。

逆にCから覚えた奴がCの「初めに変数型ありき」の感覚でアセンブラ使っても
大して速くも短くもならんし、ほとんどメリット無いだろな…
236デフォルトの名無しさん:2007/05/30(水) 23:03:41
C言語程度の緩い型チェックでぶち切れるなよ
237デフォルトの名無しさん:2007/05/30(水) 23:56:29
俺なんかvoid*が怖くてしょうがないよ
238デフォルトの名無しさん:2007/05/31(木) 01:43:44
型チェックはバグを減らしてくれるよ
239デフォルトの名無しさん:2007/05/31(木) 01:57:44
警告だけはしてくれるわな。バグを減らすのは相変わらずプログラマの仕事だが。

ま、警告だけでも大助かりなんだけどね。
警告がでたら闇雲にキャストしてコンパイラを黙らせる輩の気が知れん。
240デフォルトの名無しさん:2007/05/31(木) 06:30:27
>>234
漏れはCの型チェックで切れたことは一度もないぞw
Javaと勘違いしてるんじゃないのか?
241デフォルトの名無しさん:2007/05/31(木) 17:34:21
なら、こういうことしなければならない面倒くささかな?
union U
{
  int i;
  unsigned char b[4];
};
242デフォルトの名無しさん:2007/05/31(木) 18:12:03
>>241
そんな環境依存コードを書くぐらいならはじめからアセンブラを使う
243デフォルトの名無しさん:2007/05/31(木) 18:15:51
そして>>235へ戻る
244デフォルトの名無しさん:2007/06/02(土) 10:09:40
>241
文字列の解析なんかだともっと顕著だよな。
一度に4バイト照合出来るCPUでも、
C言語は1バイトずつ4回比較しろって思想で作られてるから。
245・∀・)っ-○◎●:2007/06/02(土) 18:41:57
>>241
それビッグエンディアンじゃないと使い物にならん
246デフォルトの名無しさん:2007/06/02(土) 20:46:26
なんで?

エンディアンが問題になるのは違いが見つかるときだけだろ?

ほとんどのケースでは違いがないことの方が多い

全ファイルにまたがって違いがあるならそれを比較する意味すらない


247ヒント: alignment:2007/06/02(土) 20:48:04
馬鹿ばっかりだな
248デフォルトの名無しさん:2007/06/02(土) 20:50:21
そろそろ UTF-32 の議論に移るべきだと思う
249デフォルトの名無しさん:2007/06/02(土) 22:57:00
>>247
納期間近の夜中に泣きながら原因を探し回ってようやく気が付くんだからほうっといてあげようよ
250・∀・)っ-○◎●:2007/06/03(日) 00:05:22
>>246
strcmpは一致するかしないかだけじゃなくて、違う場合は大小値
リトルエンディアンだと大小値が必ずしも一致しない

"hage と samaを32ビット



251・∀・)っ-○◎●:2007/06/03(日) 00:09:30
ミスった

strcmpは、一致しない場合は正か負かの値でどっちが大きいかを表すように仕様で決まってる。
"hage" と "sama" を32ビット値として評価した場合
ビッグエンディアンでint32としてすると先頭が上位になるから後者のほうが大だから
strcmpの仕様通りになるが
リトルエンディアンだと先頭の方が下位になるから前者のほうが大
252元組み込み屋:2007/06/03(日) 00:31:55
>251
それこそ環境に依存しているんじゃないの?
共用体でプログラムを組む場合、それこそ限られた環境で動かすからあんまり当てはまらない
253デフォルトの名無しさん:2007/06/03(日) 10:15:54
>>251
ソートする為の比較なら別だが
字句解析や、構文解析での比較なら、同じである事と一意に大小が比較できる事が要件なので
一意に決まるならどっちだろうと問題ないさ。
1バイトしか入力無い場合に他のバイトにゴミが入るような馬鹿な事をしていない限り
254デフォルトの名無しさん:2007/06/03(日) 11:16:45
しかしエンディアンの違いってホントいい迷惑だよ。
共用体もビットフィールドもその他も・・・・
255デフォルトの名無しさん:2007/06/04(月) 21:51:02
>>254
ビットフィールドもMSBから設定されるもののあればLSBから設定されるのもあって混乱する。
複数の仕事を同時にするときは注意w
256デフォルトの名無しさん:2007/06/04(月) 21:55:36
型の違う物同士を扱わなければ何も問題ないんだがな
257デフォルトの名無しさん:2007/06/04(月) 22:31:48
>>256
共用体の時点で異なる型でアクセスする訳でしょ。
ハードウェア周りは、同じペリフェラルでもバス幅とエンディアンが同時に変わると
レジスタのビットアサイン変わるから面倒。
ifdefだらけになってもややこしくなるから結局共用体もビットフィールドも使えない。
ハード周りでこそ使えると便利なんだけどなぁ。
258デフォルトの名無しさん:2007/06/04(月) 23:20:41
>共用体の時点で異なる型でアクセスする訳でしょ。

まずはその発想を捨てれ。どこぞのスレでも話題になってたが、それは規格違反だ。
259デフォルトの名無しさん:2007/06/04(月) 23:23:10
「型」という概念を持つ限り、ビットやバイトの並びはC言語の範疇ではない。
そこでアセンブラが使えるわけだ。
260デフォルトの名無しさん:2007/09/30(日) 17:02:13
特技にイオナズンとありますが・・・
261デフォルトの名無しさん:2007/10/23(火) 08:03:24
>>3
センズリに見えたよ
262デフォルトの名無しさん:2007/10/24(水) 17:00:27
C言語で再起はできるけど、アセンブラでも再起ってできますか??
263デフォルトの名無しさん:2007/10/24(水) 17:08:26
Cがどうやって実行されているか
264デフォルトの名無しさん:2007/10/24(水) 19:34:17
できるできないで言うと出来るんだろうけどやる気がしない。
ループでええやん。
265デフォルトの名無しさん:2007/10/24(水) 19:43:22
アセンブラに出来ない事ってのはCPUで出来ない事と同義
266デフォルトの名無しさん:2007/10/25(木) 06:27:18
>>262 それはハロワに行ってやってくれ。
267デフォルトの名無しさん:2007/10/26(金) 16:14:33
再起不能(リタイア)
268デフォルトの名無しさん:2007/11/09(金) 14:44:33
>>262
出来るはず
昔授業でハノイの塔を
再帰(再起じゃなくて再帰)で解くの作ったことがある
269デフォルトの名無しさん:2007/11/09(金) 17:50:20
いや、出来るのはみんな知ってるから
270デフォルトの名無しさん:2007/11/09(金) 18:33:37
アセンブラで再帰が不可能ならCコンパイラはどうやって実現してるんだよw
271デフォルトの名無しさん:2007/11/10(土) 06:17:29
cの吐くASM見てもいいんだけど、キモは必要な情報は全てレジスタ渡しかスタックに積むこと。
静的な記憶を持つと破綻の元。
272デフォルトの名無しさん:2007/11/10(土) 15:36:35
レジスタってのは「静的な記憶」と等価だと思うんですけどねw
273デフォルトの名無しさん:2007/11/11(日) 02:25:09
その言い方なら記憶装置は全て静的じゃん。レジスタは動的に保存・復元するでしょ。
スタックだって静的な記憶を動的に使う手法のことだし。
274デフォルトの名無しさん:2007/11/11(日) 09:12:29
dynamic・staticは、そこで持ち出す必要ないだろ。
275デフォルトの名無しさん:2007/12/31(月) 08:23:38
暇なのでLSIC-85の再帰コードを貼ります
void 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);
}
276デフォルトの名無しさん:2007/12/31(月) 08:24:20
    CSEG
%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:
277デフォルトの名無しさん:2007/12/31(月) 08:25:18
%7
    POP    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
278デフォルトの名無しさん:2007/12/31(月) 08:26:01
%8
    POP    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:
279デフォルトの名無しさん:2007/12/31(月) 08:28:10
%9
    POP    B
    RET
Z7:    DB "move piece %d from %d to %d",0Dh,0Ah,0
280デフォルトの名無しさん:2008/01/01(火) 03:26:56
main_:
    PUSH    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
281デフォルトの名無しさん:2008/01/01(火) 03:30:02
%13
    MVI    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
282デフォルトの名無しさん:2008/01/01(火) 03:34:16
ふ〜、連投規制に引っかかって2日がかりになってしまった。
あと、printf_とscanf_のEXTRN宣言が足りないぐらいかな。
movediskのパラメータをucharにしたのは、intだと8085では重いから。
わりと素直なASMコードになってるとおもう。今度85の仕事やるとき仕込んで動かしてみよう。
283デフォルトの名無しさん:2008/01/01(火) 05:11:13
>>275 のmovedisk()のprintf文 printf("move piece %d from %d to %d\r\n",n,a,b); は間違い。
    printf("move piece %d from %d to %d\r\n",n,a,c); ・・・(最後がc)でした。
284デフォルトの名無しさん:2008/02/24(日) 17:30:06
>>281
バイナリからそのようなはどのようにすればわかりますか?
285デフォルトの名無しさん:2008/02/24(日) 18:05:24
「バイナリからそのような」はどうやっても判りません。
286デフォルトの名無しさん:2008/02/25(月) 04:54:13
>>284 ; 8085命令コード こんな資料を作ってます。
00 NOP
01FFFF LXI b,65535
02     STAX B
03     INX B
 ・・・(略)全ての8085の命令をアセンブルして、左端の欄でsortすればこの表が得られます。
FD     DB 0FDH    ; JX5 addr
FE80 CPI 128
FF     RST 7
バイナリの、どこか開始点が判れば、そこからバイト毎にこの表を引いて、命令後に直せます。
287デフォルトの名無しさん:2008/02/25(月) 07:22:36
>>160-
呼び出し回数の話してるけど、
一箇所のループで複数の関数を呼び出している場合、
同じ関数を繰り返し呼び出すようにするだけでキャッシュ効率が上がり、10倍くらい早くなる。

一つ一つの命令ロジックよりもキャッシュ効率のほうがよっぽど大事。

>>152
64ビットの精度が必要ならコンパイラだろうがアセンブラだろうがまったく同じ。
精度を落とした場合もまったく同じ。
違うとか言ってるやつは書き方を知らないだけ。

288デフォルトの名無しさん:2008/04/27(日) 20:06:03
age
289デフォルトの名無しさん:2008/07/19(土) 09:50:44
PCじゃなくて独自基板(Z80,H8,H8S,SH3,M32C,T900,etc.)の開発の視点だが

仕事だったら可読性や生産性や移植性の問題があるからアセンブラは避けるなあ
高速化が必要になっても大抵はアルゴリズムとコードの改良で対応できるし

290デフォルトの名無しさん:2008/07/19(土) 10:50:00
ZSNESのコードはじめて見たときは驚愕した
291デフォルトの名無しさん:2009/01/18(日) 08:26:17
 
292デフォルトの名無しさん:2009/03/05(木) 15:57:24
ポインタの型が鬱陶しい。
アセンブラの感覚でアドレスに座標の4倍を加算したつもりが
16倍を加算してしまったり。
293デフォルトの名無しさん:2009/03/05(木) 18:29:09
それ、馬鹿なだけじゃんよ・・・。
294デフォルトの名無しさん:2009/03/06(金) 04:14:48
>>292
intptr_tで計算する。

295デフォルトの名無しさん:2009/06/19(金) 22:35:59
vista 36bitOSでアセンブラを使う方法を教えてください
独習アセンブラとか色々参考書は読みましたが、なんか起動できないです
当方プログラムに関してあまり知識はありません
296デフォルトの名無しさん:2009/06/20(土) 15:14:23
あげます
297デフォルトの名無しさん:2009/06/20(土) 15:20:08
それをゆうなら、Vista 32bit OSだろ?
アセンブラをダウンロードしてインストールすればいい。
298デフォルトの名無しさん:2009/06/20(土) 16:35:06
>>295
PC初心者板にでも行けよ
299デフォルトの名無しさん:2009/06/21(日) 13:09:16
>>297
それを「いう」なら,だろ?
300デフォルトの名無しさん:2009/06/21(日) 13:45:09
「言う」は終止形・連体形が「ゆー」となる不規則変化動詞なので、「ゆう」と表記するのは全く問題ない。
古くは「いふ」「ゆふ」の両方の表記が見られた。

何で日本人が「いう」と書かないといけないと思い込んでるかというと、
「現代仮名遣い」によって「『言う』は常に『いう』と書け」と例外規定されているからだが、
日本語は日本国だけで使用される言語でもないので、
日本語を使用するにあたって、日本政府の決めた表記法に必ずしも従う必要はない。
301デフォルトの名無しさん:2009/06/21(日) 13:46:12
突っ込んだら負けかなっと思っている
302デフォルトの名無しさん:2009/06/21(日) 13:47:57
アンガウル州人は黙ってろよ
303デフォルトの名無しさん:2009/06/21(日) 15:25:00
>>300
日本語が公用語の国って日本以外にあるの?
なにゆってんの?w
304デフォルトの名無しさん:2009/06/22(月) 09:37:11
「公用語として使う国」という電波をどこから受信したか知らんが、
日本国内であっても従う義務がないのは確かだな。
305デフォルトの名無しさん:2009/06/22(月) 10:53:33
>>304
義務って何?w
306デフォルトの名無しさん:2009/06/22(月) 11:34:53
>>303
70年ばかり時間を遡ればさにあらず
アルアルヨ〜
307デフォルトの名無しさん:2009/06/22(月) 12:07:03
>>305
義務も知らんのか。伊達に草生やしてないな。
308デフォルトの名無しさん:2009/06/22(月) 12:56:58
>>307
何で「義務」なんて言葉を使ってるのかきいてるんだよ。

俺は「いう」で習ったしそれが一般的だと思ったから指摘したまで。
従う必要があるとかないとかそんな話始めから誰もしてないっつーの。
「ゆう」がいいなら勝手に使ってなw
309デフォルトの名無しさん:2009/06/22(月) 14:13:50
>>308
俺は >>303 のオナニー解釈を揶揄しただけなんだが。

>俺は「いう」で習ったしそれが一般的だと思ったから指摘したまで。
>>303 がその「指摘」なの?
310デフォルトの名無しさん:2009/06/22(月) 18:00:20
俺は文言一致論者だから言うわゆうと書くよ。
311デフォルトの名無しさん:2009/06/22(月) 18:12:25
じゃあ言わないはゆわないか
312デフォルトの名無しさん:2009/06/22(月) 18:39:51
>>311
いや、標準的な発音(もちろんこれも勝手に決められたものだが)でわ、「言う」は終止形と連体形の時に「ゆう」となるが、
未然形では「いわ」と発音するのが正しいとされているので、俺は「ゆわない」とわ書かない。

しかし仮に「言わない」お「ゆわない」と発音する人がいれば「ゆわない」と書いてもいいと思う。
313デフォルトの名無しさん:2009/06/22(月) 18:54:11
>>312
つまりあんたは、「お」と「を」の発音を区別できないわけだ。
314デフォルトの名無しさん:2009/06/22(月) 19:02:54
IDないから誰が誰だか分からんが、>>313のレスだけ飛び抜けて(ry
315デフォルトの名無しさん:2009/06/22(月) 19:05:41
続きは「言うと書くかゆうと書くか・・・」で脳内に新スレ建ててそっちでやってくれ。
316デフォルトの名無しさん:2009/06/22(月) 19:38:54
てにをはのなってない奴のいうことを真に受けてもアレだしな
317>>299,303,305,308:2009/06/22(月) 20:11:46
>>309
すまんが>>303は失言だった。すまん。取り消させてくれ。

> >>303 がその「指摘」なの?
いや,>>299のことだ。

「ゆう」もありってのは勉強になったよ。ありがとな。
ここまでにする。
318デフォルトの名無しさん:2009/06/22(月) 20:29:21
酸っぱい葡萄の話はこれにて終了か
何が文言一致論者だ
ただの文盲じゃん
319デフォルトの名無しさん:2009/06/23(火) 14:28:56
TASMとNASMで同一の命令が展開されたバイナリコードが
両者違う場合があるのですが、何故ですか?
320デフォルトの名無しさん:2009/06/23(火) 14:32:12
80(x)86のコード体系には冗長性があるため。
たとえば、ソースorデスティネーションがAXの場合の専用のコードがあって
それを使うか使わないかとか。
321デフォルトの名無しさん:2009/06/23(火) 14:49:45
>>320
レスありがとうございます。
それについて詳しく載っているサイトや書籍等がありましたら教えていただきたいのですが、
322デフォルトの名無しさん:2009/06/23(火) 20:41:14
高速化の鬼になりたいのですが、何から学べばいいでしょうか?
皆さんと対等に話せるレベルになりたい
323デフォルトの名無しさん:2009/06/23(火) 21:17:04
英語
324デフォルトの名無しさん:2009/06/23(火) 22:02:35
え・・
325デフォルトの名無しさん:2009/06/23(火) 22:09:56
7:Socket774 :2009/06/16(火) 14:43:17 ID:qZWzEFM3 [sage]
ここの掲示板って知ったかぶりでメーカーの商品の批判ばっかりしてる奴ばっかりだね。
どうせ文句言いながらも使ってるくせに。メーカーさんの苦労もかんがえろ。そんなに
そんなに嫌ならOSもパーツも自分で作れ。どうせお前らには出来ないが。今大学院で
OSの研究をしているが、純粋にみんな凄いって感心している。オタクの集まりっていうのは
ほんまウザいねん。お前らに電子工学の知識があるのか?情報科学を学んだことがあるのか?
お前らまともに勉強してから文句言え。
326デフォルトの名無しさん:2009/06/23(火) 22:22:59
>>323
理由を聞かせてください。
327デフォルトの名無しさん:2009/06/23(火) 22:36:13
>>326
そりゃ、日本語じゃろくな情報ないってことだろ。
328デフォルトの名無しさん:2009/06/23(火) 23:31:00
リファレンス読むのに英語力必須だお
昔のCPUは簡単だったが、今じゃ命令の実行時間の予測が難しいんで、適当に力任せで俺は書いている。
329デフォルトの名無しさん:2009/06/24(水) 01:35:33
成る程、しかしまずは基礎からやろうと思うのですが
NASMを使うのとVSがはくアセンブリを見ながら勉強
どちらを先にすればいいと考えますか?
330デフォルトの名無しさん:2009/06/24(水) 02:28:09
適当に最適化の本買ってテクニックを知れよw
331デフォルトの名無しさん:2009/06/24(水) 02:43:45
>>330
基礎を知らずにやるなんて恐ろしいです
332デフォルトの名無しさん:2009/06/24(水) 05:19:10
VSがはくアセンブリなんて、基礎から遠いところにあると思うがな・・・。

アセンブリレベルの最適化を学ぶということは、CPUアーキテクチャを学ぶこととほぼ同義。
インテルのサイトからマニュアル落としてこいよ。

>>319のような質問をするってことは、「80386/80486プログラミングガイド」辺りを読んで
より造詣を深めたほうがほうがいいかもしれない。最適化の話は全く出てこないが。
その後はせいぜいSIMD命令くらいだし。
333デフォルトの名無しさん:2009/06/24(水) 13:56:57
>>332
書籍を買ってみます。
334デフォルトの名無しさん:2009/06/24(水) 17:15:46
>>332
はじめて読む486ではいけませんか?
絶版になっていたので、
335デフォルトの名無しさん:2009/06/24(水) 17:43:48
勉強するには内容が不十分であると言わざるを得ない。
336デフォルトの名無しさん:2009/06/24(水) 17:54:35
>>333
わかりました。ではやはり買ったほうがいいということですね。
詳しく探してみます。
337デフォルトの名無しさん:2009/06/24(水) 18:54:53
俺が確認によく使うのはこれ
http://www.amazon.co.jp/dp/4874085881

最適化テクニックはこれで学んだ
http://www.amazon.co.jp/dp/4756107974

最近のSSEはIntelのPDFで確認している。
自分でコードを組んでのSSEの最適化関係はWeb上でもあまり見かけんね。
338デフォルトの名無しさん:2009/06/25(木) 14:23:08
はじめて読む486は、他の「はじめて読む(石の名前)」と違って、
基本的なマシン語やアセンブラを知ってる人を対象として、
プロテクトモードを活用する話がメインになっているので、
ちょっと特殊。

はじめて読むPentiumならおk。
339デフォルトの名無しさん:2009/07/04(土) 07:53:11
SSE最適化から動画編集・エンコードソフト関係のスレもいい。
プラグイン作者なんかに詳しい人間がごろごろいる。
340デフォルトの名無しさん:2009/07/08(水) 14:02:07
アセンブラやるならAVRだよ
341デフォルトの名無しさん:2009/07/09(木) 22:07:24
アセンブラによる高速演算技法という書籍は、どのような内容でしたか?
342デフォルトの名無しさん:2009/07/14(火) 19:20:47
逆アセンブルのコツを教えてください。
命令単位ではわかっても全体で何やってるのかわかりません。
定型文とかあるんですか。
343デフォルトの名無しさん:2009/07/14(火) 19:32:14
逆コンパイルならともかく、逆アセンブルは、究極的には丁寧にトレースする
だけだと思うんだが。

逆アセンブルしたものを、どう解釈するか、なら色々知識とか必要かもだけど。
344デフォルトの名無しさん:2009/07/14(火) 22:16:25
どこからコードが始まってるか分からないときに
ずれたまま逆アセンブル開始した場合
ずれたことに気付くためには何をすれば良いですか
345デフォルトの名無しさん:2009/07/14(火) 22:24:07
ノッポさんを探す
そしてスレ違いだから消えろ
346デフォルトの名無しさん:2009/07/15(水) 00:23:33
>>342
C/C++辺りを有る程度熟知した上で慣れる事。自分で書いたコードがどう変化するかを何度か見れば多少理解できる。
あるけど、コンパイラとコンパイラのバージョンとコンパイルオプションと前後の文脈に依存する。その辺の癖は慣れるしかない気がする。
>>344
プリフィックスが変だったりムダにLOCKとかの指定がついてたり、jmp先が命令の狭間になってないかで見る。
つっても逆アセンブラってわりとその辺間違えることは少ないようにも思うが。
>>345
こういう話好きなんで誘導お願いします。
347デフォルトの名無しさん:2009/07/15(水) 00:55:48
>プリフィックスが変だったりムダにLOCKとかの指定がついてたり、jmp先が命令の狭間になってないかで見る。
自分で自分を書き換えるタイプのプログラムだと
命令の狭間にjmpしててもおかしくはないような気もする
いまどきのCPUでも出来るのかどうかはしらないけど
348デフォルトの名無しさん:2009/07/15(水) 03:56:14
>>347
そゆのは例外でしょ。同じコードに複数の意味を持たせる場合も有るし、そういうガチガチに手を加えてある箇所は手で位置を指定しなおさないと。

広範囲の自己書き換えはパッカー(UPX等)とか耐タンパ手法とかで今でも使われてるから出来なくは無いかと思うけど、命令のキャッシュ機能はあるはず。
Win32APIにFlushInstructionCacheってのがあるけど、これはマルチプロセッサで命令キャッシュをクリアするモノらしい。
IFだけで実装無しってオチ・・・だったりしないよな?
349デフォルトの名無しさん:2009/07/15(水) 04:30:53
やっぱ洋書とか読まないと厳しいですかね〜
350デフォルトの名無しさん:2009/07/15(水) 11:24:05
「アセンブリ言語最強伝説」というスレを、現在アセンブラの本スレとして消化中
http://pc12.2ch.net/test/read.cgi/tech/1199952217/l50
351デフォルトの名無しさん:2009/07/15(水) 16:21:37
どこから始まるか分からないってのは、要するにエントリポイントに関する知識が不足してるだけだと思うので
PC向けならLinkers & Loadersを読んだらどうか
組み込みのROMとかならターゲットマシンかそのCPUのアプリケーションマニュアルに指定があるはず
352デフォルトの名無しさん:2009/07/15(水) 21:12:49
>>348
そのまさかだったらしい。
ttp://blogs.msdn.com/oldnewthing/archive/2003/12/08/55954.aspx
call/retでのキャッシュクリアが目的だそうで。
353デフォルトの名無しさん:2009/07/15(水) 22:49:15
ret と jmpってどう違うんですか?
354デフォルトの名無しさん:2009/07/16(木) 00:05:04
>>352
そのページの記事のコピー元の投稿日が分らないし、英語苦手なんで単語拾っただけだが、親投稿自体は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を期待するはずなのでその辺の違い。
355デフォルトの名無しさん:2009/07/16(木) 05:46:33
どこが始まりだか判らないバイト列があったとして、retやjmpの後ろはサブルーチンの開始点
だろうと見当はつくと思うんだが、先頭の実行開始点はどうやって見つけるんだろう。
356デフォルトの名無しさん:2009/07/16(木) 06:16:33
>>355
call xxxx を見つければいいんじゃね?
357デフォルトの名無しさん:2009/07/16(木) 09:17:04
>>354
キャッシュを共有していない場合は悲しいことになる。

まあ普通はkernelの方でフラッシュしてるはずなので、
アプリケーションが気にする必要はない。
358デフォルトの名無しさん:2009/07/16(木) 17:11:06
>>354
あーごめん、たしかに9xだけの話かも。
自分もきちんと読んだのはあのブログではなくて、書籍化されたほうの翻訳だし。すまん。
ttp://www.amazon.co.jp/dp/4756150004
359デフォルトの名無しさん:2009/07/17(金) 03:18:56
>>356 リセットベクタが指している実行開始点は、call命令の対象になってないでしょ。
そういう実行開始点はどうやって識別すればいい?
スタックポインタへのロード命令のパターンを見つけるのかな?
360デフォルトの名無しさん:2009/07/17(金) 04:48:37
ASCIIprintableなcodeだけで書かれたcomファイルのウィルスってなかったっけ
361デフォルトの名無しさん:2009/07/24(金) 17:02:00
セグメントを使ったオフセットによる1MB以上のメモリ番地へのアクセスを
Windows XP上で実現するためにはどうすればいいですか?
362デフォルトの名無しさん:2009/07/24(金) 18:02:37
XP上ではリニアアドレスが仕様だからできない
363デフォルトの名無しさん:2009/07/24(金) 18:04:14
>>362
嘘だといってよ兄ちゃん
364デフォルトの名無しさん:2009/07/24(金) 20:59:26
>>14
16ビットアプリとして作ってWindows XP上で動かす。
ところで、なんでそんな苦行をするの?
365デフォルトの名無しさん:2009/07/24(金) 21:07:31
>>364
書籍に載っているソースコードだけを見て、それを理解したとは言えません。
小学校の理科の教科書に載っている実験結果を見て、その実験について
本当に理解した、といえるのか・・・

そういう点から私は、・・・はい
366デフォルトの名無しさん:2009/07/24(金) 21:38:05
自分で書いたプログラム暴走させて
HDD壊すようになって一人前
367デフォルトの名無しさん:2009/07/24(金) 21:45:14
古代文献のソースコードを実際に試すのは勝手だが、現行においては全く役に立たんぞ。
現にSSE書きまくりのプロの俺だが、セグメントを使用したアクセスは扱った事がない。
x86アセンブラなんてコンパイルとリンクの仕方覚えれば十分。
368デフォルトの名無しさん:2009/07/24(金) 21:49:41
成るほど・・・
では、最後に団子さんの考えを聞いて質問を終える事にします。団子さんは・・・
どう思われますか
369デフォルトの名無しさん:2009/07/24(金) 22:19:09
できない子にみんなをあわせる今の教育
370デフォルトの名無しさん:2009/07/25(土) 12:47:59
>>369
2011年からもっと酷くなりますよ
ですが、、ここでとやかく言っても仕方がないですよ
371デフォルトの名無しさん:2009/07/25(土) 12:55:37
>>367
全くだな。今時x86の16ビットコードを書くとか無駄もいいところ。
OSのローダーを書きたいなら別だが、セグメントなんて糞。
372デフォルトの名無しさん:2009/07/25(土) 20:10:01
>>370
kwsk
373デフォルトの名無しさん:2009/08/09(日) 00:52:16
アセンブリで書くと、そのプログラマーの指紋がつくので注意。
374デフォルトの名無しさん:2009/09/27(日) 05:20:15
しらなかった
375デフォルトの名無しさん:2009/09/28(月) 12:35:40
double f(double a)
{
return a + 1.0;
}

をアセンブラで書くとどうなる?
376デフォルトの名無しさん:2009/09/28(月) 12:44:03
俺様アセンブラなら、
f load [paras]0, reg0
add1 reg0
store reg0, [rets]0
ret
end f
だな。
377デフォルトの名無しさん:2009/09/28(月) 12:54:25
>>375
cc -S してみれば?
378デフォルトの名無しさん:2009/09/28(月) 13:52:14
>>377
.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
やっぱりわけわからん
379デフォルトの名無しさん:2009/09/28(月) 14:05:37
それは、putc() がわけわからん、と言っているのと同義だよ。
命令のリファレンスマニュアル見れば、わからないことなんでないだろう。
380デフォルトの名無しさん:2009/09/28(月) 14:25:33
>>378
せめて、自分が使っているCPUが何で、どんなコンパイラでアセンブリ出力したのか位は書こうぜ。
つーか、>378でわけわからんのなら何やってもわからんだろ。
381デフォルトの名無しさん:2009/09/28(月) 16:46:13
パソコンなら浮動小数点プロセッサーが付いてるCPUのこともあるだろうな。
俺のはクロスコンパイラだから、ソフトの加算ルーチン呼び出しがコンパイルされる。
382デフォルトの名無しさん:2009/09/28(月) 20:51:03
dConst dq 1.0
f proc r:real8
fld r
fadd dConst
ret
f endp
やっとわけわかったわ
383デフォルトの名無しさん:2009/10/09(金) 12:00:45
movs命令の説明の中に、DS:ESIが示すメモリオペランドをES:EDIが示すディステネーションアドレスへコピーする
とあるのですが、
DS及びESセグメントがどうして出てくるのかがわかりません。ESIもEDIも32bitのレジスタであるのですから、
セグメント機構を使う必要はないだろう、と私は考えたのですが、、、
384デフォルトの名無しさん:2009/10/09(金) 12:54:33
385デフォルトの名無しさん:2009/10/09(金) 12:56:29
相対アドレスでアクセス。
386デフォルトの名無しさん:2009/10/09(金) 13:09:05
なる程、ありがとうございます。
387デフォルトの名無しさん:2009/10/14(水) 21:08:57
ストリング命令は何故、DS:SI及びES:DIで処理されるのですか?
388デフォルトの名無しさん:2009/10/14(水) 21:15:47
そうゆう仕様だから
389デフォルトの名無しさん:2009/10/14(水) 21:28:04
>>388
どうしてそのような仕様になったのですか?
そうする必要性がどこにあったのですか?
390デフォルトの名無しさん:2009/10/14(水) 21:55:41
8086は例えばCXをループカウンタに使うLOOP命令とか、
AXがオペランドになる場合専用の短縮形命令コードとか、
そういう非対称な設計があちこちにある。
どうしてとか必要性とかじゃなくて、そういうものとして設計されてる。
391デフォルトの名無しさん:2009/10/14(水) 22:09:40
あの時代はトランジスタを1個1個手作業で配置して結線じゃないの。
レジスタ決めうちして専用回路を作れば
その他のレジスタを無視できるからセレクタと結線が少なくなる。
392デフォルトの名無しさん:2009/10/14(水) 22:44:14
どんだけ巨大な8086なんだよ
393デフォルトの名無しさん:2009/10/14(水) 22:52:50
どれでもできるようにしようと思うと、結局どのレジスタを使うかを指定しなくてはいけなくて、
その分だけ命令の数が増えるわけで
命令が増えた分だけプログラムが大きくなるわけで。
394デフォルトの名無しさん:2009/10/14(水) 22:55:33
フラットモデルは楽だな
セグメントを意識しないで済む
395デフォルトの名無しさん:2009/10/14(水) 23:41:12
なるほど、ありがとうございます、
セグメント機構に関して私はもう一つ気になることがあります。

1MBのメモリにアクセスすることの出来るリアルモード時のセグメント機構について、
16bitのレジスタでは2^16=64kb, アドレスバスが20bitで2^20=1024kb
例えば、セグメントレジスタ群にコードセグメントというプログラムコードを格納する用途に使うものがありますが、
このコードセグメントレジスタに基点位置を設定し、オフセットアドレスを使ったところで基点位置から64kbまでの範囲しか利用できず
もし実行したいプログラムが64kbyte以上であれば、それは実行出来ないものです。
これでは1MBという膨大なメモリを最大限に使う事が出来ていないように思われます。

1MBという膨大なメモリをリアルモード時では、どのようにして利用していたのでしょうか?
396デフォルトの名無しさん:2009/10/14(水) 23:53:37
>1MBという膨大なメモリ

頭大丈夫?
397デフォルトの名無しさん:2009/10/14(水) 23:58:05
(1) 小分けにしてfar jump/callする
(2) 高級言語でFARモデルとかHUGEモデルを使う
(3) あきらめて68000に乗り換える
398デフォルトの名無しさん:2009/10/15(木) 00:03:54
>>397
00000--------------------コードセグメントプギャー
00100far jumpで00600ぷぎゃーすおぎゃ
00102--------------------データセグメントバロッシュ
00600,追加のプログラムコード

という具合でしょうか?
399デフォルトの名無しさん:2009/10/15(木) 00:11:49
日本語で書いて。
400デフォルトの名無しさん:2009/10/15(木) 00:26:18
>>397
普通はサブルーチン毎に適当にセグメント割り当てて、
それをfar callしてた。
一個の塊が64K越えることなんてないし。
というか64Kに収まらんコードをx86アセンブラで書く気力はないので、
コンパイラとリンカに全部お任せ。

どっちかってえと64K越えデータを扱う方がめんどかった。
farはセグメント自分で管理するのがめんどいし、
hugeはいちいち正規化するからおせえし。

で、今時こんな化石な知識は必要なのか?
401デフォルトの名無しさん:2009/10/15(木) 00:38:15
普通は68kに行くだろJK
402デフォルトの名無しさん:2009/10/15(木) 00:46:07
>>396
1Mって広大だよ。
403デフォルトの名無しさん:2009/10/15(木) 00:52:33
>>395
farポインタをつかう。farポインタはセグメントとオフセットをセットにして扱うポインタ。
メモリモデルによって、1つの配列の大きさが64kバイト以下に制限されるものと、64kを超えられるものがある。
404デフォルトの名無しさん:2009/10/15(木) 01:24:33
>>387
DJNZ
405デフォルトの名無しさん:2009/10/15(木) 08:58:57
>>392
LSIのマスクパターンのデザインのことを言ってるんだよ。
8086のころはCADがどばーっと配置してくれるとかそういう時代じゃないから。
406デフォルトの名無しさん:2009/10/15(木) 18:48:00
>>395
どこの古い情報をコピペしたの?
407デフォルトの名無しさん:2009/10/15(木) 18:50:31
つ DarkBASIC
408デフォルトの名無しさん:2009/10/15(木) 20:25:34
32KBが広大だと感じた頃に戻りたひ.....
409デフォルトの名無しさん:2009/10/15(木) 20:44:46
62256に換装して夢のようだと思ったあの日
410デフォルトの名無しさん:2009/10/15(木) 22:03:15
boot ROM 8kb (0000-1FFF)
SRAM 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)
411デフォルトの名無しさん:2009/10/15(木) 22:16:10
まぁ、メモリ 16M 抱えてる暴力的な WS ってな時代だったしな
412デフォルトの七誌さん:2009/10/16(金) 09:51:05
http://tea-andorra.com/asenbura.jpg

(1)プログラムの実行終了直後の記号番地HOGEの内容を10進符号付き整数で表すとどうなるのか
(2)EX03Qの実行終了直後の記号番地Xの内容を10進符号付き整数で表すとどうなるのか
(3)EX03Qの実行終了直後の記号番地FUGAの内容を10進符号付き整数で表すとどうなるのか
(4)EX03Qの実行終了直後の記号番地HENAの内容を10進符号付き整数で表すとどうなるのか

助けてください・・・
413デフォルトの名無しさん:2009/10/16(金) 10:01:08
>>412
アセンブラの質問はアセンブラ質問スレへ、
アセンブラの宿題はアセンブラ宿題スレへ。

って、両方とも落ちているのか。ご愁傷様。
414デフォルトの名無しさん:2009/10/16(金) 10:04:29
あー、機械語スレがあったか。
でもまぁ、その程度の課題でしかもなんのアセンブラかも書かないようじゃ相手にされないだろうけどね。
415デフォルトの名無しさん:2009/10/16(金) 10:06:05
CASLの解説書で命令の意味をひとつひとつ確認していけばわかるだろ。
特に難しい部分があるわけでもないのに。
416デフォルトの名無しさん:2009/10/16(金) 10:22:20
ロストテクノロジーか
417デフォルトの名無しさん: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
    終わる
418デフォルトの名無しさん:2009/10/16(金) 11:25:58
虫つくろい

FUGA はニンテンドーDS 1
HENA はニンテンドーDS 1
419落ちにも何にもなりゃしない:2009/10/16(金) 11:26:38
>>417
FUGAとHENEはドリキャスじゃなくてDSだぞ。
420デフォルトの名無しさん:2009/10/16(金) 11:27:24
つ DarkBASIC
421デフォルトの名無しさん:2009/10/16(金) 11:36:23
>>419
指摘サンクス
あやうくぴゅう太が落ちるところだったぜ
422デフォルトの名無しさん:2009/10/16(金) 19:58:19
変にひねらなくていいから、さっさとコピペするだけで提出できるやつを書けよ。
お前らPGだろ?
423デフォルトの名無しさん:2009/10/16(金) 20:01:40
マ板はともかく、ここはアマチュアも多いだろ。
424デフォルトの名無しさん:2009/10/16(金) 22:00:07
baka
425デフォルトの名無しさん:2009/10/17(土) 03:31:27
>>400
思い出したくねえなw
アセンブラ自体もう忘れたほうがいいような気もするんだが、
なぜか縁が切れないというか、なまじ知っているから使ってしまうんだよね。
コードインジェクション用にリモートプロセスに埋め込む関数を書いたりとか。
C#でバイナリコードを実行する方法を思いついちゃったりとか。
426デフォルトの名無しさん:2009/10/17(土) 10:58:17
バイオススタートアップルーチンによって最初の512byteが0x07c0に読み込まれますが、
この場合コードセグメントの内容はどうなるのですか?

0x07c0、もしくは0?
427デフォルトの名無しさん:2009/10/17(土) 11:06:47
ごめん、調べたら解った
428デフォルトの名無しさん:2009/10/17(土) 23:05:34
アセンブリについて学ぶって事は、コンピュータアーキテクチャについて学ぶ事も同義ではないかなと最近思い始めました。
難しいですが、かなり充実した生活を送る事が出来ています。
429デフォルトの名無しさん:2009/10/18(日) 00:02:30
jmpi命令について質問があるのですが、jmpiは指定して番地をコードセグメントに設定及びジャンプする命令なのでしょうか?
430デフォルトの名無しさん:2009/10/18(日) 00:07:02
メモリの内容が飛び先になってるとか
431デフォルトの名無しさん:2009/10/18(日) 01:20:51
環境も書かずに命令だけ書かれてもな。
432デフォルトの名無しさん:2009/10/18(日) 07:40:46
>>431
すまない
コンパイルはLinux上、as86及びgccを使用しています
433デフォルトの名無しさん:2009/10/18(日) 10:37:13
なぜかPC前提になってるし。。
リファレンスマニュアル見ると確実。
434デフォルトの名無しさん:2009/10/18(日) 12:32:42
リファレンスマニュアル、、、がないです><
435デフォルトの名無しさん:2009/10/18(日) 12:38:35
まず、as86なんてものを使うのをやめれ。
436デフォルトの名無しさん:2009/10/18(日) 13:26:39
どうもjump intersegmentの略らしい。
つまり、ただのfarジャンプ。
437デフォルトの名無しさん:2009/10/18(日) 16:46:21
>>434
メーカーがタダで配ってるマニュアルくらい持っとけよ。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
438デフォルトの名無しさん:2009/10/18(日) 17:22:05
jmpiとjneとかの他の命令を一緒にぐぐればすぐ出てくる。
Linuxブートアップソースコードの解析っていうPDFに書いてある

リアルモードからプロテクトモードへ以降した直後の命令は、JMP命令でなければなりません。
このプロテクトモードでの最初のJMP命令は次のようにして作られます。
> db 0x66  ; オペランドのサイズリフィクス
> db 0xEA  ; これはjmpiのコード
> dw 0x1000 ; プログラムの最初の番地のオフセット
> dw 0x10  ; コードセレクタ
これは「jmpi 0x1000:0x10」と同じです。このコードを実行すると、
コードセレクタ0x10で示すGDTのベースアドレスに0x1000を加えたアドレスの命令から実行が始まります。
439デフォルトの名無しさん:2009/10/18(日) 21:49:08
なるほど、0xEAは単なるJMP FARだね。
440デフォルトの名無しさん:2009/10/18(日) 23:11:11
バイナリ出してようやく分かるとか
どんだけ機械語脳なんだよ
441デフォルトの名無しさん:2009/10/19(月) 05:48:03
いや、一番確実にどの動作をするのか知ることができるし。
442デフォルトの名無しさん:2009/10/19(月) 14:51:11
確かに出来損ないのスクリプトエンジンだと
逆汗したコードをアセンブルしても、同じバイナリにならないことがあったよ。
443デフォルトの名無しさん:2009/10/19(月) 15:16:46
今回のはそういう話じゃないけどな
444デフォルトの名無しさん:2009/10/19(月) 18:20:05
Intel社で予約されている割り込み番号が何処に載っているのか教えてください
445デフォルトの名無しさん:2009/10/19(月) 18:33:54
>>444
『IA-32 インテル(R) アーキテクチャー・ソフトウェア・デベロッパーズ・マニュアル、下巻: システム・プログラミング・ガイド』 の5章
http://www.intel.co.jp/jp/download/index.htm#ia32
446デフォルトの名無しさん:2009/10/19(月) 18:50:20
>>445
ありがとうございます。
447デフォルトの名無しさん:2009/10/20(火) 15:43:25
ページング機構がまるで解らず行き詰まっております、
わかりやすく解説されているWebサイト等ありましたらお教えください。
448デフォルトの名無しさん:2009/10/20(火) 15:45:23
Wikipedia
449デフォルトの名無しさん:2009/10/20(火) 17:36:01
>>448
直感的に捉えたいと考えております、図とかモリモリの...
450デフォルトの名無しさん:2009/10/20(火) 18:05:28
つ[google]
451デフォルトの名無しさん:2009/10/20(火) 18:36:33
google画像検索はたしかに図とかモリモリだw
ページングの図がたくさん出てくるが・・・果たして直観で理解できるものかどうか?
452デフォルトの名無しさん:2009/10/20(火) 19:05:03
プロテクトモード-------------------------
mov ax, [0100]論理アドレス?

アドレス変換回路は、
「セグメントレジスタに格納されたセレクタ値と対になっているセグメントベース値を取り出す」
「そしてオフセットアドレス0100を加算してリニアアドレスを算出する」

ページテーブルを参照して実際の物理アドレスを計算

という具合でしょうか?

リニアアドレスってのがいまいちなんだかわかりません。
453デフォルトの名無しさん:2009/10/20(火) 19:14:59
セグメント化アドレスの対義語
アドレス空間全体が00000000〜FFFFFFFFで線形に番地付けされた、セグメント化されていないフラットな様子を表している
454デフォルトの名無しさん:2009/10/20(火) 19:33:11
仮想アドレスは、物理アドレスが4GB未満の場合であっても4GBのアドレス空間を取り扱う事。。。

ということですか?
455デフォルトの名無しさん:2009/10/20(火) 19:53:32
であれば、ページングがなければ4GBの仮想アドレス空間を保持出来ない

ページングはオフに出来るようですが、オフにする状況といえばどんな場合がありますか?
456デフォルトの名無しさん:2009/10/20(火) 19:57:18
アドレス空間というのは、指定できるアドレスの値全体または一部分を指す言葉
物理アドレスか仮想アドレスか、物理メモリをどれだけ搭載しているか、等は関係がない
今現在実際に使用中でないアドレス値の範囲を指して、空いているアドレス空間などと呼ぶが、
物理アドレス空間が空いてるなら、そこに新しいハードウェアとのI/Oをマップする余地があるかもしれないし、
仮想アドレス空間が空いてるなら、OSに要求してそこにページを割り当ててもらえるかもしれない
457デフォルトの名無しさん:2009/10/20(火) 20:02:07
マシンの起動時はページングはオフになっている
ページテーブルがまだ準備されていないので
458デフォルトの名無しさん:2009/10/20(火) 20:18:08
>>456
こんがらがってしまいました、リニアアドレスっていうのは仮想アドレスと同じ意味ですか?
459デフォルトの名無しさん:2009/10/20(火) 20:28:40
460デフォルトの名無しさん:2009/10/20(火) 20:30:47
>>459
ええ、調べた上で聞いています。
ITPRO : -仮想アドレス空間は,プロセスごとに割り当てられた論理的なメモリー領域です。これは,連続したアドレスで示された領域であり,リニア・アドレス空間とも呼ばれます。
461デフォルトの名無しさん:2009/10/20(火) 20:41:02
英語勉強しろw
462デフォルトの名無しさん:2009/10/20(火) 20:45:28
>>461
ごめwわからないw
463デフォルトの名無しさん:2009/10/20(火) 20:55:10
リニアアドレスってのは、なんていうか、
僕がmov ax, [100]

アドレス変換回路

変換されるアドレスは全部連番に対応出来るぜ(リニアアドレス)

連番ってのがキーポイント?
464デフォルトの名無しさん:2009/10/20(火) 21:09:37
あー、ひょっとしてセグメント化されていないアドレス?のことをリニアアドレス?
465デフォルトの名無しさん:2009/10/20(火) 21:13:53
リニアアドレス→セグメント化されていないアドレス空間
物理アドレス→アドレスバス上でプロセッサが指定出来るアドレス空間

であっていますか?
466デフォルトの名無しさん:2009/10/20(火) 21:20:00
ごめんなさい、見方ってのが結構重要だと感じました。
例えばアプリ側からだとリニアにアドレスが見える
リニアにアドレス
リニアアドレス、のような感じでしょうか?

まぁまぁん〜かすかにわかるような感じが...
467デフォルトの名無しさん:2009/10/20(火) 21:32:19
まとめます
1. -同一セグメント内ジャンプ→nearジャンプ
2. -セグメント化さてていないアドレス空間
3. -アプリケーションから見たらリニアなアドレス

リニアアドレスふひひwwwという具合でしょうか?
468デフォルトの名無しさん:2009/10/20(火) 21:52:09
仮想アドレス=プログラマが扱うアドレス
物理アドレス=プログラマの知ったことか

ドライバやカーネルをいじる人はまた別よ。
469デフォルトの名無しさん:2009/10/20(火) 22:03:32
>>468
カーネルレベルで教えてください。
470デフォルトの名無しさん:2009/10/20(火) 22:14:54
1番間違えました
1. -セグメントオフセットがそのままnearジャンプ出来る(リニアアドレッシング?)
2. -セグメント化されていないアドレス空間
3. -アプリケーションから見たらリニアなアドレス

>>468
仮想アドレスとリニアアドレスというのは
仮想とリニアって単語の意味が違うように、なんていうか違うんだよ、という感じですか?
471デフォルトの名無しさん:2009/10/20(火) 22:22:54
論理アドレス - プロセスから見えるアドレス
物理アドレス - CPUからアドレスバスから実際に出力されるアドレス

仮想アドレス空間 - ページングと仮想メモリが有効な時の論理アドレス空間
リニアアドレス空間 - ページングが有効な時の論理アドレス空間

であっていますか?


472デフォルトの名無しさん:2009/10/20(火) 22:22:58
>>465で合っている。
(セグメントまたはセレクタ) + オフセットで得られるアドレスがリニアアドレス。
ページング使っていないときは、リニアアドレスがそのまま物理アドレスとして扱われる。
ページングを使う場合、リニアアドレスから物理アドレスへの変換が行われる。

IntelのPDFにも書いてあるでしょ。
473デフォルトの名無しさん:2009/10/20(火) 22:27:03
>>472
ページングが非有効なとき 論理アドレス空間=物理アドレス空間
ページングが有効なとき  論理アドレス空間≠物理アドレス空間

ありがとうございます。今からIntelのPDFを見てきます。
474デフォルトの名無しさん:2009/10/20(火) 22:38:23
大抵の場合は、仮想アドレスとリニアアドレスは同じだと考えていい。

仮想アドレスのほうが一般的な言葉だけど、
IntelのPDFではリニアアドレスのほうをよく用いていたと思う。
セグメント・セレクタとオフセットのほうも見方によっては仮想アドレスであると言えるので、
x86固有の低水準な話をするときなどは、リニアアドレスの言葉を用いることが多い気がする。
475デフォルトの名無しさん:2009/10/21(水) 03:30:49
8085で、strcpyみたいな機能で、区切りがコンマの奴が欲しくなった。LSIC85 MS/DOS
#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
476デフォルトの名無しさん:2009/10/21(水) 13:57:02
C言語及びx86アセンブリと学んできたのですが、このスレの住人からして次に覚えるべき言語は何が良いと思われますか?
477デフォルトの名無しさん:2009/10/21(水) 14:10:38
C++
478デフォルトの名無しさん:2009/10/21(水) 14:51:40
次はARMアセンブリだな
479デフォルトの名無しさん:2009/10/21(水) 15:37:49
680x0
480デフォルトの名無しさん:2009/10/21(水) 20:06:01
ふと思ったのですが、アセンブリ言語を真に理解するということはコンピュータアーキテクチャそのものを理解する事と同義ではないでしょうか
481デフォルトの名無しさん:2009/10/21(水) 20:10:02
コンピュータアーキテクチャってのは周辺機器とかも含むと思うんだ
482デフォルトの名無しさん:2009/10/21(水) 20:15:25
>>480
同じ命令セットでも色々なアーキテクチャのCPUがあるのだが
483デフォルトの名無しさん:2009/10/21(水) 20:59:44
アーキテクチャという語が指す範囲と粒度は様々だからな
484デフォルトの名無しさん:2009/10/21(水) 22:38:35
>>480
no
485デフォルトの名無しさん:2009/10/21(水) 22:40:39
win7明日から発売だけど買うのかおまいら?
俺はMSDN会員だから既に入れてるが結構優秀で
不備はほぼ見られないからお勧めするよ

操作は慣れるまでちょっとかかるだろうけどVistaユーザなら
すんなりいけるレベルじゃないかな
このスレでVistaがメインPCのやつがいるかはわからないが。。
486デフォルトの名無しさん:2009/10/22(木) 00:34:12
MSDN会員だが、既にWin8を待ちこがれている。
487デフォルトの名無しさん:2009/10/22(木) 01:04:09
AVXってOS的にどうやってレジスタ待避やるんだろ。
CPU機能みて既存のOSで扱える?
それとも特別なコードがいるのかなっと。
ふと新OSじゃないと扱えないのかな〜っと思った。
488デフォルトの名無しさん:2009/10/22(木) 06:17:22
>>485
相変わらず MOV EDI,EDI は健在だな。
489デフォルトの名無しさん:2009/10/22(木) 12:16:01
>>485
Windowsに注目する時代ではなくなった
490デフォルトの名無しさん:2009/10/22(木) 14:11:17
>>489
とか言う奴が何年も前からいるわけだが。
491デフォルトの名無しさん:2009/10/22(木) 17:54:48
AVX コンテキスト、で検索するとなんかOS側の対応が要りそうなふいんきだな
492デフォルトの名無しさん:2009/10/22(木) 20:28:53
jne 1b
jne 1fの違いがわかりませんお。
493デフォルトの名無しさん:2009/10/22(木) 20:37:47
>>492

ジャンプ先の違いじゃないの?
494デフォルトの名無しさん:2009/10/22(木) 22:17:38
アセンブリのソースコードとC言語のソースコードがあり、
アセンブリのソースコードのほうで、
int_4096: /* 0x0000番地 */
org 0x1000
C言語のソースコードのほうで、
extern long intvel[1024];と宣言されているのですが、
こういう使い方って珍しいですか?
495デフォルトの名無しさん:2009/10/22(木) 22:22:49
アセンブリのソースコードとC言語のソースコードがあり、
アセンブリのソースコードのほうで、
int_4096: /* 0x0000番地 */
org 0x1000
C言語のソースコードのほうで、
extern long int_4016[1024];と宣言されているのですが、
..すみません、間違えました。。
496デフォルトの名無しさん:2009/10/22(木) 22:45:37
。。。
497デフォルトの名無しさん:2009/10/22(木) 23:00:39
>>496
すみません、正直に言います。
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言語ソースコード中にて利用されているのです。
498デフォルトの名無しさん:2009/10/23(金) 04:16:56
何を言っているのか全く分からないが全然珍しくない
499デフォルトの名無しさん:2009/10/23(金) 12:06:08
in命令やout命令って割り込み関係ありませんか?
500デフォルトの名無しさん:2009/10/23(金) 12:08:17
特権命令なので保護モードだと一般保護違反になるとか
501デフォルトの名無しさん:2009/10/23(金) 12:22:58
>>500
ありがとうございます。
502デフォルトの名無しさん:2009/10/23(金) 14:44:03
outb %al,%dx
jmp 1f
1: jmp 1f
1:
jmp 1fのfとは一体何を表しているのでしょうか_?
503デフォルトの名無しさん:2009/10/23(金) 15:02:20
16進数だろjk
504デフォルトの名無しさん:2009/10/23(金) 15:02:40
>>502
1fを含むインストラクションがあるロケーションよりも前方(表示イメージだと下)にある最初に見つかったラベルの 1:
505デフォルトの名無しさん:2009/10/23(金) 15:04:43
ラベルの前方参照(forward reference)を示してるんじゃないかなぁ。
てか、アセンブラ何? as86じゃないよね。
506デフォルトの名無しさん:2009/10/23(金) 15:26:23
>>503-505
なるほど、前方参照とは気づきませんでした。
507デフォルトの名無しさん:2009/10/23(金) 18:58:10
>>505
gasだべ
508デフォルトの名無しさん:2009/10/23(金) 20:01:59
-----test.c
#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でのアセンブリリストが違うのですが
どうしてですか?
509デフォルトの名無しさん:2009/10/23(金) 20:53:19
拡張インラインアセンブラについて日本のサイトで色々と解説しているサイトがあれば教えてください。
http://www.mars.sannet.ne.jp/sci10/on_gcc_asm.html#K_SS
ここだけではあまりわからなかったので、
510デフォルトの名無しさん:2009/10/23(金) 21:48:36
あれ。。。いつもならすぐにレスが返ってくるのに皆様今日はどうなされたのですか?
511デフォルトの名無しさん:2009/10/23(金) 23:28:46
。。。
・・・
...
・・・
512デフォルトの名無しさん:2009/10/23(金) 23:31:59
>>511
答えられないなら黙ってなよ
513デフォルトの名無しさん:2009/10/24(土) 00:09:30
三点リーダは二つ重ねるものだ
514デフォルトの名無しさん:2009/10/24(土) 00:46:35
#include <stdio.h>

static 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に変な数値を入れても拡張インラインアセンブラの処理が終われば
元に戻っていうという事ではないのでしょうか?
515デフォルトの名無しさん:2009/10/24(土) 01:28:24
warosu
516デフォルトの名無しさん:2009/10/24(土) 01:46:41
...?
517デフォルトの名無しさん:2009/10/24(土) 09:28:58
asm文中でレジスタの自動割当する際、指定したレジスタを自動割当しないという宣言。
例をあげると、こう。

# ソース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

なお、全ての汎用レジスタを指定すると、
「冗談は顔だけにしとけよ。割り当てられるレジスタが無いじゃんか。」
とコンパイラが文句を言う。
518デフォルトの名無しさん:2009/10/24(土) 10:30:50
#include <stdio.h>

int 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)では使用されない
ということでしょうか?
519デフォルトの名無しさん:2009/10/24(土) 14:54:29
-Sつけて、asmのソースを見たら
520デフォルトの名無しさん:2009/10/24(土) 15:06:45
>>519
見た上で聞いています。
521デフォルトの名無しさん:2009/10/24(土) 15:19:41
何がしたいのかよくわからんのよね
522デフォルトの名無しさん:2009/10/24(土) 15:28:14
>>521
:"%eax", "%edi", "%ebx", "%ecx", "%edx", "%esi");
この部分のエラーの事なら察してください

破壊レジスタにeax,edi,ebx,ecx,edx,esiのいずれかを指定した場合は、
出力オペランド及び入力オペランド(%0,%1)の演算等では使用されない
ということでしょうか?
523デフォルトの名無しさん:2009/10/24(土) 15:33:01
そうだよ、たぶん。
524デフォルトの名無しさん:2009/10/24(土) 15:34:56
>>523
へーそうなんだ
525デフォルトの名無しさん:2009/10/24(土) 15:48:34
>>524
模範回答をお願いします。
526デフォルトの名無しさん:2009/10/24(土) 18:06:20
>>518
> :"%eax", "%edi", "%ebx", "%ecx", "%edx", "%esi");
察して下さいとあるけど、一応。
この例だと割当可能な汎用レジスタが一つもないから、不可能な指示がある、と
コンパイラが泣き言を言って止まる。

いずれかを指定したならば、明示的・暗黙的を問わず、そのasm文中では破壊しては
いけない用途で使用済みと見なし、%0や%1への割当を行わないだけ。
足りなくなった場合は、使用可能なレジスタの再利用を試み、それが不可能ならば、
やはりエラーを吐いてコンパイル停止する。
527デフォルトの名無しさん:2009/10/24(土) 18:44:46
あと、こういう違いがある。

int 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を返す。
528デフォルトの名無しさん:2009/10/24(土) 19:01:25
何がいいたいのか、わからん
529デフォルトの名無しさん:2009/10/26(月) 21:47:00
セグメントベースとは、セグメントアドレスに対して*16を行ったアドレスの事ですか?
530デフォルトの名無しさん:2009/10/26(月) 21:55:54
ここは学校じゃねえんだ
531デフォルトの名無しさん:2009/10/26(月) 22:35:35
>>529
8086の場合のことを言ってる?
532デフォルトの名無しさん:2009/10/26(月) 23:50:24
>>529
IA-32では動作モードによって異なる。
16バイト境界に整列することが推奨された32ビットアドレスである可能性もある。

インテルが無料でPDFを配布してるから、それを読んで。
会員登録とか面倒な事は一切無く、日本語で読める文書を無料で配布してくれてるから。

IA-32 インテルR アーキテクチャソフトウェア・デベロッパーズ・マニュアル
下巻:システム・プログラミング・ガイド

上中下巻あわせて4つ、これらはダウンロードしていつでも参照できるようにしておくことが大前提。
533デフォルトの名無しさん:2009/10/27(火) 01:06:45
>>532
ダウンロード場所はですか?
534デフォルトの名無しさん:2009/10/27(火) 01:12:06
「インテル 技術資料」でググれ。
535デフォルトの名無しさん:2009/10/27(火) 01:12:59
自助努力を一切しない、できない者に明日は無い。
536デフォルトの名無しさん:2009/10/27(火) 09:18:52
386以降では動作モードによらず内部レジスタであるセグメントデスクリプタキャッシュのセグメントベースとリミットが用いられる
従ってリアルモードでも一応32bitアドレスのアクセスが可能
537デフォルトの名無しさん:2009/10/27(火) 15:57:28
>>533
IA-32 インテルR アーキテクチャソフトウェア・デベロッパーズ・マニュアル
↑これで検索すると一発で出てくる。
538デフォルトの名無しさん:2009/10/28(水) 00:38:52
日本語版あったのか…知らなかった
539デフォルトの名無しさん:2009/10/31(土) 04:08:30
>>387>>390-391
ふっつーに、セグメントを跨ぐデータのコピー時には、同じセグメントレジスタだと不都合だからじゃねーの?

>>538
あの資料、少し古い日本語版を良く使っている。
・・・命令セットの章が、PDFを跨いだ分割収録にされる前の物を。
命令セット見るだけならCPUの対応時期も書かれてるからhttp://moon.gmobb.jp/hero/のx86CPU.CHMの方が便利なのかもしれないが、どうなんだろうな。
540デフォルトの名無しさん:2009/10/31(土) 09:22:14
セグメントオーバライドプレフィックスで同じセグメントでのコピーにならないっけか?
541デフォルトの名無しさん:2009/11/02(月) 10:45:04
転送元はDS以外を使えるけども、転送先はES固定。

そういや8086はセグメントオーバーライド+REPプレフィックス使うときは
DI/EIで挟む必要があったなー、と今思い出した。
542デフォルトの名無しさん:2009/11/02(月) 11:40:07
Z80にもインデックスオーバーライドプレフィクスwがあったな
543デフォルトの名無しさん:2009/11/02(月) 12:30:40
セグメントレジスタが違っても同じアドレスを指してることはありうるわけで、
ブロックコピーの範囲が重なる問題には関係ないな。
544デフォルトの名無しさん:2009/11/02(月) 12:33:29
>>542
0xddと0xfd?
インストラクションセットにない組み合わせも使えた辺りは確かにオーバライドプレフィックスのようだった。
545デフォルトの名無しさん: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 

『騙すンじゃねぇ、ジパング板から来ちゃったじゃねぇか!!』
546デフォルトの名無しさん:2009/11/04(水) 03:19:55
LSIC80で8085のコード。ringバッファをXX00番地に配置して、リード・ライトポインタをcharで持つ。
でも ring[rpointer] を参照するにはLXI H,ring で DEreg<--00rpointer を入れて DADする
コードが出ちゃうんだよね。HL<--XXrpointer を入れて MOV A,M するような書式
書けないものかな。
547デフォルトの名無しさん:2009/11/04(水) 05:29:13
つ emit

あとは、行儀悪いけど
#define ring 0xXX00

unsigned int hl;
hl = ring | rpointer;
a = *(char *)hl;
とか。

ring[rpointer]は、リンクするまでringの値が確定しないので、
ど〜しても16bit足し算することになるんでないかい。
548546:2009/11/04(水) 13:39:39
char*をuintにキャストして or しても、DEに00rpointerを入れて16bitのor演算されちゃいます。
  LDA  rpointer  ; return( ring[rpointer++] ); の最適化
  MOV  L,A
  INR  A
  STA  rpointer
  MVI  H, HIGH ring
  MOV  A,M     ここまでを_asm_cで書いて、
} にしたらRETは出ました(w
549デフォルトの名無しさん:2009/11/06(金) 22:54:08


あああああああああ

アセンブラを書くとき、MIPSとSHの作り易さは異常

その中でも、俺の中ではSHが一歩リードかな

某スセ社の「プスプ」がMIPSでなくSH採用してりゃもっと良かったのに
RISCのくせに命令が豪華でサイコー
550デフォルトの名無しさん:2009/11/06(金) 23:00:03
551デフォルトの名無しさん:2009/11/06(金) 23:03:54
間違えて過疎スレの方貼ってしまった

本スレ
ttp://science6.2ch.net/test/read.cgi/denki/1254737313/
552デフォルトの名無しさん:2009/11/25(水) 13:55:26
あっちも面白そうなので見てます。ありがとう。
553デフォルトの名無しさん:2009/12/14(月) 04:13:25
void ch1puts(_UBYTE* srcp) {      /* 送信バッファ書き込みルーチン*/
  register _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バッファに書き込むルーチンなんだが
554デフォルトの名無しさん:2009/12/14(月) 04:24:22
引数はER0に乗ってきて、関数中ではそれをER2に持つ。*srcpをER0のまま使えるのに。
RxにE0を使い、loop中でE0→ER1に毎回ゼロ拡張が起きる。RxにR1を使えばloop前に
E1を1回だけゼロにしとけば済むのに。&演算も R1=R1&07FF とワードになる。
R1H=R1H&7 でイイのに。これだからへうのコンパイラ嫌いなんだ。
555デフォルトの名無しさん:2009/12/14(月) 05:13:55
ルール:R0,1,2は壊してよい。R3-R6は使うなら保存。これだけ。 俺ならこう書く
  register _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使いなのに
556デフォルトの名無しさん:2009/12/14(月) 06:11:08
半角カナでコメントを書く奴は信用できない
557デフォルトの名無しさん:2009/12/14(月) 06:40:58
そこに突っ込むか(w 左右の空き具合とかでアバウトに決めてる。
558デフォルトの名無しさん:2009/12/14(月) 14:31:42
半角カナが混じってると馬鹿っぽく見えるのはなぜだろう
559デフォルトの名無しさん:2009/12/14(月) 16:33:14
fjユーザによる洗脳だな
現在では携帯ユーザの総合的知性も絡んでくるかも
560デフォルトの名無しさん:2009/12/14(月) 16:43:54
sizeof s0ringがどんな値かはコンパイラ君は考慮してくれんでしょ
共用体とか使うことで人的に最適化しないと
561デフォルトの名無しさん:2009/12/16(水) 14:22:04
unionでlongとMSW,LSWにした構造体を定義すると、レジスタに持たずスタックに置かれました。
register _UDWORD Rx とすると、添え字のアドレス計算の箇所でRxから別のレジスタへの
コピーが出て、Rxをオフセットに使いません。
結局、555の右側のコードを__asm { } ブロックの中に書きました。
ライフボートのコンパイラのほうがお利口だったなあ・・・
562デフォルトの名無しさん:2009/12/17(木) 12:06:20
書き方が悪いような
563デフォルトの名無しさん:2009/12/21(月) 05:06:18
>>562 553のcコードに対して提案を書いてみて。コンパイルしたlst貼るから。
564デフォルトの名無しさん:2009/12/21(月) 11:00:08
union
{
unsigned int WORD;
struct
{
uncigned char high;
unsigned char low;
} BYTE;
} c0s_wpt;

cos_wpt.WORD++;
c0s_wpt.BYTE.high&=7;
565563:2009/12/21(月) 15:07:35
>>564 それに対しては>>561で悪くなる、と報告してます。lstは貼りますが・・・
void 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
566つづき:2009/12/21(月) 15:08:56
   L4706:
  do {               // サイズ回 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
567563:2009/12/21(月) 15:14:18
あと、>>554では>>553のコードの展開形のうちダメな点を3点挙げています。
>>564は1,2番目に対しては何も言っていませんね。3番目に対して的外れな提案しただけ。
568デフォルトの名無しさん:2009/12/21(月) 17:24:38
最適化されてないようなコードだね。
hewはそんなコードを吐くんだ。
569デフォルトの名無しさん:2009/12/21(月) 17:28:08
最適化オプションを付けてないか、抑止するようなオプションを付けてるか、なんじゃない?
570デフォルトの名無しさん:2009/12/21(月) 18:40:32
SHかぁっくいぃ!
571デフォルトの名無しさん:2009/12/21(月) 19:00:31
デバッグ中なので最適化してないんじゃない?
572デフォルトの名無しさん:2009/12/21(月) 21:19:54
日立製のSH向けコンパイラは最適化スイッチはONにしないようにと注意書きされてるよね。
理由は最適化にバグがあるあら止まるかもしれんって内容だったと記憶してる。
573デフォルトの名無しさん:2009/12/21(月) 21:22:09
最適化ONでデバッグしながら、書き方でコンパイラのバグを回避するんだよ
574デフォルトの名無しさん:2009/12/21(月) 21:37:10
なんちゅう悲惨なコンパイラや・・・
575567:2009/12/22(火) 04:05:36
最適化オプションはサイズにしてます。元々コンパクトコード偏執狂なので、
コンパイラにはこれ以上最適化できないことが多いです。
ライフボートのコンパイラにかけたらもっとおバカなコードが出ました。
576デフォルトの名無しさん:2009/12/22(火) 10:10:35
コンパイラの信頼度なんて本来その程度なわけで。
重要な箇所はアセンブリ言語で書くのが当然。
577567:2009/12/22(火) 11:34:57
ASMで開発を選ぶよりも、ROMRAM増やして1グレード上の石選ぶほうがトレンドでしょうね。
私のは趣味の領域だし。
578デフォルトの名無しさん:2009/12/22(火) 12:06:18
趣味ならgcc使ってみるとか
579567:2009/12/22(火) 17:00:59
それは只でダウロできるのですか?80x86系?それなら仕事で使わないから要りません。
H8系は仕事で使う+趣味も兼ねて凝り倒すので、ライフボートとルネサス落としてますが。

ライフボートのコンパイラに同じコード食わせたら、個々のモジュールはおバカでも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をコードしたかったなあ・・・
580デフォルトの名無しさん:2009/12/22(火) 17:04:18
gdlで検索してみて
581デフォルトの名無しさん:2009/12/22(火) 17:30:13
仕事といったり趣味といったり
バカは忙しいな
582デフォルトの名無しさん:2009/12/22(火) 17:52:33
> それは只でダウロできるのですか?

その「俺は頭悪いです」って自己紹介してるような文章をまずなんとかしたら?
583デフォルトの名無しさん:2009/12/22(火) 18:07:52
整数専用printfくらい自分で書けとしか言いようが無い
584デフォルトの名無しさん:2009/12/22(火) 18:11:38
gcc知らないとか技術者として駄目だろ・・・
585デフォルトの名無しさん:2009/12/22(火) 19:59:00
gccなんて、使わない仕事の方が多いだろう。
使ってる人はそれしか使わないから、
みんなが使ってると錯覚するのかもしれんが。
586デフォルトの名無しさん:2009/12/22(火) 20:58:25
使わなくても名前くらいは知っておこうよ、というレベル。
587デフォルトの名無しさん:2009/12/23(水) 03:25:31
>>584
哀れやのう
588デフォルトの名無しさん:2009/12/23(水) 04:29:29
別にgcc知ってるくらいで威張ることも無いが
知らない奴は、恐ろしく狭い世界で生きてるんだろうなぁという予想は出来る
本当に哀れなのは誰なんだろうな
589567:2009/12/23(水) 06:25:21
いろんな反応が来てますね〜 >>580ありがとうございます。
unix登場以前からPGやってたんだから、今の標準的な教養と違ってるのは自覚してます。
趣味を仕事にしていられるのは、いい境地だと思いますけど。2年程前まで年\700平均
ぐらい貰えてたし。ここ2年で \150 \100 ぐらいに減ってきたけど、年金が始まったし(w
今は下積み2足の草鞋+年金ほぼ3等分ですね。
今ライフボートの本見てるんだけど、表紙の写真が3.5インチのフロッピー。
590デフォルトの名無しさん:2009/12/23(水) 11:27:35
>>586
そうでもない。
591567:2009/12/23(水) 16:26:22
>>580 gdl 使ってみました。複数ファイルリンク機能とか無いみたいなので、全部ひとつの
ファイルにして読み込ませればいいですか? 割禁とかマシン依存な機能はどう書けば
いいのでしょう? 割り込み処理関数の書き始めも文法違うみたい。
展開したフォルダの中にマニュアルみたいのが見つからないんです。
592デフォルトの名無しさん:2009/12/23(水) 17:34:18
割禁とかマシン依存な機能は自前で用意しないといけない
h8 gcc
で検索すると親切な人と出会えるかも
593デフォルトの名無しさん:2009/12/23(水) 21:27:49
正直 "かも" はいらない;
キモチワルイ;;
594デフォルトの名無しさん:2009/12/24(木) 09:50:54
>>593
おたくは一体なにがしたいの?
595591:2009/12/27(日) 15:15:23
>>594 もしかして私のことかな?ライフボートのcでH8Sのアプリを書いたのですが、
gdlという物を教わったのでそれで開発してみようとしたのです。
売り物のコンパイラと違ってnetのマニュアル見るとオプションが多すぎてパニクったり。
DEFファイルとか雛形を読んでstartupファイルやリンク情報やベクタ部の書き方とか、
どこに置けばよいか、など見当がついてきたところです。

今はlinkでerror: no memory region specified for loadable section `.data.align4 という
ので引っかかってます。h8rom.xというlink制御文ファイルのどこかがいけないんだと
思うんですが、これの文法が見当つかない。
596591:2009/12/27(日) 16:35:26
link制御文が1箇所、標準のフォルダのと違ってました。(.dataの中身が1行足りなかった)
linkまで行ったので、割り込みハンドラ関数を書こうと思い、

void rxrdy0(void) __attribute__ (( interrupt_handler ));
void rxrdy0(void) {/* SCI0受信 int. */
  r0ring[c0r_wpt++] = SCI0.RDR;    // ringバッファに格納
  SCI0.SSR.BIT.RDRF = 0;       // 割り込み要因 リセット
} という関数を書いてみたのですが、-SでASMコード見るとこの関数が出てない。なんで?
597デフォルトの名無しさん:2009/12/27(日) 16:44:50
SCI0.SSR.BIT.RDRF = 0;
は思ってるコードが出ないかもしれないよ
598591:2009/12/27(日) 22:15:22
ライフボートとルネサスのcではBCLR命令が出たんですけどね。
上のほうにr0ring[c0r_rpt++]から読み出す関数はコンパイルされて命令出てるんです。
599591:2009/12/28(月) 00:27:21
linkが成功したときの暫定版でのサイズは、ルネサスより巨大でしたね。
関数の入り口出口で必ずスタックフレーム確保/返却とか、
引数のレジスタはそのまま使わず、関数内で使うレジスタに移すとか、
cの標準に従った展開するらしいので、しょうがないですね。
LIBもフルセットのが付いてくるみたい。 ルネサスもライフボートもそれなりの性能を
提供しているんだな、とおもいました。
600デフォルトの名無しさん:2009/12/28(月) 00:36:14
-fomit-frame-pointer
601591: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 だけにします。
これで外回りは全部埋まったかな。
602591:2009/12/28(月) 01:32:15
BCLR/BSETは、LD mask ST 型で出るんですね。ここが残念
603591:2009/12/28(月) 03:48:50
なんか、いじってるうちに h8300-elf-gcc: no input files
というエラーで失敗するようになった。ちゃんとファイルは開いてるのに。
604デフォルトの名無しさん:2009/12/28(月) 18:11:54
>>602
volatileがついてるとそうなる。
volatileを外すとBCLR/BSETを使ってくれるけど、
書き方によっては最適化されて思ったコードがでなくなることがある。
gccのソースにパッチを当てれば、
volatile付きでもBCLR/BSETのコードを吐かせることは出来るけど
gccのビルドが大変かな
605602:2009/12/29(火) 03:40:53
ホントだ。iodefine.h見たら、ぼらちるついてます。DI/EIみたいにマクロにできませんか?
#define BITON(x) asm("BSET @" #x "\n") とか・・・(これはLSIC85のマクロですが)
1行の |= とか &= をDI/EIで挟むのってうるさいですよね。
606602:2009/12/29(火) 04:43:33
ライフボートのcでは、初期値ゼロが不要な領域(ringバッファ)に別のセクション名を与えて、
デフォのセクション名の領域だけをクリヤする、ってことをできたんです。
GCCで似たようなことをするにはどういう手法がありますか?
607602:2009/12/29(火) 08:42:14
cのグローバルな変数はCOMMONに配置され、bssにはstaticな変数が配置されるみたい。

どうやらLINKまでたどりつきました。objcopy -I coff-h8300 -O srec a.out 167.MOT
とやると、a.out: Invalid bfd target というエラーが出ます。これは何がいけないんでしょう?
608602:2009/12/30(水) 04:18:18
coffとかelfとかのファイル型式が理解できてないですが、-O srec a.out xxx.MOTで
MOTに変換できました。BIT操作は素直に割禁使うことにしました。
RAMクリヤが必要な空間だけ隔離できないのがちょっと残念ですが性能上は問題無い。
でもRAM16Kのうち2Kもlibが使うし、ROMもアプリ6Kでlibが28K。どちらも余っているから
いいけど、なんかグヤジー・・・
609デフォルトの名無しさん:2010/01/04(月) 13:07:28
asm volatile ("bclr %1,@%a0:8": :"i" (&SCI0.SSR),"i"(6))
かな?
610デフォルトの名無しさん:2010/01/05(火) 18:25:59
>>606
__attribute__ ((section ("bar")))
611デフォルトの名無しさん:2010/01/06(水) 05:58:30
わを・・・>>609は605へのレスですよね。 ありがとうございます。試してみます。
612611:2010/01/06(水) 13:28:00
どちらもうまく行きました。 >>610 は変数毎に与える必要がありました。
セクションbarをbssの前にすることで、クリヤ範囲を大幅に減らせました。
613デフォルトの名無しさん:2010/01/06(水) 20:52:33
barじゃなくて、.noclearとかにしたほうが...
614デフォルトの名無しさん:2010/01/06(水) 21:48:46
キニシナイ!!
615デフォルトの名無しさん:2010/01/06(水) 21:52:20
アセンシー
616611:2010/01/07(木) 05:01:00
>>613 あはは・・・そうですね。コピペをそのままLINKしてしまった。
617611:2010/01/07(木) 05:39:45
>>609 割り込み要因クリヤは割り込み処理の中だからムリにASMで書かなくてもいいかと
思い直しました。 でも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" がどこに展開されるか判らないのが不安です。
618デフォルトの名無しさん:2010/01/07(木) 05:46:07
volatileつけてないとasm文が無効になることがある。

%1 <- "i"(6)
%a0 <- "i"(&SCI0.SSR.BIT.RDRF)

asmの使い方は、このあたり見てみて
ttp://www.sra.co.jp/wingnut/gcc/gcc-j.html#Extended%20Asm
619611:2010/01/07(木) 08:41:36
ありがとうございます。そこは私もブックマークしてました。長すぎてなかなか読み切れない(w
620611:2010/01/07(木) 08:47:01
「C の式をオペランドとするアセンブラ命令」 の章あたりですね。
621611:2010/01/07(木) 09:10:53
asm volatile ("BCLR %1,@%a0:8"::"i"(&SCI0.SSR),"i"(6)); でコンパイル通りました。
ビットフィールドのアドレスを書いてはいけないと怒られました。
volatile はこの場合はつけなくても大丈夫なようです。
622611:2010/01/07(木) 09:12:46
Sファイルで、ポートアドレスが 16777084 とか10進で表現されるのは辛いですが、
これを16進で表現させる手段はありますか? 基数で検索が引っかからない・・・
623デフォルトの名無しさん:2010/01/07(木) 12:07:09
>>621,622
パラメータ使わないときはこんな書き方になる
asm volatile ("bclr #6,@0xFFFF7C:8")
624611:2010/01/07(木) 15:03:46
612のときはその書き方で通しました。txend割り込み処理なんか push/pop 無しになります。

例えばcの上のほうで asm ("RDRF EQU 6") を書いて、下の方で asm ("bclr #RDRF,@・・・
なんて書き方も許されるのでしょうか?
625デフォルトの名無しさん:2010/01/07(木) 16:31:26
>>624
gccの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
で,アセンブラのリスト出した方が見やすいかも
626デフォルトの名無しさん:2010/01/07(木) 17:10:28
gccっていうより、gasの使い方を調べた方がいいようなところに来ちゃったね。
627611:2010/01/08(金) 16:36:03
そのオプションでアセンブリリスト.lstが得られました。ありがとうございます。
これだとポートアドレスなんか確認しやすいですね。
7F7A7250    BCLR  #5,@16777082:8  ポートFFFF7Aと判ります。
628デフォルトの名無しさん:2010/01/09(土) 16:55:45
>>608
newlibを-O2 -fomit-frame-pointerでビルドしなおせば、少し小さくなるような気が
629デフォルトの名無しさん:2010/01/10(日) 02:52:24
-O2は太るでよ。
小さくしたいなら-Osだな。
630608:2010/01/10(日) 04:57:26
-O2は太るのは実感しました。データフロー解析?っていうのが適用されるみたいで、
task1{ core(&cont1); }  task2{ core(&cont2); } みたいに、構造体を使って制御構造を
共有するタスクを複数書いたら、constの構造体が指す変数を直接使って同じ制御構造を
複数のタスクの中に展開形で書いたコードが出ました。

>>628 printfのフルセットが付いてくるのが本質なので、その手法は歌丸にワカメだと思います。
ライフボートは、整数型変換だけの代替printfを用意することで解決しました。
631デフォルトの名無しさん:2010/01/10(日) 11:37:17
-finline-functions 単純な関数を呼び出し側に統合する
を無効にしてみるとか
632デフォルトの名無しさん:2010/01/10(日) 14:41:24
rx-elfだとこんな感じ
asm volatile ("bclr %1,%0.B"::"Q"(IR215),"i"(IRn_IR_BIT))
633デフォルトの名無しさん:2010/01/22(金) 04:45:54
IARのcで、extern _UWORD c0s_wpt,c0s_rpt;
_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 になる。
ど〜すりゃいいんじゃ!
634633:2010/01/22(金) 05:06:52
AH8だと、:32を明示的に書くといけないみたい。:32を書かないとOKになった。
635デフォルトの名無しさん:2010/01/27(水) 05:05:42
アセンブラで書くなら特権レベルを変えたいぜ
636デフォルトの名無しさん:2010/01/27(水) 07:24:23
特権レベルないマイコンの方が多いでしょ
637デフォルトの名無しさん:2010/01/27(水) 13:24:05
画像処理では単純な処理を何回も繰り返すから、ほんの少しの最適度の差で処理速度が全く変わってくる。
だから部分的にアセンブラで書くことは良くあるよ。
638デフォルトの名無しさん:2010/01/27(水) 13:24:49
SSEみたいなコンパイラで最適化が予想しにくいCPU命令を使ったりすることもあるしなぁ。
639デフォルトの名無しさん:2010/01/27(水) 13:26:38
>>371
馬鹿か。
nProtectとかX-Trapみたいなゲームのセキュリティ機能をぶっ潰すのにそういう知識が必要なんだよ。
640デフォルトの名無しさん:2010/01/28(木) 00:19:19
>>639
いつもいつも同じ台詞。聞き飽きた。
チート関係は升スレでやればいいだろ。
641デフォルトの名無しさん:2010/01/28(木) 00:27:30
ほれ、立ててきたぞ

升プログラミング
ttp://pc12.2ch.net/test/read.cgi/tech/1264605964/
642デフォルトの名無しさん:2010/01/30(土) 01:16:59
>>638
それ困ったよなあ
x64はインラインアセンブラ禁止とか困った事やってくれるし
643デフォルトの名無しさん:2010/01/30(土) 01:38:08
MASMで書いている俺に隙はない。MASM自体に色々バグあるけどね!
644デフォルトの名無しさん:2010/01/30(土) 15:45:55
TASMのほうがなんとなくすき
645デフォルトの名無しさん:2010/01/30(土) 20:09:46
どうしてこれでn/3が計算できるのですか?

mov eax,55555556
imul dword ptr [n]
mov eax,edx
shr eax,1f
add eax,edx
//eaxに答えが入る
646デフォルトの名無しさん:2010/01/30(土) 20:30:07
これを別スレで質問したの自分だけど
勝手に人の質問をマルチにするのやめれ
647デフォルトの名無しさん:2010/01/31(日) 03:10:18
n/3はn*(1/3)と直せるだろ
じゃあn*(2^31/3)*2^31とも直せるわけだ
648デフォルトの名無しさん:2010/01/31(日) 03:11:22
まちがwた
n * ((2^31) / 3) / (2^31)ね・・・
649デフォルトの名無しさん:2010/01/31(日) 04:18:41
あっちの解説のほうがわかりやすい
650デフォルトの名無しさん:2010/01/31(日) 04:46:17
あっちって何処だよ。
探すのめどい
651デフォルトの名無しさん:2010/01/31(日) 17:01:23
マルチ
652デフォルトの名無しさん:2010/01/31(日) 17:22:47
分かりやすいもくそも
マルチって書いてるからヒントくらいで十分だと思ったんだよ
で、どこで解説されてるんですか?
653デフォルトの名無しさん:2010/01/31(日) 17:34:47
654デフォルトの名無しさん:2010/02/01(月) 06:25:15
数行になっても3で割るより速いのかな?
655デフォルトの名無しさん:2010/02/01(月) 10:06:32
割り算の高速化はテーブル参照しかない?
656デフォルトの名無しさん:2010/02/01(月) 13:49:33
パイプライン化でレイテンシ隠蔽するか、そもそも割り算しないのが高速化の定石
657デフォルトの名無しさん:2010/02/01(月) 13:56:24
いや、/3と、*1/3+シフトでどっちが速いの? って素朴な疑問なだけなんですけど
658デフォルトの名無しさん:2010/02/01(月) 14:06:52
最近のプロセッサだと、実行してみなけりゃわかんない。
実行してみてもわかんない。そんな感じ。
659デフォルトの名無しさん:2010/02/03(水) 11:45:41
>>657
cpu次第。
で、asmコードをみてクロック数調べればいい。
660デフォルトの名無しさん:2010/02/03(水) 11:50:58
パイプラインに入ってしまう大きさならクロック数見ても意味無くね?
661デフォルトの名無しさん:2010/02/03(水) 11:57:34
1回しか実行しないとか、
周辺に演算結果による分岐がないなら、
そうだろうけど、演算速度気にするくらいだから、
多少は回すんじゃない?
x86前提とも限らないし。
662デフォルトの名無しさん:2010/02/03(水) 22:33:05
演算器が余りそうなやつを使った方が早いだろ。

いまどき論理CPUがないやつなんかないわけだから
実CPUで動くか論理CPUで動くかによっても違ってくるだろ。
当然実CPUで動くか論理CPUで動くかは、OSによってもその確率は変わってくる。

また、プログラムサイズが微妙なときはキャッシュに入りきるかどうかも影響してくるし
母数によっても違ってくるんじゃないかな。

86命令なら短いけど、
命令長が全部同じ長さのCPUとかでは命令が増えた分だけ大きくなるし。
663デフォルトの名無しさん:2010/02/16(火) 22:46:02
invoke age
664デフォルトの名無しさん:2010/02/20(土) 11:01:33
構造化アセンブリ言語のマクロ表記すら完全に無視して独自の記法を作り上げた挙句
その仕様を残さなかった団塊の弟子(ベビーブーマー)
C/C++が読めないとお冠です。


Cでかいてコンパイラ掛けて読めよ。もう好きにしてくれ。
老人介護はたくさんだ
665デフォルトの名無しさん:2010/02/20(土) 11:06:08
せめて日本語で書いてくれ
666デフォルトの名無しさん:2010/02/20(土) 11:13:33
日本語本当に分かるか?
667デフォルトの名無しさん:2010/02/20(土) 12:52:15
構造化コボルってのもあったような
668デフォルトの名無しさん:2010/02/20(土) 14:54:00
OO COBOL すらあるぜ。
669デフォルトの名無しさん:2010/03/02(火) 21:26:42
test
670デフォルトの名無しさん:2010/03/02(火) 23:20:18
>>664
日本語でおk
671デフォルトの名無しさん:2010/03/09(火) 04:15:38
オブジェクトフォートランとか
オブジェクトエイダとかもあるのかな
672デフォルトの名無しさん:2010/03/15(月) 05:50:52
_UBYTE ringrd(void) { の最適化。IARのcだから返却値はR6L。
   mov  #ring,ER5  ; ER5 = FFxx00
   mov  @rpt,R5L   ; + リードポインタ
   mov  @ER5+,R6L ; これが最適化のミソ!
   mov  R5L,@rpt   ; return( r0ring[c0r_rpt++] )
   rts   [256]のringはLINKでFFxx00に配置する。cだとアドレス演算が出てこの倍
673デフォルトの名無しさん:2010/03/15(月) 12:52:49
オブジェクトアセンブラはないの?
674デフォルトの名無しさん:2010/03/15(月) 13:45:40
それはマクロアセンブラと何が違うんだい?
675デフォルトの名無しさん:2010/03/30(火) 22:25:55
>>672
Monate
ttp://sourceforge.net/projects/monate-oop-asm/

>>674
オブジェクト指向という点だな。マクロは所詮プリプロセッサだろ。
676672:2010/03/31(水) 04:04:16
俺にレスがついたのかと思ったらアンカー間違いか
677デフォルトの名無しさん:2010/09/12(日) 09:38:58
CASLで素数求数してみた

ロジックはすぐできた

ディスプレイ表示で幽体離脱するほど苦しみ厨
678デフォルトの名無しさん:2010/09/12(日) 12:34:45
素数サーバーを作って
クライアントの画面に出せば良い
679デフォルトの名無しさん:2010/09/17(金) 23:20:07
そうなの?
680デフォルトの名無しさん:2010/09/19(日) 14:13:00
for(i=0;i<16;i++)
a[i]^=(d[i]+c[i])%16;
このプログラムをSSE2で書きたいのですがわかりません。
教えてください。よろしくお願いします。
C言語からインラインアセンブラで呼び出したいと思うのですが、
うまくいきません。
moveq d,%xmm0
moveq c,%xmm1
paddb %xmm1,%xmm0
moveq a,%xmm1
pxor %xmm1,%xmm0
配列のデータをレジスタにセットするところもわかりません。
681デフォルトの名無しさん:2010/09/19(日) 15:49:43
>>680
> このプログラムをSSE2で書きたいのですがわかりません。
なにが、どう、わからないんだ?

> C言語からインラインアセンブラで呼び出したいと思うのですが、
> うまくいきません。
どううまくいかないんだ?
エラーがでるのか?でるならエラー内容は?

> 配列のデータをレジスタにセットするところもわかりません。
SSE2の前にアセンブリ言語はわかるのか?
682デフォルトの名無しさん:2010/09/19(日) 15:53:35
64ビット環境だとそもそもインラインアセンブラ廃止されたような
683デフォルトの名無しさん:2010/09/19(日) 15:55:49
x86アセンブラ入門という本を参考に高速化しようとしてるんですがアセンブラ
はよくわかりません。
ただC言語で書いたプログラムをSSE2で書き変えたら早くなるだろうと思ってます。
アセンブラの命令は書いてあるのですがインラインアセンブラを使って書けない
のです。丸投げで悪いのですが教えてほしいです。
684デフォルトの名無しさん:2010/09/19(日) 15:58:49
それはさすがに丸投げ過ぎる
SSE2とかいう以前の問題
まずはハロワ並みのコードをアセンブラで練習するべき
685デフォルトの名無しさん:2010/09/19(日) 16:01:45
そもそも早くなるんでしょうか?
686デフォルトの名無しさん:2010/09/19(日) 16:03:49
ベクトル化に適した処理と適してない処理がある
ケースバイケースなのでなんとも言えない
十分独立した演算を行う場合でも、
レジスタに出し入れするのに複雑なデータ変換や余分なメモリアクセスが挟まると
場合によって遅くなったり
687デフォルトの名無しさん:2010/09/19(日) 16:08:26
基本的に行列演算です。
データの配列の添え字を計算する16バイトの配列どうしの計算を
paddbとpxorを使ってループなしで計算できるのではと思っています。
688デフォルトの名無しさん:2010/09/19(日) 16:19:18
>ハロワ並みのコード
ハローワーク並のコード?と一瞬納得してしまいかけて
689デフォルトの名無しさん:2010/09/19(日) 16:45:01
Hello, world!
690デフォルトの名無しさん:2010/09/19(日) 16:45:52
>>687
多分速くなるんじゃない
やってみないと何とも言えないけど
691デフォルトの名無しさん:2010/09/19(日) 16:52:16
gcc -tfree-vectorize *.c で自動ベクトル化コードを生成する
というオプションがあるので試してみたけど全然変わらなかった。
692デフォルトの名無しさん:2010/09/19(日) 18:21:13
そういえば%書いてあるからgccか
gccでは変数をインラインアセンブラ内に直接書けないぞ
ttp://caspar.hazymoon.jp/OpenBSD/annex/gcc_inline_asm.html
693デフォルトの名無しさん:2010/09/19(日) 18:37:50
-O3 -ftree-vectorize -ftree-vectorizer-verbose=5 -mmmx -msse3
早くなったとは体感できないけど、アセンブラソースは小さくなった。
694デフォルトの名無しさん:2010/09/19(日) 18:49:10
-S でアセンブラのソースを出力して比較しようぜ
695デフォルトの名無しさん:2010/09/19(日) 18:50:02
ループ構造のコードとかを適切に書かないと
ベクトル処理向けには上手く最適化されないぞ。
696デフォルトの名無しさん:2010/09/19(日) 18:58:33
これがベクトル化されれば夢のような話だ!

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)%255)+1];
d2[i]^=GF[mlt(FG[a[j]],FG[h2[i][FG[b[j]]]])];
}
}
697デフォルトの名無しさん:2010/09/19(日) 19:30:36
int a[]={130, 160, 130, 193, 130, 211, 130, 241, 130, 160, 130, 169, 130, 241, 130, 196};
int 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.

ベクトル化できない。なぜ?
698デフォルトの名無しさん:2010/09/19(日) 20:49:25
こう書いたらアセンブラソースリストが2倍近く小さくなった。

for(i=0;i<16;i++)
a[i]^=(b[i]+c[i])&0xff;
699デフォルトの名無しさん:2010/09/19(日) 20:52:37
a[i]^=(b[i]+c[i])%16;
a[i]^=(b[i]+c[i])&0xff;
って同じことをするんですか
700デフォルトの名無しさん:2010/09/19(日) 21:13:06
違うみたい
701デフォルトの名無しさん:2010/09/19(日) 21:53:31
a[i]^=(b[i]+c[i])&0xf;
の間違い。
702デフォルトの名無しさん:2010/09/19(日) 21:55:40
>>696
そもそも、アドレスの遷移が複雑すぎて
ベクトル処理向きじゃないんじゃねえか?
テーブルがキャッシュに載りきるぐらいなら
別の方法で速くはなりそうだが。

>>698
0xFF は 255 だぞ。
703デフォルトの名無しさん:2010/09/19(日) 22:01:23
255以下の数に変換したいだけです。
256は要らない。
行列の大きさは4kbyte位なのでキャッシュに入りそうです。
別の高速化でもいいので教えてください。
配列のメモリアクセスがボトルネックになっている可能性があります。
704デフォルトの名無しさん:2010/09/19(日) 22:04:34
部分的にベクトル変換に成功しているのですが実行速度が-O3のみの
時より10倍くらい遅くなってしまいます。
なぜでしょう?
705デフォルトの名無しさん:2010/09/19(日) 23:41:54
配列の中身は、256以上の時はあるのかい?
706デフォルトの名無しさん:2010/09/19(日) 23:43:22
h[32][256]
GF[256]
FG[256]
配列はこれだけです。
707デフォルトの名無しさん:2010/09/19(日) 23:45:22
配列をintで宣言してるけど、unsigned charで宣言は出来ないのかなと思って
708デフォルトの名無しさん:2010/09/19(日) 23:50:45
unsigned charにすると自動ベクトル生成に失敗します。
-O3 -ftree-vectorize -ftree-vectorizer-verbose=5 -mmmx -msse2
709デフォルトの名無しさん:2010/09/19(日) 23:55:10
sse使わないと早くならないのかいな?
710デフォルトの名無しさん:2010/09/20(月) 00:03:46
行列演算なのでループをなくしたいです。
128ビット演算なのでSSE2で最適化できるかと思ったのです。
711デフォルトの名無しさん:2010/09/20(月) 00:08:02
データの中身は8ビットみたいだけど(intでも32ビット)
見間違いかな
712デフォルトの名無しさん:2010/09/20(月) 01:45:36
データは8ビットで統一されてます。出力は8×32ビット
713デフォルトの名無しさん:2010/09/20(月) 02:05:01
2個コードがあるから、どっちのことかわかんねえじゃねえか。
714デフォルトの名無しさん:2010/09/20(月) 02:11:44
for(i=0;i<16;i++)
a[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以外でもキャッシュを工夫して高速化できればいいかと思います。
何かいい方法があったら教えてください。
715デフォルトの名無しさん:2010/09/20(月) 08:52:24
スレタイに従うなら、アセンブラで書いた方がいいんじゃないの
716デフォルトの名無しさん:2010/09/20(月) 09:13:39
次のようにして本体部分の自動ベクトル化も成功しました。
2秒ほど高速になりました。

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;
}
717デフォルトの名無しさん:2010/09/20(月) 12:11:15
嘘です。18秒かかります。
GPGのAESは7秒 orz
718デフォルトの名無しさん:2010/09/22(水) 09:23:22
#include <stdio.h>
#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を使って最適化したいのですがわかりません。
アセンブラで書くしかないのでしょうか。
719デフォルトの名無しさん:2010/09/22(水) 09:38:14
ここの掲示板って知ったかぶりでメーカーの商品の批判ばっかりしてる奴ばっかりだね。
どうせ文句言いながらも使ってるくせに。メーカーさんの苦労もかんがえろ。そんなに
そんなに嫌ならOSもパーツも自分で作れ。どうせお前らには出来ないが。今大学院で
OSの研究をしているが、純粋にみんな凄いって感心している。オタクの集まりっていうのは
ほんまウザいねん。お前らに電子工学の知識があるのか?情報科学を学んだことがあるのか?
お前らまともに勉強してから文句言え。
720デフォルトの名無しさん:2010/09/22(水) 09:59:12
>>719 スレ違いのおまえが一番ウザい
721デフォルトの名無しさん:2010/09/22(水) 11:09:17
>>718
C言語なら俺に聞け(入門編)Part 69
http://hibari.2ch.net/test/read.cgi/tech/1284477697/464-
722デフォルトの名無しさん:2011/02/11(金) 20:06:45
XCode 3.2.3 で Release | i386 構成でアセンブルすると
どうも 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)
723デフォルトの名無しさん:2011/02/11(金) 20:17:58
age忘れた
724デフォルトの名無しさん:2011/02/16(水) 11:21:48
え?
725デフォルトの名無しさん:2011/03/10(木) 07:16:19.45
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************


http://sky.geocities.jp/ttl_ttl_ttl_pic/

NASMでC言語を作る NASMで高度な設計書類とNASMの簡単な利用方法のサイトです
C言語のHEADの作り方 DLLファイルの作り方が書いてあります
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
****************************************************************
726デフォルトの名無しさん:2011/03/10(木) 07:25:36.87
Rubyで書こう
727デフォルトの名無しさん:2011/03/10(木) 08:18:00.85
×C言語を作る
○Cの下請け処理を汗で書く?
728デフォルトの名無しさん:2011/03/15(火) 22:00:57.52

ttp://n.xxad.net/watch/sm13809685

【どうすればこの欲望の渦巻く堕落した世界に私の名を残せるだろうか】
※名を残したいとは思わないがw。
【狂乱のマシンを残せばいい】

【この狂乱の世界に相応しい野獣のようなマシンを】

【狼が来たからやってきた】

【お前の平和な街は今はもう安全ではない】
729デフォルトの名無しさん:2011/03/16(水) 00:13:45.99
アホは逝け
730デフォルトの名無しさん:2011/03/16(水) 12:53:02.83

は〜い、逝きますwww。
731デフォルトの名無しさん:2011/03/22(火) 10:54:41.99
x86とAMD64(?)64bitのやつの逆アセンブルとアセンブルをプログラムから利用出来るようなライブラリってありませんかね?
アセンブラインタプリタみたいなので利用したい
732福盛俊明:2011/03/27(日) 03:00:55.53
アハ〜♪”
733デフォルトの名無しさん:2011/03/27(日) 03:22:48.69
>>731
意味がわからん
734デフォルトの名無しさん:2011/03/27(日) 10:34:45.54
>>731

クロスアセンブラって知ってる?
インタプリタは無理だけど(てか、インタプリタ自体に32bit/64bitが有っても、ソースにbitは関係無いし)、バイナリ作るだけなら、理論上、16bitOS上でも64bitのバイナリ作れるよ

ちょっと調べればアセンブラは32bitでも64bitのバイナリ作れるのは有るんじゃ無い?
735デフォルトの名無しさん:2011/03/27(日) 10:41:35.65
ちなみに、x86のgasにちょっと細工するだけで、GBA(ARM)向けのバイナリが作れます

クロスアセンブラは簡単にアーキテクチャの壁を超えられる良い例ですね
(アセンブラの場合、アーキテクチャの壁とハード仕様の壁、両方超える必要が有りますが)
736 忍法帖【Lv=2,xxxP】 :2011/03/29(火) 08:58:38.67
ぐぬぬ
737デフォルトの名無しさん:2011/03/30(水) 11:38:30.63
>>734
そうそうだから文字列をバイナリに変換するライブラリが欲しい
作れるだけでいいんです
例えばプログラムでアセンブラを変換してバイナリを生成して
メモリに投入して関数ポインタで呼び出して実行するみたいなことがしたい
もちろん逆もしたいので逆アセンブル機能も欲しい
738デフォルトの名無しさん:2011/03/30(水) 11:40:47.63
要するにメモリ上で現在動いてるプログラムの関数をリアルタイムでデバッグしたい
そういうレベルのデバッガを作ろうとしてて、アセンブラライブラリが欲しいんです
739デフォルトの名無しさん:2011/03/30(水) 11:47:30.97
自分で作るしかないでしょ
740デフォルトの名無しさん:2011/03/30(水) 14:00:15.93
俺はVSの逆アセで済ましてるな。作るの面倒。
理論上は、数値入りの命令は工夫が居るけど、全種類のデータあれば単純に検索だけで実装できるよね。
741デフォルトの名無しさん:2011/03/30(水) 14:21:59.95
オペランドに計算式書けるようにするとかしなけりゃ
大した手間かからんべ

命令コード汚いと泣きたくなることもあるが
742デフォルトの名無しさん:2011/03/30(水) 16:05:25.07
それもある
自分で実装すると変数やラベルまでやるのは大変だから
ライブラリであると助かるんだよな
743デフォルトの名無しさん:2011/03/30(水) 19:34:31.88
汗にライブラリってのがわからん
744デフォルトの名無しさん:2011/03/30(水) 20:32:50.07
アセンブリ言語で書かれたライブラリ、にしろ
アセンブリ言語から利用するライブラリ、にしろ
普通にあるものだと思うが
745デフォルトの名無しさん:2011/03/30(水) 20:35:52.51
今時、そんな発想するんか?
746デフォルトの名無しさん:2011/03/30(水) 20:43:00.22
JITコンパイルか動的バイナリ変換でもしたいのかと思った
747デフォルトの名無しさん:2011/03/30(水) 23:46:27.15
Windowsの通常あり得ない方法でプログラムを動かしたりするのに
バイナリをあらかじめ用意するとか出来ないし
オフセットが変わるとごろっと変わってくるからね
というかリアルタイムでメモリをいじって挙動を調べたりすることをやってるもんで
まさにアセンブラのインタプリタが欲しいのですよ
748デフォルトの名無しさん:2011/03/31(木) 00:19:13.63
ハッカーになりたいんだったら、こっそりやったほうがいいよ
749デフォルトの名無しさん:2011/03/31(木) 14:12:58.87
そういうことをやりたいなら、一行アセンブラくらいサクッと
作れないとダメだろう
750デフォルトの名無しさん:2011/03/31(木) 21:55:29.04
アセンブラは力技だから誰がやってもサクッとはいかないよ
何千行のソースは約束されてるし
751デフォルトの名無しさん:2011/04/01(金) 17:11:15.68
アセンブラで一度実用的なプログラムを書いた経験があれば、Cの有り難さが身に染みて分かる
752デフォルトの名無しさん:2011/04/03(日) 15:34:37.06
C言語で多くの実用的なプログラムを書いた経験が有れば、アセンブラのここぞというありがたさが身に染みてわかる
753デフォルトの名無しさん:2011/04/03(日) 16:49:47.77
>>752
あほか
思いっきり機種依存の話をしてどうする
754デフォルトの名無しさん:2011/04/03(日) 17:03:45.86
>>751には同意出来るが、>>752には同意しかねるな

実用的なアプリ = 速度が要求されるアプリとは限らないし、移植性や保守性を考えたら、アセンブラは使わないに越した事はない
755デフォルトの名無しさん:2011/04/03(日) 17:10:56.46
Cじゃ速度的に間に合わなくてCPUごとにアセンブラ使ってる俺涙目
ちなみに今度8種類目
756デフォルトの名無しさん:2011/04/03(日) 17:23:45.86
>>755
マジで涙目だな。。。
体壊すなよ
757デフォルトの名無しさん:2011/04/03(日) 23:15:13.50
C で書いてても、大事なところは objdump 等で
アセンブラを確認してる。
758デフォルトの名無しさん:2011/04/04(月) 04:27:16.76
cは 「抽象化されたアセンブラ」 である、ってのは至言だよな
759デフォルトの名無しさん:2011/04/07(木) 18:57:10.42
節電が一番大事な世の中になってきた
C、アセンブリ語、マシン語を紙に書く時代に戻るの?
760デフォルトの名無しさん:2011/04/07(木) 19:21:44.33
休肝日をまねて休電日を作るとか。
761デフォルトの名無しさん:2011/04/09(土) 00:40:44.47
コーディングなんて仕事全体の2割以下だろ。
762デフォルトの名無しさん:2011/04/10(日) 13:11:42.79
そして唯一の楽しいフェーズなんだ。
763デフォルトの名無しさん:2011/04/10(日) 13:16:13.28
昔のファミコンプログラマーはなんでもかんでもアセンブラーで書いて、すごいと思います。
764デフォルトの名無しさん:2011/04/10(日) 15:18:35.94
当時の開発環境で C 使うのも、それなりに苦行な気も。
765デフォルトの名無しさん:2011/04/10(日) 15:31:26.19
intが2バイトだったりとかいろいろ気をつかうからねぇ
766デフォルトの名無しさん:2011/04/10(日) 16:10:04.87
アマチュア時代、MSXでC言語でゲーム作ったりしていました。
hello,worldをコンパイルするだけで4分ぐらいかかってました。その間フロッピードライブが
ものすごい勢いで動き続けるのでいつか壊れるだろうと思ってました。

ゲームが完成する頃には総コンパイル時間が1時間ぐらいだったと思います。
完成したゲームをMSX-FANに投稿しましたが、採用されませんでした。
私の苦労は・・・。

ちなみに当時のソースをひっぱりだしててきて、Phenom II 3GHzという環境上で、CP/Mエミュ
レータ+コンパイラでコンパイルしたら物の数秒でコンパイル完了しました。

767デフォルトの名無しさん:2011/04/10(日) 18:46:21.98
数秒も掛かったのか。
CPUがざっと1000から1万倍、ディスクがざっと1000倍速くなっていることを考えると遅過ぎる。
768デフォルトの名無しさん:2011/04/11(月) 01:53:07.49
>>766
あの時代だとBDS-Cあたりか
俺は耐えられなかったのでTurbo Pascalで遊んでた

>>767
Z80エミュレーターで走ってるんだから十分速いだろう
769デフォルトの名無しさん:2011/04/13(水) 23:27:49.58
マルチコア使うアセンブラ、どう書いたらいいのか全然わからん。。。
誰かマルチコア cortex-a9 の使い方、
どこでどう勉強したらいいか教えてください。
770デフォルトの名無しさん:2011/04/13(水) 23:31:14.67
マルチコアで書き方が変わることはありません。
atomicな処理が出来れば、ハマることはないと思うけど
771デフォルトの名無しさん:2011/04/15(金) 18:49:31.58
シングルとして書いた処理をマルチスレッドにすりゃいいだけでは?
例えば0から100の処理をループする時に
偶数用スレッドと奇数用スレッドを用意してインデックスを渡して
後の処理内容はまったく同じ
772デフォルトの名無しさん:2011/05/02(月) 18:09:16.43
>>769
メモリバリア・キャッシュ、
グローバルなリソースの排他、
プライオリティ インバージョン
の3つが解っていればあとは応用編。


単にスレッド3本走らせるだけなら
>>770-771 のとおり何も変わらん。

待ち合わは wfe とかか。
773デフォルトの名無しさん:2011/05/15(日) 05:53:53.62
x86でリング3で実行出来るキャッシュフラッシュ命令はありませんか?
INVDやWBINVDは特権命令なので実行しようとすると例外が出て止まります
774デフォルトの名無しさん:2011/05/15(日) 07:05:35.70
リング3を解除すること考えたら
775デフォルトの名無しさん:2011/05/15(日) 12:44:10.33
その状態でキャッシュフラッシュせにゃいかん状況が想像できない
ハード絡みならそっちからフラッシュ要求だしてもらうべきだろう
776デフォルトの名無しさん:2011/05/16(月) 19:23:42.04
>>774
そうですねデバイスドライバモドキを作ってそこで実行するかな

>>775
2つのアルゴリズムを比較したい時に前のデータがキャッシュに残っていたら
アレなので両方ともキャッシュをフラッシュしてから実行開始する簡単な方法が
あればと思いました
777デフォルトの名無しさん:2011/05/16(月) 20:39:36.41
全く関係ない巨大配列を読み書きすれば、テストデータがキャッシュから追い出されるんじゃない?
778デフォルトの名無しさん:2011/05/16(月) 21:24:45.67
>>777
それで行くか
779デフォルトの名無しさん:2011/05/16(月) 21:58:38.60
その後キャッシュされるのに
780デフォルトの名無しさん:2011/05/17(火) 12:21:13.04
>>779
それでいいんだよ
それぞれのアルゴリズムのテスト前にキャッシュから追い出せばいいわけ
781デフォルトの名無しさん:2011/05/17(火) 20:05:00.84
今時のOSで、キャッシュフラッシュして何やりたいんだか
実行時間計測?
782デフォルトの名無しさん:2011/05/17(火) 20:18:43.68
>>781
キャッシュフラッシュの用途で、それ以外何があると
783デフォルトの名無しさん:2011/05/17(火) 21:26:48.92
なんだかなあ〜
784! 【24.1m】 【東電 66.0 %】 :2011/09/23(金) 18:59:44.48
何だよ
ハッキリ言えよ
785デフォルトの名無しさん:2011/09/23(金) 19:17:57.44
今時のOSでキャッシュフラッシュとか逝ってるところが
786デフォルトの名無しさん:2011/09/24(土) 20:08:45.15
何なのよ?
787デフォルトの名無しさん:2011/10/01(土) 21:24:40.70
Linux のアセンブラ割り込みじゃなくsysenter使ってx86 32bitタイプCPUで出来るんでしょうか?
色々ネットをgoogleで調べたのですが、良くわかりません。

Darwinと64bitタイプ向けのサンプルは発見できたのですが。

788デフォルトの名無しさん:2011/10/01(土) 21:32:41.39
>>787つづき
コンパイルして動作させようとしたのは、"hello world"を表示するものでした。
ソフト割り込み(かな int 0x80でシステムコールしてました)は上手く動作しました。

789デフォルトの名無しさん:2011/10/01(土) 23:02:10.33
>>785
コンテキストスイッチの時にキャッシュ汚染されるから同じようなもんだろうが
790デフォルトの名無しさん:2011/10/01(土) 23:59:37.68
>>787
cpuidのsep立ってればできる
今時のCPUなら全部対応していると思うが
791uy:2011/10/03(月) 14:00:28.26
もうどんなときでもアセンブラでかくのは極力やめたほうがいいんだろうな

たとえそいつがかけても、そいつがいなくなったら誰もメンテできないという自体になる
アセンブラでやるっていうのは最終手段になりつつある

>>1のいうように下手にかけば遅いし、
速いアセンブラコードかくには、アセンブラである程度何か書いた事がないと
コンパイラの最適化の下をいく

アセンブラで速いコードをかけるとか、
そんな技術者はもうほとんどいないし、これから若手がそういう人材になる見込みも
792uy:2011/10/03(月) 14:03:04.75
きわめて薄い ただB言語やPascal言語と違って、上位互換が出てきたわけじゃなく
所詮、いまだアセンブラは奥の奥で使われているから、誰も使えない、誰もかけないなんて状況には
ならないんだけどな、 本当の意味で正しくアセンブラ言語を発音できるやつは、いずれ絶滅危惧種になる

才能のないやつがプログラマとして生きるなら「ここ」だよ
「ここ」だけは才能がいらず、知識量だけでやっていける
アセンブラはそういうもの

ゴミみたいなやつでもできる あ、だけどバカにしているわけじゃないよ
がんばれ
793デフォルトの名無しさん:2011/10/03(月) 14:54:22.63
>>792
「ゴミみたいなやつ」とは自己紹介乙
79450代スレの古参PG:2011/10/03(月) 17:07:16.45
そのゴミみたいな奴の一人です(w 
実際、古代の石でASM開発された奴の保守は私ぐらいしか出す先がありません。
狭い狭いニッチですが、フジツボみたいにしがみついてます。 趣味+実益(w
795! 【13.8m】 【東電 70.4 %】 :2011/10/03(月) 22:55:49.41
箱モノならアセンブラなんぞいっぱいあるだろ
796デフォルトの名無しさん:2011/10/04(火) 09:46:25.72
Photoshopのフィルタってアセンブラで書かれてるって聞いたんですが本当ですか?
797デフォルトの名無しさん:2011/10/04(火) 09:58:57.31
インラインアセンブラが使えないコンパイラしか持ってないとか
そういう理由でもない限り、C/C++で書かない理由が見当たらない。
798デフォルトの名無しさん:2011/10/04(火) 10:34:47.90
インラインアセンブラで書く、という意味を含めて、アセンブリ言語で書く可能性としては、
画像のピクセル毎の処理とかで、かつSSE命令を使うとか、飽和加算が必要とか、
いくつか可能性は考えられるけどね。けどまぁほんとにごく一部のコードに限られるはず。
799デフォルトの名無しさん:2011/10/04(火) 10:42:10.18
ハッカーもやっぱりアセンブラでプログラム書いてるんじゃないかい?
マシン語でプログラム書くの大変でしょ
修正するたびにjmpのアドレス値を全部書き換えなきゃいけないとか
800デフォルトの名無しさん:2011/10/04(火) 20:03:12.90
汗でんでんはどうでもよくてマイクロアーキテクチャをどれだけ理解してるってところじゃないかな?
シムとかプロフなしに速いループを書くのはやっぱり難しいよ。
801デフォルトの名無しさん:2011/10/04(火) 21:52:36.02
16bitあたりならコンパイラよりも人の方がいいコードをかける
それ以上はそんなことする気にもなれん
802デフォルトの名無しさん:2011/10/04(火) 22:08:48.76
>>801
禁止しない限り人が書いたコードを最適化する RISC チップ用アセンブラもあることだしねぇ
803デフォルトの名無しさん:2011/10/05(水) 03:04:51.65
ここでいってるビット数はOPコード長でいいんだよね?
804デフォルトの名無しさん:2011/10/05(水) 11:45:19.56
>>803
バイトマシンであるところのx86は8bitかよと
805デフォルトの名無しさん:2011/10/05(水) 15:25:26.72
内部バスのパラレル幅 でいいんだよね?
806デフォルトの名無しさん:2011/10/05(水) 18:30:34.35
どうでもいい
807デフォルトの名無しさん:2011/10/05(水) 20:38:48.71
ALUのbit長にきまっとろうが
808デフォルトの名無しさん:2011/10/05(水) 22:11:15.33
今時、何Bit CPUと言う定義は意味がない。
>>804 可変長OPコードだぞ。
809デフォルトの名無しさん:2011/10/06(木) 02:21:52.64
>>804
そうそう、x86は8ビットマシンに見えてしまって。
810デフォルトの名無しさん:2011/10/06(木) 05:54:11.26
>>807 IBMの S/360,370は、ALUは32bitだったがアーキテクチャーは16bitだった。
たしかに、今では >>808 が正解のようだ。
811デフォルトの名無しさん:2011/10/06(木) 11:26:09.27
リセット直後にコード解釈のためフェッチするサイズだな
812デフォルトの名無しさん:2011/10/06(木) 16:41:51.51
H8なんか同じ石でどっちでも動くようになってる。
813デフォルトの名無しさん:2011/10/06(木) 17:54:12.22
>>811
なにその、無理矢理な定義wwwww
814デフォルトの名無しさん:2011/10/06(木) 22:25:23.33
>>801を逆に定義にする
815デフォルトの名無しさん:2011/10/07(金) 15:04:00.81
ワロタ それイイな。 人がコンパイラを越えられなくなったら32bitね
816デフォルトの名無しさん:2012/02/12(日) 17:00:40.61
22 名前:デフォルトの名無しさん[sage] 投稿日:04/10/11(月) 20:19:26
>>21
ARMは、そろそろ使用に耐えなくなる頃合だよん
817デフォルトの名無しさん:2012/02/13(月) 05:40:19.89
DATとCLKでシリアル出力する関数を、速くするためにforを使わずのべたんで書いた。
  ROTL R6      ; MSBから出力 石とASMはH8S
  BST  #1,@P4DR
  BSET #0,@P4DR
  BCLR #0,@P4DR
これをbit数分、並べた。forのカウントもしないし、cだとportを読んでmaskで変更して
書き戻すコードしか出ないから、cでは書けない関数の好例。
818デフォルトの名無しさん:2012/02/13(月) 16:09:54.46
if (hoge & (1 << bit))
*P4DR | = 1;
else
*P4DR & = ~1;
て書いたら
bld #bit,RnL
bst #0,@P4DR
て最適化してくれるようになればいいんでないかと思う
819デフォルトの名無しさん:2012/02/14(火) 04:13:33.73
今のところH8系のcではできないの。P4DR.1 = R6=rotlw(1,R6); とは書けるけど、
ROTL R6 BST #1,@P4DR ではなくR6→R5 R5からBLDでCYに取り出してBSTする。
c中にASMコードも書けないのでASMの関数コールを用意するしかなかった。

AduCという所のcはCYまで使えるので817の書き方ができるお利口さんだが、
すごくローカルな方言。
820817:2012/02/14(火) 04:38:59.09
当時のソフトボート社提供の<INH8.h>の中身は
#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なら書けるんだけど。
821デフォルトの名無しさん:2012/02/14(火) 22:14:36.01
動作周波数が遅いのか
速度を必要としてるのか
データシートに書いてある最高速度で動かしたいのか

速さが必要ないのに汗で書くことも無いような
ほんとに速さが必要になった時に汗でも書けるぐらいでいいんじゃねえの

Cであがいて最後は全部汗とか、はまりパターンにならんように
最初にどっちで書くのがいいか見極めが必要なのかも
822817:2012/02/15(水) 04:09:34.73
前の世代の製品のときに、パルスがトロいって文句いわれたんですよ。
同じ部署の次世代製品だったから、企画の時からこれ以上出せない文句無しの
出してやろうと決めていました。動き出してから、書き込み速いねって誉められました。
動作周波数は、分周してuartの適切なレートが出る奴を選ぶので、CPUの最高より
若干低め:16.588とかの半端なクロックが使われます。

別の部署の製品では、seup/holdが4μのPLLでCPUが20MHzだったため、1パルス
毎にディレイかまさなくちゃいけなくて、なんかくやしかったり(w
ハード屋さんに聞いたら、(回路をケチるためらしいんだけど)横浜コンチみたいな
波形なので、トロくさせることで確実にしてるみたい。
823817:2012/02/18(土) 05:03:46.97
>seup/holdが4μ 40μの間違いでした。
824デフォルトの名無しさん:2012/04/30(月) 05:22:50.09
領海
825デフォルトの名無しさん:2012/05/07(月) 23:18:48.43
今のCPUって単一スレッドでも多重パイプラインで複数命令実行してたりして
訳分からないnopとかいっぱい入ってるし、命令ブロックの配置とか
元のロジックの順番変わったりするしそんなの手作業でハンドアッセンブルなんて
不可能じゃないの?初期のペンティアムのUパイプだのVパイプだのの時点でもう
訳わからん
826デフォルトの名無しさん:2012/05/08(火) 10:28:53.35
「今のCPU」って一口に言っても、Ivy Bridgeも、PICもあるから一概に言えん。
827デフォルトの名無しさん:2012/05/08(火) 18:26:40.26
この文脈でそう言っちゃうのは馬鹿だろう。
828デフォルトの名無しさん:2012/05/08(火) 19:49:03.15
「単一スレッドでも多重パイプラインで複数命令実行してたりして訳分からないnopとか
いっぱい入ったりする、命令ブロックの配置とか元のロジックの順番変わったりする
今のCPUって、手作業でハンドアッセンブルなんて不可能じゃないの?初期のペンティ
アムのUパイプだのVパイプだのの時点でもう訳わからん」

せめてこう書くべき
829デフォルトの名無しさん
わけわからんでもSpecintとかSpecfpがあるだろ

http://www.cpubenchmark.net/cpu_list.php

こういう所もあるけどな