13/06/03 01:26:18.00 .net
push %ebp 新たなフレームポインタを書き込むためebpをスタックに退避
mov %esp,%ebp フレームポインタを更新
sub $0x28,%esp 28バイト分のローカル変数領域をスタックに確保
391:デフォルトの名無しさん
13/06/03 03:11:30.78 .net
>>382
> sub $0x28,%esp 28バイト分のローカル変数領域をスタックに確保
40バイト
392:デフォルトの名無しさん
13/06/03 07:18:49.71 .net
movl $0xaea4a4af,-0x13(%ebp)
movl $0xb6b2a6ba,-0xf(%ebp)
movw $0xc4,-0xb(%ebp)
movb $0x0,-0x9(%ebp)
続きでこういうものがあればどう動くのですか?
393:デフォルトの名無しさん
13/06/03 07:23:58.95 .net
>>384
URLリンク(www.intel.co.jp)
URLリンク(www.google.co.jp)
394:デフォルトの名無しさん
13/06/03 09:35:43.09 .net
push %ebp ;ebpの退避(以前の BP の値)
mov %esp,%ebp ;ローカル変数参照時にBPを使ってる?
sub $0x28,%esp ;ローカル変数領域の確保
何がやりたくて質問してんのやら
395:デフォルトの名無しさん
13/06/03 15:42:11.79 .net
void foo(void)
{
uint32_t a,b;
uint16_t c;
uint8_t d;
a = 0xaea4a4af;
b = 0xb6b2a6ba;
c = 0xc4;
d = 0;
:
:
:
396:デフォルトの名無しさん
13/06/03 16:48:02.81 .net
アラインメント取れていないし文字列でないかい
397:デフォルトの名無しさん
13/06/03 16:54:22.97 .net
こういうものがありどのように動くのかなとおもいまして、できれば動きを順番に解説していただきたいorz
0x0804840c <+0>: push %ebp
0x0804840d <+1>: mov %esp,%ebp
0x0804840f <+3>: sub $0x28,%esp
0x08048412 <+6>: movl $0xaea4a4af,-0x13(%ebp)
0x08048419 <+13>: movl $0xb6b2a6ba,-0xf(%ebp)
0x08048420 <+20>: movw $0xc4,-0xb(%ebp)
0x08048426 <+26>: movb $0x0,-0x9(%ebp)
0x0804842a <+30>: jmp 0x804844b <foo+63>
0x0804842c <+32>: movzbl -0x9(%ebp),%eax
0x08048430 <+36>: movzbl -0x9(%ebp),%edx
0x08048434 <+40>: movzbl -0x13(%ebp,%edx,1),%ecx
0x08048439 <+45>: mov $0xffffffcc,%edx
0x0804843e <+50>: sub -0x9(%ebp),%dl
0x08048441 <+53>: xor %ecx,%edx
0x08048443 <+55>: mov %dl,-0x13(%ebp,%eax,1)
0x08048447 <+59>: addb $0x1,-0x9(%ebp)
0x0804844b <+63>: cmpb $0x9,-0x9(%ebp)
0x0804844f <+67>: jbe 0x804842c <foo+32>
0x08048451 <+69>: lea -0x13(%ebp),%eax
0x08048454 <+72>: mov %eax,(%esp)
0x08048457 <+75>: call 0x80482f0 <puts@plt>
0x0804845c <+80>: leave
0x0804845d <+81>: ret
398:デフォルトの名無しさん
13/06/03 17:04:43.50 .net
自分であたまを使おうという気はゼロ
399:デフォルトの名無しさん
13/06/03 17:26:14.85 .net
>>389
こりゃ荒らしだな
400:デフォルトの名無しさん
13/06/03 21:00:12.43 .net
0xccでxorした文字列(10文字�
401:jを戻して表示してるだけ
402:デフォルトの名無しさん
13/06/03 21:20:33.05 .net
おまいらいじわるだな
せめて金額交渉くらいしてやれよ
403:デフォルトの名無しさん
13/06/07 12:03:20.18 .net
アセンブラのディレクティブなどの方言説明がばらばらって困るよな。
同じCPUなのに命令記述が違いそんなレジスタないみたいな。
データの流れが右から左へと左から右へと逆だったり。
酷いのは命令語のニーモニックが特殊な略なのにその説明がどこにもない。
インラインアセンブラとかも個性ありすぎるのにインライン部分の仕様は
解説が一切ないみたいな。
404:デフォルトの名無しさん
13/06/07 12:12:03.69 .net
嫌だったら使うなよ
そのためにC言語とかあるんだから
アセンブラ無しでハンドアセンブルなんて事もしょっちゅうだぞ
405:デフォルトの名無しさん
13/06/08 12:28:44.95 .net
統一仕様を策定してユーザーを増やそう という世界じゃないから
406:片山博文MZパンク ◆0lBZNi.Q7evd
13/06/08 18:53:19.31 .net
ndisasmのバグ発見!
F2 0F D6 ...
が正しくMOVDQ2Qに変換されない。
407:片山博文MZパンク ◆0lBZNi.Q7evd
13/06/12 12:07:16.18 .net
ごめんなさい、バグじゃなかったみたい
408:デフォルトの名無しさん
13/06/17 00:48:25.48 .net
>>397
たんにサポートしていないだけだろ。正式対応まで待て。
409:デフォルトの名無しさん
13/06/22 07:16:16.14 .net
#include <stdio.h>
void main(void)
{
unsigned buf[4];
_asm {
cld
mov esi, offset buf
mov eax, 22222
mov ecx, 4
rep stosd
};
for (int i=0; i<4; i++)
printf("%d\n", buf[i]);
}
このコードを実行すると意図した結果(buf[0]~buf[3]まで全部22222になる)にならずハングアップするのですが、
どうすればよろしいでしょうか?
410:デフォルトの名無しさん
13/06/22 08:30:41.12 .net
>mov esi, offset buf
これ
lea esi, buf
じゃないの?動かしてないけど
411:デフォルトの名無しさん
13/06/22 08:40:28.48 .net
動かしてみた
あと、esiじゃなくてediな
int main(void)
{
unsigned buf[4];
_asm {
cld
lea edi, buf
mov eax, 22222
mov ecx, 4
rep stosd
};
for (int i = 0; i < 4; i++)
printf("%d\n", buf[i]);
}
22222
22222
22222
22222
412:デフォルトの名無しさん
13/06/22 10:22:52.80 .net
eaxやecxをpushしなくていいの?
413:400
13/06/22 10:47:50.40 .net
>>402
ありがとうございます!
414:デフォルトの名無しさん
13/06/22 13:15:07.29 .net
>>403
環境依存だからなあ・・・気に掛かるならインラインアセンブラで使うレジスタは
全部退避すると安心かもね
でもpushすると例えば lea edi, buf は俺の所では lea edi, [esp] と展開されたので
狂ってくるような気もする
実際やってみないとどうなるか分からないけど
415:片山博文MZパンク ◆0lBZNi.Q7evd
13/08/05 NY:AN:NY.AN .net
今、逆アセンブラ作ってる。巨大なswitch構文ができた。これをデータ表現にしようと考えている。
やるならx86以外のCPUについても、CPUの違いを吸収して統合させたい。
各CPUのアーキテクチャの表現はどのようにすればいいか?
416:デフォルトの名無しさん
13/08/05 NY:AN:NY.AN .net
1ワードで複数の命令含むアーキテクチャなんかもフツーにあるし汎用的な表現なんて無理
417:デフォルトの名無しさん
13/08/05 NY:AN:NY.AN .net
1ビットを一文字とした構文解析と考えればいいのでは?
418:デフォルトの名無しさん
13/08/05 NY:AN:NY.AN .net
余計なことを考えるのはまともに使えるものを一本仕上げてからにしろ
419:デフォルトの名無しさん
13/08/05 NY:AN:NY.AN .net
ただちに影響はありません
420:デフォルトの名無しさん
13/08/21 NY:AN:NY.AN .net
【boot】nasm【loader】
スレリンク(tech板)
421:デフォルトの名無しさん
13/09/06 15:30:02.86 .net
HxD っていうHEXEDIT使ってるけど、WIN8に変えたら
エラー履くようになりました・・・
どうすればいい?
Cannot creat fil
422:e "C:¥Program Files¥HxD.ini".アクセスが拒否されました。
423:デフォルトの名無しさん
13/09/06 15:33:52.85 .net
> どうすればいい?
いまどき Program Files の下に ini ファイル作ってるソフトなんか捨てれ
424:デフォルトの名無しさん
13/09/06 16:31:02.81 .net
普通どこに作るんだよ?
425:デフォルトの名無しさん
13/09/06 17:06:30.70 .net
いまどきは
C:\Program Files (x86)\
426:デフォルトの名無しさん
13/09/06 17:20:48.51 .net
>>414
レジストリかね。
もしくはAppDataとか、マイドキュか。
ユーザーディレクトリの直下にドット付のフォルダを作ってそこに入れてるアプリもあるね。
Program Filesはunix系のOSで言ったら、/usr/bin とか/local/usr/binにあたるから
データを保存するのは、ちょっとないね。
427:デフォルトの名無しさん
13/09/06 17:21:55.13 .net
Program Dataだろ。
428:デフォルトの名無しさん
13/09/06 17:34:33.05 .net
ProgramDataは全ユーザー共通じゃん。
429:デフォルトの名無しさん
13/09/06 18:00:55.59 .net
URLリンク(chrome.blogspot.jp)
URLリンク(itpro.nikkeibp.co.jp)
URLリンク(news.mynavi.jp)
URLリンク(internet.watch.impress.co.jp)
430:デフォルトの名無しさん
13/09/06 18:06:17.02 .net
ていうか、exeファイルをProgramFiles直下に置いているような気がするのだが
431:デフォルトの名無しさん
13/09/06 22:28:35.95 .net
それ以外どこに置くんだ?
432:デフォルトの名無しさん
13/09/07 07:46:35.57 .net
Win8のセキュリティ設定を変えるだけだろ? それすらできないやつがアセンブラ? バイナリエディタ?
百年早えわ
433:デフォルトの名無しさん
13/09/07 08:50:06.65 .net
>>421
そんなところにexeなんて置いたことありませんが
434:デフォルトの名無しさん
13/09/07 10:30:32.07 .net
つ URLリンク(www.youtube.com)
435:デフォルトの名無しさん
13/09/10 02:28:35.44 .net
>>168
n % 10 が糞遅いだろ
これだから高級言語に被れたあほは
436:デフォルトの名無しさん
13/09/10 04:09:22.32 .net
>n % 10 が糞遅いだろ
適切にコード化されてるなら、前段の /10 で %10 も計算できてるな。まあ、そんなコンパイラ存在しないとは思うが。
437:デフォルトの名無しさん
13/09/10 04:18:51.19 .net
除算を使わない高速な方法を>>425さんが示してくれます
438:デフォルトの名無しさん
13/09/10 09:21:50.21 .net
>>168 が糞遅いことを1年以上も研究し続けた >>425 の努力に敬礼
439:デフォルトの名無しさん
13/09/10 10:06:55.78 .net
一度の計算で余りもレジスタに入るから、実質二度手間になるんだろ?
440:デフォルトの名無しさん
13/09/10 10:08:58.86 .net
>>425 は gcc -O3 -S とかやったことが一回もないドあほ。
実際にやってみろ。自分がどれだけドあほか、わかるから。
441:デフォルトの名無しさん
13/09/10 13:18:25.22 .net
gccが最も効率のいいコードを吐くとでも思ってるのかな? ドあほってレベルじゃないぞ
442:デフォルトの名無しさん
13/09/10 13:51:02.98 .net
煽りを入れるのは見比べてからでも遅くはないのでは?
443:デフォルトの名無しさん
13/09/10 14:06:41.23 .net
>gccが最も効率のいいコードを吐くとでも
早くも問題をすり替えて逃げ態勢に入りました
444:デフォルトの名無しさん
13/09/10 14:12:04.54 .net
cygwin 上の gcc で試した。gcc のバージョンは 4.7.3
_putN:
subl $28, %esp
movl %ebx, 16(%esp)
movl 32(%esp), %ebx
movl %esi, 20(%esp)
movl %edi, 24(%esp)
cmpl $9, %ebx
jg L7
L2:
movl %ebx, %eax
movl $1717986919, %edx
movl 20(%esp), %esi
imull %edx
movl %ebx, %eax
movl 24(%esp), %edi
sarl $31, %eax
sarl $2, %edx
subl %eax, %edx
leal (%edx,%edx,4), %eax
addl %eax, %eax
subl %eax, %ebx
addl $48, %ebx
movl %ebx, 32(%esp)
movl 16(%esp), %ebx
addl $28, %esp
jmp _putchar
445:434
13/09/10 14:12:54.83 .net
.p2align 4,,7
L7:
movl %ebx, %eax
movl $1717986919, %ecx
imull %ecx
movl %ebx, %eax
sarl $31, %eax
movl %edx, %esi
sarl $2, %esi
subl %eax, %esi
cmpl $9, %esi
jg L8
L3:
movl %esi, %eax
movl $1717986919, %edx
imull %edx
movl %esi, %eax
sarl $31, %eax
sarl $2, %edx
subl %eax, %edx
leal (%edx,%edx,4), %eax
addl %eax, %eax
subl %eax, %esi
addl $48, %esi
movl %esi, (%esp)
call _putchar
jmp L2
446:434
13/09/10 14:13:59.16 .net
.p2align 4,,7
L8:
movl %esi, %eax
imull %ecx
movl %esi, %eax
sarl $31, %eax
movl %edx, %edi
sarl $2, %edi
subl %eax, %edi
cmpl $9, %edi
jle L4
movl %edi, %eax
imull %ecx
movl %edi, %eax
sarl $31, %eax
sarl $2, %edx
subl %eax, %edx
movl %edx, (%esp)
call _putN
447:434
13/09/10 14:14:44.55 .net
L4:
movl %edi, %eax
movl $1717986919, %edx
imull %edx
movl %edi, %eax
sarl $31, %eax
sarl $2, %edx
subl %eax, %edx
leal (%edx,%edx,4), %eax
addl %eax, %eax
subl %eax, %edi
addl $48, %edi
movl %edi, (%esp)
call _putchar
jmp L3
448:デフォルトの名無しさん
13/09/10 14:45:39.42 .net
>>168 はこう↓書いた方がなんぼかマシ。
void putN(int n)
{
if (n >= 10) {
putN(n / 10);
n %= 10;
}
putchar('0' + n);
}
こう↓書いて gcc -O3 しても div() 呼び出してる部分が展開されなかったのは意外だった。
#include <stdlib.h>
void putN(int n)
{
if (n >= 10) {
div_t d = div(n, 10);
putN(d.quot);
n = d.rem;
}
putchar('0' + n);
}
449:デフォルトの名無しさん
13/09/10 15:33:12.83 .net
div_t とか使ってるの見たことない
誰も使わないから対応しないんじゃなかろうか
450:片山博文MZコスモ ◆T6xkBnTXz7B0
13/10/01 09:39:59.60 .net
OFっていつもゼロなの?
__asm__("movl $0xFFFFFFFF,%%eax\nadd $4,%%eax\nseto %0\n" :: "m"(b) : "%eax");
printf("%d\n", b); //0
451:デフォルトの名無しさん
13/10/01 10:30:38.61 .net
ヒント: 符号付き整数
452:デフォルトの名無しさん
13/10/01 11:15:46.41 .net
>>441 有り難う
453:片山博文MZコスモ ◆T6xkBnTXz7B0
13/10/14 14:01:30.87 .net
x86で
int a,b;
ADD a,b;
がオーバーフローする条件をC言語で表すとどうなりますか?
454:片山博文MZコスモ ◆T6xkBnTXz7B0
13/10/14 14:25:40.35 .net
自己解決しました。
(a<-b) != (a+b<0)
455:デフォルトの名無しさん
13/10/14 16:26:07.41 .net
a と b 共に 0x80000000(-2147483648) だとして、
(a<-b) != (a+b<0)
= (0x80000000<-0x80000000) != (0x80000000+0x80000000<0)
= (0x80000000<0x80000000) != (0<0)
= (0) != (0)
= 0
で全然オーバーフローの検出なんてできてないと思うんだが。
456:片山博文MZコスモ ◆T6xkBnTXz7B0
13/10/14 16:44:55.65 .net
>>445
見落としてました。
どうすればよいのでしょうか?
457:片山博文MZコスモ ◆T6xkBnTXz7B0
13/10/14 16:55:19.67 .net
むずかしいよぉ~
458:片山博文MZコスモ ◆T6xkBnTXz7B0
13/10/14 17:36:03.61 .net
(a>=0 && b>=0 && a+b<0) || (a<0 && b<0 && a+b>=0)
これより簡単にできないみたい。有り難う。
459:デフォルトの名無しさん
13/10/21 19:44:36.41 .net
URLリンク(pbs.twimg.com)
460:デフォルトの名無しさん
13/10/21 20:12:25.09 .net
画面に反して本体がmkIIじゃないのが残念
461:片山博文MZコスモ ◆T6xkBnTXz7B0
13/10/22 19:22:12.38 .net
(i) x64のprologで認められている命令とは何か?
(ii) x64のepilogで認められている命令とは何か?
462:デフォルトの名無しさん
13/11/10 15:31:19.25 .net
(i) スタックに積む命令とスタック領域を確保する命令
(ii) スタックから積み下ろす命令とスタックポインタを補正する命令
でいいんだっけ?
463:デフォルトの名無しさん
13/11/15 16:30:27.64 .net
初心者スレの割りにレベルが高くてこんなことを聞くのもためらわれまずが
64bitのCPUに32bitのOS入れて解析ってできますか?
CPUも32bitのほうがいろいろ捗りますかね
464:デフォルトの名無しさん
13/11/15 16:47:32.07 .net
分からない奴にOSの解析など不可能
465:デフォルトの名無しさん
13/11/15 21:49:14.28 .net
ねぇここって初心者の質問に答えるスレじゃないの?
あとOSの解析なんて言ってないんで^^;
偉そうにしてるとこ悪いけど日本語読んでね
466:デフォルトの名無しさん
13/11/15 21:53:29.21 .net
何を解析したいのかも書かない奴がなんでか偉そうだね
467:デフォルトの名無しさん
13/11/15 23:07:19.82 .net
川越で解析料理なるものを初めて頂く機会があったが、どうせ薄味でお上品な料理ばかりだろという先入観が打ち砕かれたよ
9000円分の満足感があったかと言われると、まあ貧乏人なので牛丼と比べてNoと言ってしまうのだけど
9000円分の仕事をきっちり味わえたな、という実感はありました
468:デフォルトの名無しさん
13/11/16 03:45:41.63 .net
誤表記詐欺ですねわかります
469:デフォルトの名無しさん
13/11/19 22:00:41.96 .net
○懐石料理
×解析料理
470:デフォルトの名無しさん
13/11/19 23:58:42.94 .net
そう言えばNHKで「会席料理」ってやってて、「あれ?懐石料理じゃないの?」と思ったら
読みは同じでも別の料理だった
チラ裏
471:デフォルトの名無しさん
13/11/20 00:09:28.37 .net
ふうむパーティーフードの訳かしらと英辞郎引いたら、a kaiseki mealだと…
472:デフォルトの名無しさん
13/11/20 17:38:55.81 .net
このスレにふさわしい話題なので
URLリンク(www.amazon.co.jp)
中古(これはひどい)
原価の9割の価格付けて
2013年9月発売の本なのに「経年劣化」とか
「多少のキズ」とか()
URLリンク(www.amazon.co.jp)
裁断済の書籍になります。書籍本体の表紙・背表紙・本の背中が裁断されています
(書籍本体の表紙・背表紙・本の背中はありません)。
その他、カバー・帯を裁断している場合があります。
ページ抜けはチェックした限りではありませんが、見落としがある可能性があります。
経年劣化により多少のキズ・ヨゴレ・ヤブレがあります。
ご了承の上、お買い求め下さい。発送は防水包装の上、メール便またはゆうメールを使用する予定です。
473:デフォルトの名無しさん
13/11/20 17:41:14.68 .net
NHKは勝手に造語造るの好き
474:デフォルトの名無しさん
13/11/20 18:06:14.99 .net
>>462
本屋で見かけたけどどうでもいい内容の本だったわ
475:デフォルトの名無しさん
13/11/20 18:46:31.55 .net
ようやるわと思ったら中国人ぽい名前が並んでるな
いいのかインプレス
476:デフォルトの名無しさん
13/11/20 20:26:04.41 .net
中国人だからどうだというんだ。
だったら差別したいの?
477:デフォルトの名無しさん
13/11/20 20:39:39.28 .net
わろた
詳しい出品者情報
正式名称: パウロ屋
ストア代表者名:
電話番号: 080
住所: 世田谷区野毛
その他・備考: Amazonマーケットプレイスにおける商品の返品と返金条件に準拠します
最近の評価:
1(5が最高):「到着予定を過ぎても何日待っても商品の届く気配すらありません。
キャンセルした所応じてくれましたがクレカ払いにした為返金も遅れるし返金確認するまで不安で仕方ありません。
最低な出品者です。」minos..., 2013年11月11日
1(5が最高):「本じゃ有りません。紙束です。こんなものを本屋のサイトで「中古品・可」で出品していました。
トランプみたいに1枚1枚手にとってよむのですか。解体したゴミを売りつける悪質業者です。金返せ。」
スタティック初老人, 2013年11月10日
1(5が最高):「10日以上たっても商品が届かず,連絡しても返答さえありません。正直詐欺かと疑っています。」
かむい, 2013年11月7日
478:デフォルトの名無しさん
13/12/15 01:33:08.29 .net
マイクロソフトのml.exe(VS2010付属)なのですが、
invokeなどがどんなコードを生成してるのか調べる方法はありますか?
リストに出そうとしているのですが、.XALLなどでも表示されません。
479:デフォルトの名無しさん
13/12/16 08:37:41.69 .net
>>468
デバッガで実行して逆アセンブル表示見れば?
480:デフォルトの名無しさん
13/12/31 19:12:15.66 .net
アセンブラの解説サイトを読んでるんですけどレジスタの説明がいろいろ変わって混乱しています
たとえばAXレジスタっていってるところもあればEAXレジスタっていってるところもああります。同じものと考えていいんでしょうか?
481:デフォルトの名無しさん
13/12/31 19:17:09.98 .net
>>470
AXとEAXとALとAHとRAXの違いなんてぐぐればすぐわかるだろ
482:デフォルトの名無しさん
13/12/31 20:57:53.32 .net
AXもEAXもレジスタというよりアキュムレータな
483:デフォルトの名無しさん
13/12/31 21:02:34.09 .net
AXもEAXもレジスタ
484:デフォルトの名無しさん
13/12/31 23:10:57.04 .net
AXだけが特別扱いになってるのは8086の名残りだけだから、
今となってはわざわざ特別扱いしてアキュームレータとか言う理由はないな。
485:デフォルトの名無しさん
14/01/01 02:11:33.12 .net
bxもベースレジスタって名前なかったっけ
んでcxがカウンタでdxがデータだっけ?
axが特別っつーか、全部に役割持たせてたんだと思う、当初は
486:デフォルトの名無しさん
14/01/02 00:24:45.35 .net
>>474
昔(Z80とか8086)はA系レジスタ向けの演算命令が他のB~系レジスタよりも
多くてA系はアキュムレータだと説得力があった記憶があるけど、
今はどのレジスタも演算命令数は同じというか、差別されていないの?
487:デフォルトの名無しさん
14/01/02 00:31:24.41 .net
IA-32やX64でも差別されてるよ
488:デフォルトの名無しさん
14/01/02 02:54:44.28 .net
Cの関数の戻り値はEAX(キリっ
489:デフォルトの名無しさん
14/01/02 03:02:14.43 .net
ABIに拠るし構造体をEAXで返すことはないと思う
490:デフォルトの名無しさん
14/01/02 09:59:16.22 .net
アキュムレーターは索引レジスタに使えないというイメージがあったが、
32bitアドレッシングからは[eax+ecx+12]とか使えるしなぁ
491:デフォルトの名無しさん
14/01/03 00:00:03.75 .net
建て増し構造というか奇形というかスッキリしなさがx86系の嫌いなとこだなあ。
MC68000なんか今触っても整然としてて美しいし。
x64で大幅に改善されたというか、やっと68000に追いつけたんだなぁ。
492:デフォルトの名無しさん
14/01/03 00:35:29.00 .net
アドレスレジスタとデータレジスタが別なアーキテクチャは最初から糞
493:デフォルトの名無しさん
14/01/03 01:06:13.22 .net
オフセットや相対ジャンプに16ビットの制限のある68000は糞
494:デフォルトの名無しさん
14/01/03 02:09:13.49 .net
>>482
アキュームレータとベースレジスタが各一つしかないとか、個数の制限があればそうだね。
でも、十分な数が用意されてるから、実際には困るケースなんて皆無なんだ。
C言語との組み合わせを考えたら、データとアドレスがハードウェアレベルで区別されてるのは好ましいことだしね。
>>483
デコボコしたメモリモデルなんてものがあって8bit時代を引きずり続けたx86にはとてもかなわないよ。
495:デフォルトの名無しさん
14/01/03 02:11:58.78 .net
>>484
データレジスタは8つでは足りないしアドレスレジスタは8つ(7つ)も要らん。要はバランスが悪い。
496:デフォルトの名無しさん
14/01/03 02:15:29.84 .net
>>484
>C言語との組み合わせを考えたら、データとアドレスがハードウェアレベルで区別されてるのは好ましいことだしね。
具体的にメリットをご説明下さい。
497:デフォルトの名無しさん
14/01/03 02:18:20.25 .net
>>484
>デコボコしたメモリモデルなんてものがあって8bit時代を引きずり続けたx86にはとてもかなわないよ。
8bit時代からのしがらみなんてなかった筈なのにセグメントでメモリ管理してた68kMacもそう変わらんよ。
498:デフォルトの名無しさん
14/01/03 02:19:39.55 .net
>>484
>アキュームレータとベースレジスタが各一つしかないとか、個数の制限があればそうだね。
6800乙w
499:デフォルトの名無しさん
14/01/03 02:24:52.53 .net
>MC68000なんか今触っても整然としてて美しいし。
当時としてはマシな部類だったが、今こんなこと言ってる奴はアフォ
500:デフォルトの名無しさん
14/01/03 09:05:56.66 .net
RISC原理主義者がきた~w
501:デフォルトの名無しさん
14/01/03 10:37:25.99 .net
データ=アドレスのレジスタ1個でも気合でどうにかなるだろ
502:デフォルトの名無しさん
14/01/03 11:18:59.86 .net
68000を否定するとRISC原理主義者って意味分からん。
503:デフォルトの名無しさん
14/01/03 15:15:03.31 .net
どんなにアーキテクチャが優れていてもソフト資産がなければ糞
すぐ消える
504:デフォルトの名無しさん
14/01/03 15:54:06.91 .net
組み込みならソフト資産なんて関係無いだろう
505:デフォルトの名無しさん
14/01/03 15:54:47.93 .net
パソコン用なんかではその通りだが、特定用途向けとかなら事情が違う >ソフト資産がなければ糞
506:デフォルトの名無しさん
14/01/03 15:57:57.54 .net
>>494
メーカー提供や他社製品のサンプルプログラムやライブラリ、RTOSとか、組み込み用途でも
あれば便利なソフト資産と呼べるものは存在するよ。
507:デフォルトの名無しさん
14/01/03 18:15:52.10 .net
本来表に公開することのないような出来上がったソフトのことじゃなくて
開発するためのソフトの話か?
そりゃある方が良いのは当たり前なことだが、そんなのわざわざ書くことじゃないだろ。
508:デフォルトの名無しさん
14/01/03 18:26:49.96 .net
>そんなのわざわざ書くことじゃないだろ。
なぜ??
509:デフォルトの名無しさん
14/01/03 18:58:28.29 .net
86系と68系の話の流れの>>493に対してだから、
ここでいうソフト資産とは、そのアーキテクチャ向けに
作られたソフトのことだろ。
開発のためのソフトじゃなく。
510:デフォルトの名無しさん
14/01/03 19:06:21.98 .net
>>499
>ここでいうソフト資産とは、そのアーキテクチャ向けに
>作られたソフトのことだろ。
「メーカー提供や他社製品のサンプルプログラムやライブラリ、RTOSとか」ってのは
それから外れてないだろ。
511:デフォルトの名無しさん
14/01/03 19:11:12.14 .net
>>497
> 開発するためのソフトの話か?
良く分かってないみたいだけどツールかなんかと勘違いしてね?
512:デフォルトの名無しさん
14/01/03 20:19:58.67 .net
>>485
8個で足りないんだ?x86(IA-32)だと汎用レジスタは何個だったかな?
こたえ:0個
アキュームレータ、ベース、カウンタ、データ、スタックポインタ、スタックベース、ソースインデックス、デスティネーションインデックス、
8つの各用途に分かれていて「汎用」レジスタは存在しない。(命令によって割り当てられないレジスタが多く存在する)
x64は便利になったね。AMDはえらい。Intelは救いようのないアホ。
>>486
ポインタの理解が捗る。あれはアドレスレジスタそのものなんだ、ってね。
>>487
Macはクソそのものだよ。68000の特性を理解してないシステム構成だかんね。
>>488
8bit CPUと比較しなけりゃならないx86が恥ずかしいって、わかんないのかな。
513:デフォルトの名無しさん
14/01/03 21:12:09.54 .net
>>502
> 8個で足りないんだ?x86(IA-32)だと汎用レジスタは何個だったかな?
URLリンク(www.intel.com)
> 3.4.1 General-Purpose Registers
> The 32-bit general-purpose registers EAX, EBX, ECX, EDX, ESI, EDI, EBP, and ESP are provided for holding the
> following items:
> • Operands for logical and arithmetic operations
> • Operands for address calculations
> • Memory pointers
MC68000に、論理/算術演算、アドレス計算、メモリポインタとして使える汎用レジスタはいくつあるの?
こたえ:0個
データレジスタとアドレスレジスタの区別のあるMC68000に汎用レジスタはありませんw
514:デフォルトの名無しさん
14/01/03 21:21:49.84 .net
>>502
>8bit CPUと比較しなけりゃならないx86が恥ずかしいって、わかんないのかな。
汎用レジスタがないのはMC68000もMC6800も同じじゃないの? x86? 汎用レジスタあるけど?
515:デフォルトの名無しさん
14/01/03 22:34:07.51 .net
制限だらけのx86が恥ずかしげもなく汎用レジスタを名乗り(実際は命令によって割り当てられないor割り当てることを強要される事が多々ある)
制限がなく数も十分ありデータとアドレスの区別をしてなお整然とした68000のデータレジスタのありかたを罵倒する
516: 滑稽だねえ おたくら今からAMDがもたらしてくれた汎用レジスタたっぷりなx86からIntelがいつまでも放置して汚らしかったx86に戻れんの?
517:デフォルトの名無しさん
14/01/03 22:39:20.79 .net
>>504
MC6800は8bit CPUだから別にいいの。8bit CPUは可能な限りシンプルであるべきだから。
x86が汚らしいのは32bitアーキテクチャに不合理なもんを持込みすぎてるからであって
あれが8bitないしその建てましの16bitから出てこないのであれば全然なんも問題ないの
518:デフォルトの名無しさん
14/01/03 22:39:56.02 .net
(なんか語り始めた・・・)
519:デフォルトの名無しさん
14/01/03 23:06:26.22 .net
プログラマとしてはデータ/アドレスどちらでも使える汎用レジスタは嬉しいけど、
アドレス線に専念出来るアドレスレジスタとデータ(計算)に専念出来る
データレジスタを分けるのは回路設計的には理にかなっているんじゃないの?
520:デフォルトの名無しさん
14/01/03 23:43:37.21 .net
>>505
>AMDがもたらしてくれた汎用レジスタたっぷりなx86
AMD64でR8-R15使うときの命令コードってどんなんか知ってる?
521:デフォルトの名無しさん
14/01/04 01:32:44.12 .net
48/ 33 C0 xor rax, rax
48/ 33 D2 xor rdx, rdx
4D/ 33 C0 xor r8, r8
4D/ 33 FF xor r15, r15
33 C0 xor eax, eax
33 D2 xor edx, edx
45/ 33 C0 xor r8d, r8d
45/ 33 FF xor r15d, r15d
66| 33 C0 xor ax, ax
66| 33 D2 xor dx, dx
66| 45/ 33 C0 xor r8w, r8w
66| 45/ 33 FF xor r15w, r15w
32 C0 xor al, al
32 D2 xor dl, dl
45/ 32 C0 xor r8b, r8b
45/ 32 FF xor r15b, r15b
522:デフォルトの名無しさん
14/01/04 03:02:46.89 .net
はい、分かってないこと確定ですw
523:デフォルトの名無しさん
14/01/04 03:27:26.48 .net
これは
524:デフォルトの名無しさん
14/01/04 03:29:29.10 .net
>あれが8bitないしその建てましの16bitから出てこないのであれば全然なんも問題ないの
ふむふむ
525:デフォルトの名無しさん
14/01/07 11:16:45.98 .net
x64でVCではインラインアセンブラが廃止されたからまたこのスレ流行るかと思ったらそうでもないのな
compiler intrinsicsがあるからデバドラでも作らない限りあまり用途はないのか?
526:デフォルトの名無しさん
14/01/07 14:47:47.76 .net
SSE2のMOVSDとAVXのVMOVSDはニモニック以外なんか違いあるの?
527:デフォルトの名無しさん
14/01/08 16:05:02.11 .net
AMDがx64作れるようになったのは文句言って来そうな
MotorolaをIntelが潰してくれたからだろ
528:デフォルトの名無しさん
14/01/09 11:49:16.95 .net
それもあるし、IA-64の失敗で迷走してた事もあるんじゃね
実際鯖はXeonで十分だしソフト資産も多いもんなあ
529:デフォルトの名無しさん
14/01/09 17:57:38.76 .net
>>515
prefixがVEXになっただけで動作は一緒、YMM系の命令体系に合わせた。
F2/ 0F 10 05 00000020 R movsd xmm0, data_1
C5 FB 10 05 00000020 R vmovsd xmm0, data_1
530:デフォルトの名無しさん
14/01/11 09:25:44.97 .net
SSEスレは敷居が高いんでこっちでいいかな
ANDPSやORPSというのは何のためにあるのでしょう?
整数用のPANDやPORはわかるのですが
浮動小数点の論理演算というのがピンとこない
531:デフォルトの名無しさん
14/01/11 09:33:07.89 .net
わからんけど論理回路組んでいったらそういう操作が余ったので命令にしたんじゃないの?
それかfrexp()とかldexp()みたいな関数を作るためとか
532:デフォルトの名無しさん
14/01/11 15:52:02.89 .net
SSE命令がが整数演算に対応したのはSSE2からだよ
そのせいじゃないの?
533:デフォルトの名無しさん
14/01/12 19:53:20.99 .net
比較命令とかでマスク作って2つのレジスタの任意要素を合成とか
符号ビットいじって絶対値や符号反転とか
整数、少数命令の混在はペナルティが入るから、頻度は少なくても無いと困る
534:デフォルトの名無しさん
14/01/13 10:05:08.34 .net
なるほど、ありがとうございます。
確かに符号や比較命令のマスクに使えますね。
整数、浮動小数点の混在にペナルティが入るのは知りませんでした。
535:デフォルトの名無しさん
14/01/14 03:58:16.98 .net
Core i (Nehalem) 以降のIntel CPUにある制約ね >ペナルティ
昔は命令長節約のために整数用にもandpsとかを使うなんてのも往々にして行われていたけれど
今のIntel CPUでは逆に遅くなるという寸法
536:デフォルトの名無しさん
14/01/28 14:52:09.84 .net
VS2010のでコンパイルしてます。
セグメントレジスターを使うとINVOKEが変なコードをはくのですが仕様ですか?
; ml /c xxx.asm
; dumpbin /disasm xxx.obj
.686
.model flat, stdcall
foo proto x:word, y:dword, z:byte
.code
foo proc uses ebx esi edi, x:word, y:dword, z:byte
ret
foo endp
start: invoke foo, fs, gs, al
ret
end
537:デフォルトの名無しさん
14/02/05 02:45:14.99 .net
>>525
おまえ大丈夫か?w
538:デフォルトの名無しさん
14/02/05 13:35:13.40 .net
こりゃひどいな、バグかな
0000000D: 50 push eax
0000000E: 66 6A 00 push 0
00000011: 0F A8 push gs
00000013: 83 EC 02 sub esp,2
00000016: 0F A0 push fs
00000018: E8 E3 FF FF FF call _foo@12
539:デフォルトの名無しさん
14/02/09 20:32:36.55 .net
はじめて読む486を買ってきたけど、
テストプログラムの環境ってWin3.1を想定してるのか?
それともDOS?
実行環境が作れない時点で挫折しそう。。。
540:デフォルトの名無しさん
14/02/09 21:22:13.69 .net
DOS
VMware か何かを使って、FreeDOS が動く....かなぁ。
541:デフォルトの名無しさん
14/02/09 21:22:19.62 .net
DOS
542:デフォルトの名無しさん
14/02/09 21:28:01.20 .net
>>529
>>530
情報ありがとう。
DOSはVMWareでなんとかなりそうだけど、
appendixを読むと
borland c++3.1 & turbo assembler 3.2 か
vc++1.0 & masm6.0
で動作するみたいだけど、そんなの手にはいらんぞ。。。
543:デフォルトの名無しさん
14/02/09 22:00:38.07 .net
タダで配ってる Visual C++ Express版に ml.exe 入ってるしなんとかなるべ
544:デフォルトの名無しさん
14/02/09 22:17:26.76 .net
ならねーよ
545:デフォルトの名無しさん
14/02/09 22:26:41.38 .net
アセンブラはLinkさえ手に入れば最近のml.exeでもいけるよ~
DOS用にアセンブルする場合は ml /omf を忘れずに
CはOpenWatcomで間に合うな
546:デフォルトの名無しさん
14/02/09 22:32:20.56 .net
>>534
ありがとう。
火曜に試してみるよ
547:デフォルトの名無しさん
14/02/09 22:37:02.43 .net
16bitのコンパイラならTurbo CやLSIC86試食版があるな。
LSIC86試食版はMASMとは書式が違うがアセンブラも入ってるし使い方次第では便利に使えるだろう。
548:デフォルトの名無しさん
14/02/09 23:33:16.06 .net
A86だったかR86ね。
あれは、たとえばORG擬似命令が無くて、RS擬似命令で、(目的アドレス - 現在アドレス) の
サイズのメモリを確保してやることでアドレスを調整するとか、あれこれ、知ってる人に
聞かないとわかんないテクが要るのが大変。
ValLinkとArrowAsmってのが2000年頃の定番だったが、今どうなってることやら。
NASMもNASMでMASMと違うからねぇ。
549:デフォルトの名無しさん
14/02/10 04:57:21.71 .net
URLリンク(www.agner.org)
550:デフォルトの名無しさん
14/02/24 19:05:52.56 .net
おすすめ書籍とかサイトなど御座いますか?
551:デフォルトの名無しさん
14/02/24 19:07:46.95 .net
ないですね。
552:,,・´∀`・,,)っ-○○○
14/02/26 00:38:53.88 .net
先にCOMET-II/CASL-IIを勉強したらいいんじゃない?
これは情報処理技術者のテキスト読んでるだけでたいていクリアできる
資格もとれて一石二鳥。
x86ならこれ1冊で。あとは個々の命令の仕様はIntelのサイトからPDF落とす。
・はじめて読むPentium マシン語入門編
553:デフォルトの名無しさん
14/02/26 00:46:38.24 .net
PCを機械語で使うのが目的なのか、他の何か特定のデバイスなのか、
対象はなんでもいいのか、で答えが違うな。
554:デフォルトの名無しさん
14/02/27 02:16:08.54 .net
>>539
聖書がおすすめ
555:デフォルトの名無しさん
14/02/27 06:04:53.44 .net
新約旧約どっちがいい?
556:デフォルトの名無しさん
14/02/27 06:10:52.32 .net
コーランが良いアルニダ
557:デフォルトの名無しさん
14/03/12 04:04:41.92 4B5tOSzi.net
NXビットとかってアセンブラでいじれるの?
558:デフォルトの名無しさん
14/03/12 04:57:51.84 /EKU/g4K.net
アセンブラでいじれなきゃ他の言語でも無理ダナ
559:デフォルトの名無しさん
14/03/12 17:09:14.41 Rs2gHvws.net
wrmsrで変更できるね
リング0の特権命令だけど
560:デフォルトの名無しさん
14/05/16 01:36:30.34 750USUyV.net
同値xorがゼロクリアになるのはテクではなくブール演算の初歩知識ではなかろうか
煽りでなく、むしろその手の基礎から始めてググり続けると良いのでは
561:デフォルトの名無しさん
14/05/16 02:06:29.00 6rXJBimE.net
初心者に問題。
AL に入っている数値を [DI] に16進数2ケタで出力せよ。
※ [DI+00] に上位桁、[DI+01] に下位桁
562:デフォルトの名無しさん
14/05/16 03:00:26.63 ZWSdCtrz.net
学校の宿題他人に訊くなよ…。
563:デフォルトの名無しさん
14/05/16 08:30:06.10 hJC//Tt9.net
>>549
まるち
564:デフォルトの名無しさん
14/05/16 08:33:06.36 hJC//Tt9.net
>>550
mov [DI], al
and [DI], 0x0F
shr al, 4
and al, 0x0F
mov [DI+01], al
565:デフォルトの名無しさん
14/05/16 10:03:09.08 PLhTA3a9.net
>>550
久しぶりに触ったけど debug.exe って 64bit Windows だと用意されてないんだな
-a 0100
mov ax, cs
mov es, ax
mov di, 0080
mov al, 5a
inc di
mov [di], al
mov cl, 4
shr al, cl
dec di
mov [di], al
mov al, 0f
and [di], al
inc di
and [di], al
566:デフォルトの名無しさん
14/05/20 19:52:17.51 EAxy/lYF.net
そこで Virtual PC ですよ。
567:デフォルトの名無しさん
14/05/25 20:19:23.16 t1V1lNcr.net
アセンブラの学習するのにおすすめの参考書あります?
cがちょっとできるレベルなんだけど
568:デフォルトの名無しさん
14/05/25 22:19:07.25 z/SkfJN9.net
基本情報のアセンブラの対策本でも読めばいいんじゃね
569:デフォルトの名無しさん
14/05/26 08:56:21.98 lvFZnHPn.net
CASL付きポケコンの説明書とかw
ただポケコンがオワコンを通り越して生産終了w
570:デフォルトの名無しさん
14/05/26 12:04:51.49 ptXAqcmg.net
「漢字コード」さんはポケコンの時代で時間が止まってる上にそういう自覚がない人でしょ。
だから話が通じない上に一人で逆上してる。
だから放置されてるのに...
571:デフォルトの名無しさん
14/05/26 14:27:02.60 y9c5KjIu.net
デムパさん?
572:デフォルトの名無しさん
14/05/28 10:59:15.94 4srfku2X.net
>>550
ビッグエンディアンは好かん。
573:デフォルトの名無しさん
14/06/03 17:53:17.36 xWuYqldz.net
URLリンク(www5c.biglobe.ne.jp)
このページを見ながら分岐命令を勉強しているんですがJL・JLE・JNG・JNGE命令などにあるフラグで
SF<>OFなどの<>は何を意味するんですか?
574:デフォルトの名無しさん
14/06/03 18:08:44.18 pVBw+Lsj.net
>>562
not equal
575:デフォルトの名無しさん
14/06/03 22:44:28.88 xWuYqldz.net
>>563
返答ありがとうごじます。危うく詰みそうになりました
576:デフォルトの名無しさん
14/06/05 17:54:50.58 /tv+CkMy.net
データ転送命令なのですが
MOV AL,BYTE PTR DS:[ECX+EDI]
この意味がよくわかりません
BYTE PTRがバイト宣言?なのはわかりますが、後ろ側のDS:[ECX+EDI]ってのがいまいちぱっとわかりません
577:デフォルトの名無しさん
14/06/05 18:57:10.25 M285qaIr.net
この状況でds修飾は不要 。c言語風に書くとこんな感じ
al = *(byte *)(ecx+edi);
578:デフォルトの名無しさん
14/06/05 20:58:42.27 55VBH6H6.net
DSは必要
579:デフォルトの名無しさん
14/06/05 21:37:09.24 o52VmkJp.net
ストリングス転送命令ではなさそうだけど?
580:566
14/06/05 22:18:58.64 /tv+CkMy.net
ECXにEDIを足したものをALにコピーって意味でいいんでしょうか?
後ろのDS:[]ってどういう意味があるんでしょうか?
581:デフォルトの名無しさん
14/06/05 22:43:49.27 bOGqmnDA.net
機械語として見るとセグメントオーバーライドプレフィックスが付いている(ように見える)、
ということだろうけど、普通のメモリアクセスのセグメントはDSなので冗長(必要ない)。
ECX+EDI の結果をアドレスとして、そのアドレスに(バイト単位で)メモリアクセスしてALに
コピー、という意味だけど、そもそも正しい場所を解析しようとしているのか怪しいな。
582:デフォルトの名無しさん
14/06/05 22:49:00.65 dSg5bErh.net
x64のRIP相対アドレッシングの場合はどうなんのかな
583:デフォルトの名無しさん
14/06/06 06:48:37.37 NiHdmLTJ.net
mov ax,[rip+4]
初心者の範疇ではないな
584:デフォルトの名無しさん
14/06/07 00:39:40.37 42HLXVNl.net
>>544
Windows的にはNTからだろ?
585:デフォルトの名無しさん
14/06/07 04:28:15.67 HlN+9CGy.net
オペランドを1つしか取らないアセンブリってどの種類に分けられる?
初歩的かもしれないけどぐぐるときに困ってるから教えてほしい。
586:デフォルトの名無しさん
14/06/07 04:58:06.00 ftf2LwSc.net
>>574
>オペランドを1つしか取らないアセンブリってどの種類に分けられる?
プロセッサに拠る
587:デフォルトの名無しさん
14/06/07 04:59:38.74 HlN+9CGy.net
16ビットマイクロプロセッサです
588:デフォルトの名無しさん
14/06/07 05:08:45.69 ftf2LwSc.net
そんなのいくらもあるよ
URLリンク(bitsavers.informatik.uni-stuttgart.de)
URLリンク(datasheets.chipdb.org)
URLリンク(www.freescale.com)
URLリンク(documentation.renesas.com)
589:デフォルトの名無しさん
14/06/07 11:26:24.62 u3dUy4Sv.net
1アドレス方式とか1オペランド方式、という分類はあるけど、それのこと?
590:デフォルトの名無しさん
14/06/07 15:04:36.72 bare2SL/.net
>アセンブリ
という用語をどういう意味で使ってるかによるかな。
個々のアセンブリ命令自体には特に分類はない。
そういう命令を主に使うCPUのアーキテクチャといえば、
1オペランド方式とかアキュムレータマシンとかそんな感じか?
591:デフォルトの名無しさん
14/06/07 17:07:24.15 uqMqHKO4.net
PLCも仲間入り?
592:デフォルトの名無しさん
14/06/07 21:17:21.71 VEYGFS+g.net
>>571
MASM64はラベルとかはrip相対になってるな
NASMはDEFAULT REL使ってる
593:デフォルトの名無しさん
14/06/08 11:30:26.96 U9hBzx6T.net
Windowsの64bit EXEに再配置の仕組みは残ってるの?
rip相対と混在できるかってことだけど
594:デフォルトの名無しさん
14/06/08 12:15:57.26 0lLCwyof.net
>>582
自分はrip相対のモードでしか使ったことないけど、使い
595:勝手は32bitと変わらないよ そもそもx64はオフセットが32bitに制限されてるから、NASMがrip相対を デフォルトにしてない理由がよく分からん NASMはabsとかrelを使えば混在できるみたいだね ttps://www.tortall.net/projects/yasm/manual/html/nasm-effaddr.html
596:,,・´∀`・,,)っ-○○○
14/06/08 12:25:05.93 qgapksJl.net
mov命令だけだったっけ?disp64使えたのって
SIBなしのdisp32が相対、SIBありが絶対
597:デフォルトの名無しさん
14/06/08 13:03:19.30 0lLCwyof.net
>>584
64bitのメモリオフセットはmovでもraxだけだね(0xA1, 0xA3)
即値なら他のレジスタも使えるけど
598:デフォルトの名無しさん
14/06/08 15:18:04.41 gOfGwFVR.net
いまML64で遊んでるけど、混在できてるかんじですね。
LEA RAX, LABELxx
MOV RAX, OFFSET LABELxx
LEA使うとrup相対で下だと絶対になってるような。
64bitだとLEA使ったほうが良いの?
599:,,・´∀`・,,)っ-○○○
14/06/08 17:38:33.43 qgapksJl.net
別にRIP相対アドレスなら速くて絶対アドレスは遅いなんてことはない。
Haswellではmovは1サイクルあたり2命令のスループット。
leaは1命令。
Atomとかがターゲットなら割と命令長は気にしたほうがいいけど
(命令フェッチが8byte/clkしかないから)
600:デフォルトの名無しさん
14/06/09 01:56:46.89 r1q53MGM.net
リロケーションのコストを気にしなきゃいかんのは
よほどでかいDLLを2つ以上作るときくらい
601:デフォルトの名無しさん
14/07/20 04:01:19.48 jA7npZ7N.net
英文字を入力して大文字なとき小文字に変換するアセンブラコードを教えて下さいm(_ _)m
602:デフォルトの名無しさん
14/07/20 04:59:50.88 glgeKy6r.net
なんでこのスレはAssembly言語をAssemblerって言うの?
603:デフォルトの名無しさん
14/07/20 05:05:02.94 RQRWxhz5.net
URLリンク(ja.wikipedia.org)
> アセンブリ言語で書かれたプログラムを機械語プログラムに変換する事をアセンブル (assemble) すると言い、
> それを行うプログラムの事をアセンブラ (assembler) と言う。なお、アセンブリ言語の意味で「アセンブラ」
> または「アセンブラ言語」(Assembler Language)と呼ぶ場合も多い[注 1]。
> 脚注
> 1. IBMはSystem/360から2011年現在まで一貫してアセンブラ言語(Assembler Language)と呼んでいる。
> 例:IBM High Level Assembler
604:デフォルトの名無しさん
14/07/20 05:24:42.88 W4duPEEG.net
>>589
C言語で
char c = 'H';
if ('A' <= c) {
if (c <= 'Z') {
c += ('a' - 'A');
}
}
をコンパイルして出てくるアセンブリコードを参考にしてみるとか
605:デフォルトの名無しさん
14/07/20 05:48:11.47 RnwVM2ZH.net
>>591
Assembler languageでググるとAssembly languageが大量に出てくるけど、
このスレはIBMかぶれなの?
てか組立言語(Assembly lavigne)を
組立機(Assembler)って言うの気持ち悪くね。
606:デフォルトの名無しさん
14/07/20 08:34:23.52 1VhfX4Ek.net
IPAとかもアセンブラ言語って呼んでた気がするからもう気にしないことにしてる
607:デフォルトの名無しさん
14/07/20 09:11:23.94 Hpo7L/hK.net
>>593
単にアセンブラって言うことはよくある。「アセンブラで書く」とか
コンテキストで、プログラムのアセンブラとは区別が付く
用語のバラバラ感は、英語でも同様みたいだね
URLリンク(en.wikipedia.org)
608:デフォルトの名無しさん
14/07/22 13:16:19.12 P1jRYX3s.net
>>589 ; AL <-- 文字コード
(1) 大文字→小文字 、他の文字�
609:ヘそのまま。 cmp al,'A' jb @f cmp al,'Z' ja @f or al,('A' xor 'a') ; 他の文字が不定でいいならこの行だけでOK。 @@: (2) 小文字→大文字 、他の文字はそのまま。 cmp al,'a' jb @f cmp al,'z' ja @f and al,not('A' xor 'a') ; 他の文字が不定でいいならこの行だけでOK。 @@:
610:590
14/07/24 01:43:01.19 hv8nubjy.net
>>596
ありがとうございます
それは、CASLⅡの文法ですか?CASLⅡの文法でお願いしますm(_ _)m
URLリンク(detail.chiebukuro.yahoo.co.jp)
上に2つの問題があるので、日が出る前に誰が教えて下さい・・・
ウェブマネーでもアップルカードでも現金でもどんな形でも1000円分あげます
先着でお願いします。その際にメアド明記を必ずお願いします。
大学の単位掛かってるのでお願いします・・
611:デフォルトの名無しさん
14/07/24 02:40:58.69 weGa5ogB.net
宿題は自分でやろう
# つか、大学でCASLII? 底辺だな…。
612:デフォルトの名無しさん
14/07/24 02:48:29.48 MYJWPOnC.net
>>598
いやCASLを題材としてCPUの内部までやるところもあるよ、教科書もあったけれどもどっかにいってしまった‥もう一度手元に呼び戻したいものだ
613:デフォルトの名無しさん
14/07/24 02:57:56.22 weGa5ogB.net
> いやCASLを題材としてCPUの内部までやるところもあるよ、
CASL題材に内部までやったところで底辺には変わらん
せめてOS動く程度のアーキテクチャでFPGAで実装くらいやってのもんだろw
614:デフォルトの名無しさん
14/07/24 06:16:57.15 MYJWPOnC.net
そうか、最近なら FPGA っていうのはありだね
615:デフォルトの名無しさん
14/07/24 14:20:58.97 2qFeAMu1.net
>大学の単位掛かってる
赤点取った後の、お情け課題提出に見える。
616:デフォルトの名無しさん
14/07/25 03:38:44.05 5HeCUYeT.net
どちらにしても、石もアセンブラも後出しってのはなぁ…
CASLなら初めからCASLと書いて欲しいかな
617:,,・´∀`・,,)っ-○○○
14/07/25 08:54:19.70 8TTeu6gK.net
入力するのがアルファベットって決まってるなら
c |= 0x20;
だけでいいけどな
618:デフォルトの名無しさん
14/07/25 09:39:55.89 cQJQccdW.net
丁度良い練習問題は Base64
619:デフォルトの名無しさん
14/07/28 18:45:13.44 klE3KiB9.net
下のプログラムをvs2013でリリースビルドした結果なんですが、剰余算の式の過程が訳分からないです
リバーシングに興味あってアセンブラいじりだしたんですがわかる人いますか?
; 6 : (i % 3 == 0) ? ((i % 5 == 0) ? printf("%3d hoge\n",i) : printf("%3d hige\n",i)) : printf("%3d hoge\n",i);
mov eax, -1431655765 ; aaaaaaabH
mov ecx, esi
mul esi
push esi
shr edx, 1
lea eax, DWORD PTR [edx+edx*2]
sub ecx, eax
jne SHORT $LN8@main
mov eax, -858993459 ; cccccccdH
mov ecx, esi
mul esi
shr edx, 2
lea eax, DWORD PTR [edx+edx*4]
sub ecx, eax
je SHORT $LN8@main
push OFFSET ??_C@_09FLCGICCH@?$CF3d?5hige?6?$AA@
jmp SHORT $LN14@main
620:デフォルトの名無しさん
14/07/28 19:29:51.50 74FTDS++.net
>>606
esi に i の値が入ってるとして、
mov eax, -1431655765 ; aaaaaaabH
mul esi
shr edx, 1
lea eax, DWORD PTR [edx+edx*2]
sub esi, eax
jne SHORT $LN8@main
で何やってるか考えてみれ。
621:デフォルトの名無しさん
14/07/28 23:02:52.60 pFFfm4RG.net
普通に3や5で割るより早いのかのぉ?
622:デフォルトの名無しさん
14/07/29 11:55:06.03 M1sSUXRJ.net
『ハッカーのたのしみ』の10章かな
623:,,・´∀`・,,)っ-○○○
14/08/07 20:45:20.65 mDZmRo1A.net
MMX/SSE/AVXの整数演算では除算命令がないから逆数との積はしょっちゅう使うよ
624:,,・´∀`・,,)っ-○○○
14/08/07 22:11:11.87 mDZmRo1A.net
ちなみに10進数で9の倍数の求め方ってどうやるか知ってる?
全部の桁の数字を、最後の1桁になるまで足して9になればそれが9の倍数。
9にならなければそれが剰余。
3の場合も、整数値を4進数とみなして同じことをやれば
掛け算すら使わずに3の剰余を求めることができる。
ビット演算+シフト+足し算だけ。
収束にやや時間はかかるけどいろいろ応用は利く。
(CASL/COMETって掛け算命令すらなかったよね)
625:デフォルトの名無しさん
14/08/07 22:20:07.93 bcHrnzcz.net
>>611
>ちなみに10進数で9の倍数の求め方ってどうやるか知ってる?
>全部の桁の数字を、最後の1桁になるまで足して9になればそれが9の倍数。
BCDでもない限りは「10進数で」「全部の桁の数字」って言ってる時点で除算が発生してるってことだから
素直に9で割って余りがあるか判定したほうが良い。
626:デフォルトの名無しさん
14/08/08 05:17:13.57 1UU7vf/D.net
>>611
小学校で習う
627:デフォルトの名無しさん
14/08/08 10:20:34.18 3pQsoEzr.net
できれば0は9の倍数の仲間に入れて欲しい
628:デフォルトの名無しさん
14/08/08 10:25:22.80 gW33htdT.net
ちなみに2進数で1の倍数の求め方ってどうやるか知ってる?
全部の桁の数字を、最後の1桁になるまで足して1になればそれが1の倍数。
1にならなければそれが剰余。
629:,,・´∀`・,,)っ-○○○
14/08/08 23:48:43.27 QdNtltyv.net
>>612
別に9の倍数を求める必要はないよ。あくまで例として出しただけで。
3と5の剰余を求めたいんでしょ。3なら分割統治法で2ビット値を足し続ければいい。
整数除算はモダンなCPUでも何十サイクルもかかるからビット演算+加減算に
展開したほうが速い場合は多々ある。
> 素直に9で割って余りがあるか判定したほうが良い。
除算・剰余命令が使えないCPUで同じこといえるの?
9の倍数の判定は、7かけてから6ビットに縮約することでできる。
630:デフォルトの名無しさん
14/08/09 00:07:52.61 L0D9xiK5.net
>>616
>3と5の剰余を求めたいんでしょ。3なら分割統治法で2ビット値を足し続ければいい。
>整数除算はモダンなCPUでも何十サイクルもかかるからビット演算+加減算に
>展開したほうが速い場合は多々ある。
ねぇよ馬鹿か
631:,,・´∀`・,,)っ-○○○
14/08/09 00:20:22.24 nh0jgYrR.net
あるよ馬鹿か
632:,,・´∀`・,,)っ-○○○
14/08/09 00:21:55.81 nh0jgYrR.net
ちなみに多倍長整数の因数分解とかでしょっちゅうやる
633:デフォルトの名無しさん
14/08/09 03:51:34.63 pLOg/Mid.net
>>611
13の倍数、7の倍数をどうぞ
634:,,・´∀`・,,)っ-○○○
14/08/09 09:01:38.99 nh0jgYrR.net
[ビット縮約を利用したNの倍数判定法]
1. メルセンヌ数2^n - 1を素因数分解してNを約数として持つ任意のnを決める。
2. Nの倍数判定をしたい数に、 (2^n - 1)/Nを掛ける。
3. n(またはその倍数)ビット単位で切り出し、加算する。
また、最後のnビットに収束するまでこれを繰り返す。
4. nビットに収束時、2^n - 1になっていればその数はNの倍数
(応用例として更に1足して2^n(あるいは1)への収束判定でもおk)
ちなみに5は端折ったけど3倍して4ビットに縮約
7はそのまま3ビット、13の場合は315倍して12ビット
RSAとか自前で実装したことあるなら思いつくだろこんなん
635:デフォルトの名無しさん
14/08/09 10:36:35.37 7qP+m4C1.net
自分基準で物事を考える人って…
636:,,・´∀`・,,)っ-○○○
14/08/09 11:00:39.66 nh0jgYrR.net
法と剰余なんて大学では基礎科目の範疇のはずだけどね。まともな学校行ってるの?
URLリンク(ja.wikipedia.org)
コンピュータで2のべき乗-1の倍数判定をやるのは
人間が10進数でやる9の倍数判定なみには簡単であるということ。
自分基準で考えなくていいからコンピュータ基準で考えなよ
固定長整数の範疇なら収束にかかる回数上限がわかるから
条件分岐は最終判定までは不要。
となれば少なくともdiv命令よりは速いだろうね。
URLリンク(gmplib.org)
まあ、コンパイラがやってるみたいに a - [a / b] * b で判定してもいいんだけど
多倍長を扱いたい場合とか、乗算が遅い場合にはシフト+加算やるでしょ。
637:デフォルトの名無しさん
14/08/09 12:09:51.44 mIy/oKca.net
>>621
>RSAとか自前で実装したことあるなら思いつくだろこんなん
思い付かなかった。
何倍まで判定していた?
638:デフォルトの名無しさん
14/08/09 13:02:24.85 cMAC0zr6.net
7の倍数が簡単そうなのは判るけど
13とか19とかはどうなのかな
639:,,・´∀`・,,)っ-○○○
14/08/09 13:42:24.91 nh0jgYrR.net
メルセンヌ数自体の剰余なんてコストはタダみたいなもんだからいくらでも。
ワークメモリ消費量は計算が進むほど減っていくので非常に経済的。
しかしメルセンヌ数じゃない数までこの方法を使うのは必ずしも最適ではないと思う。
複数の方法を複合的に使うのがベストなのでは。
640:デフォルトの名無しさん
14/08/10 04:44:06.43 wq8KfUB9.net
このスレで具体的なコードを示せてない時点でお察し
641:デフォルトの名無しさん
14/08/11 05:50:32.13 fF79KhY2.net
ここまで親切丁寧に教えてくれてるのにコードまで要求したら罰あたるよ
つうか、具体性って>622で十分すぎるような……
642:デフォルトの名無しさん
14/08/11 09:30:41.11 k0jUGvDo.net
スレ違いの投稿繰り返してるのに罰当たりってw
643:デフォルトの名無しさん
14/08/12 22:31:03.64 WypK+3ii.net
>>616
>除算・剰余命令が使えないCPUで同じこといえるの?
何言ってんのこのバカ
644:,,・´∀`・,,)っ-○○○
14/08/14 09:00:17.90 /1YXqPS/.net
何度もいうがx86のモダンなCPUでもdivは使えても禁止的に遅いぞ。
クロック数計測してみればいい。
コンパイラの吐いたコードと比べてみ?
別に書いてもいいけどつまらんぞ?
たとえば128bit整数のmod 3を求めるコード
pxor xmm0, xmm0
movdqa xmm1, [src]
psadbw xmm1, xmm0 ;; 11bit * 2
movdqa xmm2, xmm1
psrlq xmm2, xmm1, 8
paddd xmm1, xmm2 ;; 12bit
movd eax, xmm1
mov edx, eax
shr eax, 6
and edx, 63
add eax, edx ;; 7bit
mov eax, [table+eax] ;; 計算済みLUTから引っ張ってくる
645:デフォルトの名無しさん
14/08/14 10:36:27.82 KxZWNeXr.net
シフトと加算で剰余が求められる理由は理系学部レベルの代数学の知識があれば直感的にはわかるが
アセンブラの構文を齧っただけの人間に説明するのは難しい。
使い方だけなら教えれば中学生でも使いこなせるレベルのテクニックだが。
646:デフォルトの名無しさん
14/08/14 12:01:41.69 jDhN7lgE.net
剰余系、というか数論初歩(平方剰余の相互法則くらいまで)なんか数学科以外ではやらないと思うよ
教養課程の選択講座、くらいならわかるが
647:デフォルトの名無しさん
14/08/14 12:17:59.46 KxZWNeXr.net
まともな大学の情報系•通信工学系ならやるよ。
m=16*a+bとおくと
m mod 15 == (a+b) mod 15
難しい数式ほっといても簡単な理屈さえわかれば演算のショートカットは可能。
648:デフォルトの名無しさん
14/08/14 12:18:18.13 p8QfSufV.net
そうか?工学科でもやるよ。情報学科は知らん
649:デフォルトの名無しさん
14/08/14 14:35:21.60 31aNAkg3.net
m=16*a+bとおくと
m mod 15 == (a+b) mod 15
中学生でも理解可能
650:デフォルトの名無しさん
14/08/14 15:21:45.62 jDhN7lgE.net
>>634 >>636
うんうん、それ九去法の16進バージョンだね
m = 16*a + b
=(15 + 1)a + b
=15a + (a + b)
∴
m ≡ a + b (mod. 15)
ふつうこういう表記なんだけれどもね
651:,,・´∀`・,,)っ-○○○
14/08/14 19:42:23.76 YggMfJMP.net
mod 19のやり方いろいろ考えたけど被除数を32bit→18bitに削るくらいなら
MMX/SSE使えば1命令だけでできるね
652:デフォルトの名無しさん
14/08/30 20:23:40.25 xeSHuuAg.net
わしがなじんだアッセンブリー言語は
Z80と8086や
LDにmovやで
どや!すごいやろ
nopまであるさかいな
653:デフォルトの名無しさん
14/08/30 20:24:52.35 xeSHuuAg.net
もうすごすぎてチンポたちっぱなしやで
どや!羨ましいか
よし、おまえ等もチンポ鍛えなや
654:デフォルトの名無しさん
14/08/30 20:39:53.08 2qescp2g.net
気色悪い
655:デフォルトの名無しさん
14/09/15 15:23:11.41 pkVJB2ul.net
>>639-641
わらた
656:デフォルトの名無しさん
14/09/15 19:24:50.07 ZrKt/3Ec.net
mov, in, push, push, push, push, mov, out
657:デフォルトの名無しさん
14/09/29 00:56:30.26 RKEDgsOw.net
いまどきこんなの出ましたけど
熱血! アセンブラ入門
URLリンク(www.shuwasystem.co.jp)
658:デフォルトの名無しさん
14/09/29 02:16:32.88 NJr46rSn.net
GCCの吐いたコード見てアセンブラがわかった気になる本みたいだけど、あんま意味はないと思う。
実行環境が身近にないPowerPCとかその他アーキテクチャとか数がたくさんあっても無意味。
いまどきだったら VC++ Express のインラインアセンブラとか使うのがお手軽かつ効果も身近に感じれて
いい気がするが。
659:デフォルトの名無しさん
14/09/29 02:29:34.31 NJr46rSn.net
ツイッターでは大人気だなw
URLリンク(twitter.com)
660:デフォルトの名無しさん
14/09/29 08:16:03.37 wd4qvqdb.net
はじめてi486 のかまち氏ご推薦だって
661:デフォルトの名無しさん
14/09/29 08:26:09.14 xSX/Gj/Z.net
かわいそうに、集団いじめにあってるね
662:デフォルトの名無しさん
14/09/29 08:31:28.14 NJr46rSn.net
>>647
目次しか見てないで推薦もないと思うが。
URLリンク(twitter.com)
> 『熱血! アセンブラ入門』URLリンク(www.shuwasystem.co.jp) …
> この目次を見たら買わないわけにいかない。
URLリンク(twitter.com)
> 3日前に注文して昨日が発売日らしいのにまだ来ないなぁ。と思ったらAmazonは発売日が9/30って
> 書いてある。
663:デフォルトの名無しさん
14/09/29 09:36:48.07 NL6Qfls1.net
この本の著者は初心者や初学者を対象に微妙にずらしてくる
12ステップで作る組込みOS自作入門
URLリンク(www.amazon.co.jp)
対象マシンがH8/3069F
開発ツールを使って学ぶ! C言語プログラミング
URLリンク(www.amazon.co.jp)
初心者の方でも気軽に学習可能なように、必要開発ツールが
インストールされたLinux(CentOS)の仮想マシン(VM:Virtual Machine)
イメージをサポートサイトで無償配布します。「Oracle VM VirtualBox」
や「VMware Player」上に読み込めばすぐ学習をスタートできます。
- amazon紹介より -
664:デフォルトの名無しさん
14/10/01 03:50:57.56 PMHBFBS+.net
ツイッターで騒いでるヤツラ見てるとほんとニワカが多いなと実感�
665:キる。 コンパイラの出力見てコードの評価するのなんて業務でコンパイラ言語使ってりゃ日常の行為だろうに。
666:デフォルトの名無しさん
14/10/01 21:40:35.62 RRxwqEFU.net
↑
2chも同じだということを自分で証明しているw
667:デフォルトの名無しさん
14/10/01 23:25:07.36 XzaO0iHc.net
大手系の投稿記事よりはましなこと書いてたような
668:デフォルトの名無しさん
14/10/02 08:07:44.77 vok4PHmT.net
vs2013でyasmのソースコードデバッグできないのはどうしたらいいんだろう?
以前は-g cv8でできた気がしたけど、2012でもだめで、2008だったからかな
669:655
14/10/10 00:03:18.91 EfaI1XmC.net
vs2008を引っ張り出しきてインストールしたら、yasmのソースコードデバッグも可能で
ちゃんとブレークポイントも設定できた
2013でもローカルシンボルのアドレスは読み込んでるんだけどなぁ
670:デフォルトの名無しさん
14/10/10 12:27:08.25 553xVF6m.net
VCは64-bitインラインアセンブラできないんでしょ?
671:デフォルトの名無しさん
14/10/10 12:43:13.70 aGA3C1dn.net
インラインアセンブラにこだわる理由もない
672:デフォルトの名無しさん
14/10/11 00:20:30.24 JSe/b624.net
デバッグ情報が変わったのか、asmファイルでブレークポイントを設定しても
無効になっちゃうんだよ
これは使いにくい
masmなら大丈夫なんだけどね
673:デフォルトの名無しさん
14/11/04 17:11:16.93 8a1BiHkJ.net
8086はデータ転送命令はmoveとexchangeしかないと思うのですが、
80486になるとload effective addressという命令が加わっています。
今までmove命令で書けていたものに、load effective address命令を加える必要はあるのでしょうか。
moveとload effective addressは別物でしょうか
674:デフォルトの名無しさん
14/11/04 17:43:18.58 4tbMiHmM.net
>>659
8086の頃からLEA命令あったでしょ。
URLリンク(www.ece.cmu.edu)
675:デフォルトの名無しさん
14/11/04 17:56:50.54 99dxtSJ/.net
8086の頃からあるわけだけど、利点としては
・普通のアドレッシング表現から、そのアドレスにアクセスするのでなく
そのアドレスそのものが得られるので便利
・P5以降とかだと、可能な限りどんな命令でも1クロックで実行できるよう
頑張ってるので、アドレス計算用にたくさん乗ってる加算器を有用に
使って、数個の数の足し算と4倍、みたいな計算が高速にできる
とか。
676:デフォルトの名無しさん
14/11/04 17:59:26.43 obX3t5pP.net
等価じゃないのに
677:デフォルトの名無しさん
14/11/04 18:34:18.92 8a1BiHkJ.net
ありがとうございます。マニュアルを読むようにします
678:デフォルトの名無しさん
14/11/09 14:24:01.21 bui++2v4.net
CASLⅡのRPUSH,RPOPがわからないのですが、メインルーチンでRPUSH、RPOPする理由を教えてください。
サブルーチン呼び出しでレジスタの値を退避し、その処理から抜けるときに復帰するのはわかるのですが、
メインルーチンが呼ばれてプログラムが始まるときにレジスタの値をスタックに退避し、抜けるときに復帰するのはスタートアップルーチンと何か関係があるのでしょうか
679:デフォルトの名無しさん
14/11/09 14:41:08.70 6OcI07Hk.net
RETで終了するならそのプログラムもサブルーチンてことだから、レジスタを
退避/復帰する理由は他のサブルーチンと同じ。
680:デフォルトの名無しさん
14/11/14 21:44:40.20 Q09MuRKV.net
オススメのアセンブラ入門サイト教えてくださいお願いします
681:デフォルトの名無しさん
14/11/14 21:45:49.11 Q09MuRKV.net
あ、x86です
682:デフォルトの名無しさん
14/11/14 21:57:13.86 ssh0hRKq.net
>>666
URLリンク(www.intel.co.jp)
683:デフォルトの名無しさん
14/11/14 22:31:57.52 Q09MuRKV.net
>>668
やはり最終的にはintelのサイトに行き着くんですね、
684:ありがとうございます
685:デフォルトの名無しさん
14/11/15 09:37:48.59 nFEuZMwr.net
<main+0> push rbp
<main+1> mov rbp,rsp
<main+4> mov eax,0x0
<main+9> mov DWORD PTR [rbp-0x4],0x0
<main+16> pop rbp
<main+17> ret
もとのプログラムはint main(){return 0;}をディスアセンブルしたものなのですが、
eaxにはリターン値0がロードされるのはわかるのですが、
mov DWORD PTR[rbp-0x4],0x0が何の処理なのかわかりません
686:デフォルトの名無しさん
14/11/15 14:21:10.02 yIj5KxcO.net
使ってるコンパイラとコンパイルオプションは?
687:デフォルトの名無しさん
14/11/15 14:52:03.23 nFEuZMwr.net
clangです
コンパイルオプションは-gのみです
688:デフォルトの名無しさん
14/11/15 15:53:32.81 yIj5KxcO.net
Cygwin64上のclang version 3.4.2 (tags/RELEASE_34/dot2-final)で
hoge.c:
int main()
{
return 0;
}
を
$ clang -S hoge.c
したら
main:
pushq %rbp
movq %rsp, %rbp
pushq %rax
callq __main
movl $0, -4(%rbp)
xorl %eax, %eax
addq $8, %rsp
popq %rbp
ret
になったから結果が違うな。movl $0,-4(%rbp) はされるが。
689:デフォルトの名無しさん
14/11/15 15:56:22.72 yIj5KxcO.net
$ clang -O2 -S hoge.c
最適化ありでコンパイルすると
main:
pushq %rbp
movq %rsp, %rbp
callq __main
xorl %eax, %eax
popq %rbp
ret
になったから movl $0,-4(%rbp) が意味ないことは確か。
690:デフォルトの名無しさん
14/11/15 16:01:50.53 yIj5KxcO.net
ちなみにmain()でない関数なら最適化なしでも結果変わらんかった。
int hoge()
{
return 0;
}
$ clang -S hoge.c
hoge:
pushq %rbp
movq %rsp, %rbp
xorl %eax, %eax
popq %rbp
ret
$ clang -O2 -S hoge.c
hoge:
pushq %rbp
movq %rsp, %rbp
xorl %eax, %eax
popq %rbp
ret
$ clang -O2 -fomit-frame-pointer -S hoge.c
hoge:
xorl %eax, %eax
ret
691:デフォルトの名無しさん
14/11/15 19:20:54.59 nFEuZMwr.net
>>674
ありがとうございます
意味がないということがわかりました
692:片山博文MZ ◆T6xkBnTXz7B0
14/12/25 22:21:21.82 gEw73of1.net
IEEE754-2008の浮動小数点数をx86アセンブラで実装出来る人、此処に居ますか?
693:デフォルトの名無しさん
14/12/25 22:33:47.28 gEw73of1.net
あげ
694:デフォルトの名無しさん
14/12/25 22:35:18.35 P9hgzX+u.net
そんなの金次第
695:デフォルトの名無しさん
14/12/25 22:37:17.19 P9hgzX+u.net
片山博文MZ で検索
URLリンク(www.google.co.jp)
696:デフォルトの名無しさん
14/12/27 22:56:25.54 u+dBZrZs.net
仮に、A1111,B1101 として精度4桁とすると、
和差は、指数部の大きい方へ合わせる
1111
00001101 → 0
指数の差が4桁以上あると、下は0と同じになる
仮に指数を、A50,B20とすると、
積は両指数の和 → 50 + 20 = 70
除は両指数の差 → 50 - 20 = 30
697:682
14/12/28 10:12:28.37 /YZxn3dB.net
これらをシフト・マスク演算などを使って、
Cで書いて、アセンブラで出力すれば?
でも、ちゃんとステータスレジスタのフラグが立つかな?
698:片山博文MZ ◆T6xkBnTXz7B0
14/12/28 11:45:17.05 0W4dp9Sf.net
>>681-682
よく考えたら、x86で作るのは意味なかった。ごめんね。
699: ◆hL51veKlRE
15/02/01 18:55:41.71 JsXnXzTS.net
aaa/daaとかの命令は結局どういう用途で存在しているんだ...?
調べてもよくわからん(多分それだけ使われないんだろうが)
700:デフォルトの名無しさん
15/02/01 19:01:49.03 rGGapq8A.net
>>684
お前がBCD演算を理解してないだけ
701:デフォルトの名無しさん
15/02/01 19:33:48.31 +Sv3xZC2.net
fpuが外付けな大昔
Z80のフローティングライッブラリをx86に移植して
三角関数もテー�
702:uルを使って近似値を求める方法で実装したことあるけど 今の時代、知的好奇心を満たす以外になにか意味ある? 三角関数の精度はFPUの付いたPCで計算した結果と摺り合わせて確認した
703:デフォルトの名無しさん
15/02/01 20:06:24.91 s/hXDQXD.net
どっちが速かった?
704:デフォルトの名無しさん
15/02/01 20:53:10.36 +Sv3xZC2.net
なにと比較するのかと言う意味なら比較対象がない
当時のN88BASIC(86)との比較ではインタープリタ対マシン語(アセンブラ)なので
オーバーヘッドが少ない分自分で移植したライブラリの方が早かった(FPU無しの倍精度)
内部は80ビットフローティングの精度に対応する為に化数部を128ビット指数部を16ビットで計算後
80ビットフォーマットに丸めた
x64って天国だよなx86と比較すると
紙に印刷したプログラム探せば出てくると思うw
705:デフォルトの名無しさん
15/02/01 22:17:09.61 e1RPi5xm.net
>>686
0度~45度をテーブル実装するの?それとももっと狭くていいの?
706:デフォルトの名無しさん
15/02/02 04:57:44.05 j5MISSAc.net
>>689
忘れたけどたぶんそれくらい
もしかすると90度分かもしれなけど
テーブルの形式は計算精度が必要だったので
近似値に収束する形だったと思う(もう覚えていない)
三角関数の比率が必要な場面は今はFPUに依存できる
あらかじめ化数128指数16ビットの浮動小数点ライブラリで精度の高めな
近似値導出用テーブルを作ってそれを使ってtan-1(うろ覚え)を求めた後で三角関数を計算してた
利用目的で必要な計算精度も異なるので工夫しようぜ
三角関数の粗い比率だけなら64ビット整数で簡単に導出可能
707:デフォルトの名無しさん
15/03/08 10:52:34.09 /s2hhMUc.net
とりあえず「仮数部」を単語登録した
708:デフォルトの名無しさん
15/03/10 01:21:00.65 HHYC72Cw.net
PICでのC言語プログラム(上側)をアセンブラ言語(下側)へと書き直したのですが上手く動いてくれません
URLリンク(codepad.org)
URLリンク(codepad.org)
プログラムの内容は8つのLEDのうち一つが光っており、
RB0のスイッチを押すたびに光る場所がひとつずつシフトしていくというものです
そして、このプログラム内でチャタリング対策を行っています。
Cの方は上手く動いてくれましたが、アセンブラの方は56行目でどうしてもスキップが有効になりCount_Loopから抜け出せない状況に陥ってしまいます
ステップオーバーで調べてみたところWregや物理スイッチの反応には問題なさそうだったので
Switch_Countが怪しいと睨んでいます(原因は分かりませんが)
どなたか原因の究明をお願いします
709:デフォルトの名無しさん
15/03/11 10:42:49.84 3uN2N73I.net
誘導
スレリンク(denki板)
710:デフォルトの名無しさん
15/03/12 15:48:05.20 5fkTWTro.net
>>693
ありがとう
711:デフォルトの名無しさん
15/03/17 21:14:19.50 aVnPeaqI.net
CNT1 EQU 2
にするだけで直ったら笑うしかない
712:デフォルトの名無しさん
15/04/30 22:48:02.55 0+PJlfoo.net
GASアセンブリについて質問です。 ubuntu14.10をインストールして現在標準でついてるgccを使ってアセンブリを勉強しています。
サンプルのプログラムを入力したのですが、エラーの原因が分かりません
サンプルコード
.set EXIT, 1
.set READ, 3
.set WRITE, 4
.data
PROMPT: .string "inp
713:ut string >> " .bss var: .skip 16, 0x00 .text .global main main: pushl $PROMPT call print call scan pushl $var call print call exit print: movl 4(%esp) ,%ecx movl $1, %ebx # 標準出力へ movl $1, %edx # 1文字出力 続く
714:デフォルトの名無しさん
15/04/30 22:50:24.85 0+PJlfoo.net
続き
write:
cmpb $0x00, (%ecx) # null文字かどうか
je write_end
movl $WRITE, %eax # write
int $0x80
incl %ecx # 次の文字
jmp write
write_end:
ret
scan:
movl $READ, %eax # readシステムコール
xorl %ebx, %ebx # 標準入力から
movl $var, %ecx # バッファを指定
movl $16, %edx # 16バイト読み込み
int $0x80
ret
exit:
movl $EXIT, %eax # exit
movl $0, %ebx # 終了コード0
int $0x80
715:デフォルトの名無しさん
15/04/30 22:50:58.40 0+PJlfoo.net
続き
すると、
invalid instruction suffix for `push'
という、アセンブラのエラーが出ます。
これはアセンブラ側に問題があるのでしょうか?
プログラムの問題?ハード側?
解らないヽ(´o`;
色々試してみましたが、pushlの「l」のことを指しているのかとも思いましたが、解決策が見つかりません。
<スペック>
PC:レグザPC Windows7(64bit)
USBHDD:ubuntu14.10
CPU:インテル Core i7 2670QM
メモリ:8GB
どうかよろしくお願いします。
716:デフォルトの名無しさん
15/05/01 00:16:48.19 WNUsFIxq.net
ヤマカン
CRLFとか
717:デフォルトの名無しさん
15/05/01 03:46:47.42 TPwiwWUO.net
>>696
なんかそのものズバリの質問してる外人がいる。
"Invalid instruction suffix for push when assembling with gas"
URLリンク(stackoverflow.com)
ざっとしか読んでないけど
32bitアセンブラ用のコードを64bitアセンブラで動かそうとすると、レジスタが増えた分、それに対応させる
プリフィクス命令REPを追加しないといけないらしい。
64bitアセンブラの場合、push命令にREPプリフィクスを付けないとエラーになるみたい。
もっと言うと、64bitアセンブラではpush/popは事実上使われなくなるので違う書き方に変えろということもあるらしい。
URLリンク(codezine.jp)
自分で試してないのでほんとかどうかは知らん。
718:デフォルトの名無しさん
15/05/01 08:29:12.81 wFPW/Xoy.net
今朝見た夢に"LSL ROL LSL ROL"ってのが呪文みたいに出てきたわ
そういや64bitになったら使った試しがない
128bit以上の所をShiftするならSSE3か何かにそういう命令あったような
719:デフォルトの名無しさん
15/05/01 13:44:13.88 ZRNg35S/.net
>>700
>64bitアセンブラではpush/popは事実上使われなくなるので違う書き方に変えろということもあるらしい。
リンク先読みました、目からウロコだった。ww
720:デフォルトの名無しさん
15/05/01 16:05:20.76 tFZiwDeL.net
ま、VC64bitでインラインアセンブラが使えなくなったと行っても、ASMファイルをプロジェクトに
入れると普通に使えるから問題感じた事ないな
721:デフォルトの名無しさん
15/05/01 21:18:43.53 Efwc/Emn.net
>>700
リンク貼って頂いてありがとうございます!
世界には同じように悩んでた人がいたんですね^^;
単純にHello,Woldを表示するCコードを逆アセンブルしてみると、
pushはpushqで出てました。
.cfi_startproc~.endprocで囲まれており、pushqの前後に
.cfi_def_cfa_offset 16
.cfi_offset 6 , -16 と、あります。
クワッドを使用する上で必要なのでしょうか?
ただ、>>696の質問のコードで同じような書き方をすると
Segmentation fault (コアダンプ)となりました (--;
むちゃくちゃだと思いますが、ホントに解りません(>_<)
ただ、64bitでは入門しょっぱなから記述が変わってくるという
ことはなんとなく分かりました(T.T)
64bitでのpushの問題をなんとか解決したいです。
ハードル高いんでしょうか?
因みにパソコンすら初心者です。下手な質問、ご容赦下さい。
頑張ります(-o-)b
722:Office & Gamers ◆G144Hzgh2.0e
15/05/02 01:21:24.36 BIc+ZG3h.net
>>704
アセンブラをやりたかったら、MenuetOSと付属のFASM(flat assembler)を使うといいよw
システムコールがレジスタ渡しで簡単w
723:デフォルトの名無しさん
15/05/02 23:53:25.09 N2i4dBWj.net
64bitのMASMで動く一番簡単なHelloプログラムの作り方が書いてあります。
やってみたら動きました。Windows7-64で、たった2.5kバイトでHelloが出ます。ml64.exeが必要です。
URLリンク(dabun.kmycode.net)
724:デフォルトの名無しさん
15/05/07 09:48:07.36 uz86ZVQL.net
push/pop使わねえの見て、学生時代に68Kでこんな風に書いてたの思い出した
LINK A6, #-56
MOVEM.L D2-D7/A0-A5,-48(A6)
MOVE.L D0,-52(A6)
MOVE.L D1,-56(A6)
~処理~
MOVEM.L -48(A6),D2-D7/A0-A5
UNLK A6
725:デフォルトの名無しさん
15/05/07 12:35:44.27 bwdzUvDw.net
casl で書いとくれ
726:デフォルトの名無しさん
15/05/19 19:25:09.28 zxHYER8T.net
>>704
64bitでは基本push ,pop系統の命令は使わない
>>700のリンク先にもあるけど
あらかじめpush popで利用する分の格納領域を手続きの初めにスタックフレーム上に確保する
で、mov命令でspの値+オフセット、こんな感じに扱う
mov qword ptr[rsp+offset],rax
mov rax,qword ptr[rsp+offset]
昔流のpush popでお手軽手抜きは難しいんだろうね
いや、出来るかも知れないけど
アセンブラ+スタックフレームの確保を自動で計算、命令も出力してくれる
cみたいに拡張したアセンブラが必要になるね
727:名無しさん
15/06/14 09:50:14.92 bOUig4Hv.net
基本情報処理技術者試験H22春のCASLⅡの問題のプログラムを
作成したんですが。うまく動きません。どうしてですか?
実際のデータは1+2=3にしたいんです。
DATA1 DC #0080,#0000;1
DATA2 DC #0081,#0000;2
おそらく、データの値が間違っていると思うんですが・・・
728:名無しさん
15/06/14 14:50:42.91 bOUig4Hv.net
711の件は解決しました。
お騒がせしました。
729:デフォルトの名無しさん
15/06/28 11:43:30.99 C8acUGCg.net
shの#ってどうゆう意味?
mov.lでレジスタに送るときに付けてないとアドレスの内容が送られるのに、
データ定義するときはつけないみたいなんだ。
有り無しの違い教えてください!
730:デフォルトの名無しさん
15/06/28 23:40:08.78 u+WDKBAd.net
定数の時につけれ
マニュアルに書いてないっけ?
731:デフォルトの名無しさん
15/06/29 18:27:44.03 U/nUfeSW.net
>>713
初心者すぎてマニュアルの見方すら分かってませんでした。
定数と考えればいいんですね。
スッキリしました。
ありがとう。
732:デフォルトの名無しさん
15/06/30 08:05:57.40 d0PzGiLf.net
即値アドレッシングって用語を覚えておいて欲しい
733:デフォルトの名無しさん
15/06/30 21:12:30.13 XopmavOU.net
>>715
覚えておきます!
734:!
735:デフォルトの名無しさん
15/07/07 06:23:33.54 B+1kKjNv.net
CALLやPUSH/POPなどはMOVやJMP、INCといった別の命令の組み合わせで動いていると何処かで読んだんですが、
そうするとCALLを使わず自分で好きなレジスタを使ってスタックを管理しても有意差は無いと考えていいんでしょうか?
それともCALLやPUSH等の専用の命令を使うと1Hzに収まるとかそういう違いがあるのでしょうか?
736:デフォルトの名無しさん
15/07/07 12:07:19.12 DcDmvdDl.net
その何処かで読んだものが、複合命令とか疑似命令とか言われる
アセンブラで他命令にマッピングされるもののことならば有意差はないでいい
マイクロコードのことならば、そもそも出来ない
737:デフォルトの名無しさん
15/07/07 14:58:03.97 ldC6ltUq.net
>>717
CALLは1命令で済むから割り込みのことを考える必要はないけど、複数命令の組み合わせにした場合、
途中で割り込みが入っても大丈夫かどうか検討してみたほうがいいですよ。
それと、両方の場合でトータルのクロック数を比較して、少ない方を使うのがいいですよ。
738:,,・´∀`・,,)っ-○○○
15/07/07 15:34:31.62 U1BWXrcA.net
CALL命令使わずに戻り先の命令ポインタをどうやってスタックにセットするつもりだ?
少なくとも32ビットまでのx86命令セットにはEIPレジスタを読み出す命令は存在しない
739:デフォルトの名無しさん
15/07/07 16:38:53.47 6QdGJYSy.net
>>720
おじいちゃん頭が固いね。
アセンブラがアドレスを計算して入れればいいじゃん。
分岐先やデータ参照のアドレスはそうやってるんだし戻り番地が計算できないとかない。
740:デフォルトの名無しさん
15/07/07 18:58:46.93 Wm4YwPII.net
団子の言うとおりx86 32bitではプログラムカウンタ(EIPレジスタ)の値を取得するという操作自体が
call以外じゃ不可能なのよ
だからPICでPC相対アドレス計算する時に次の命令の番地にcallしてpopしてとか面倒なことやってるわけでしょ?
x86-64ならleaでRIP相対アドレッシングできるからまあcallは必須ではないか
741:デフォルトの名無しさん
15/07/07 19:56:39.94 B+1kKjNv.net
>>718-719
ありがとうございます。書き忘れてましたが64bit用のオペコード使って色々書こうと思っていた所で、
一部の命令を覚えないで済むと慣れるまでは楽出来るかなと思ってたのですが、やはり最初から全ての命令を含めて組み立てるべきなんですね。
あと追加で申し訳ないんですが、ES,SS,CS,DS等へのPUSH、POPが64bit modeだと無効となっているんですが、
これはリアルモードの時は使用できて、64bit modeの時に無効になるという解釈でいいんでしょうか?
それとも64bitCPUには、それらのセグメントレジスタ自体が乗ってないんでしょうか?
742:デフォルトの名無しさん
15/07/07 20:50:44.79 B3f4PYYu.net
>>721
__asm {
push target
jmp proc1
target:
}
で出来るな。
引数は普通にスタックに積んで返り値はeaxだしな。
743:デフォルトの名無しさん
15/07/07 21:04:09.84 B3f4PYYu.net
>>723
セグメントについては
URLリンク(hp.vector.co.jp)
の2.1にあるテーブルのセグメントなんたらの項目を参照してね。
744:デフォルトの名無しさん
15/07/07 21:27:05.58 Xbklf+Ix.net
>>717
callやretはリターンアドレスの予測機構があってサブルーチンコールのペナルティが少なくなってるはず。
だから他のレジスタを使って間接ジャンプした時の方が遅くなると思うよ。
フレームポインタを省略してスタックポインタの相対アクセスでローカル変数を
管理するというのはよくあるが、無理してスタックを使わないというのはまずない。
745:デフォルトの名無しさん
15/07/07 22:24:16.63 B+1kKjNv.net
>>725
ありがとうございます。
なんとなく「乗ってないという事はなさそうだな」という程度にしかまだ理解できませんが、
これから勉強してはっきりと理解できるように頑張ります。
>>726
jmp命令だとパイプラインの中身がflushされるそうですが、callだとそれを防げるという理解でよろしいでしょうか。
早くテスト出来る環境を整えて色々な方法で比べてみたいと思います。
746:,,・´∀`・,,)っ-○○○
15/07/07 22:49:15.22 Jp2Iokv0.net
>>721
それじゃリロケータブルなコードは書けないぞ
747:デフォルトの名無しさん
15/07/07 23:17:56.50 Xbklf+Ix.net
>>727
>jmp命令だとパイプラインの中身がflushされるそうですが、callだとそれを防げるという理解でよろしいでしょうか。
callというよりretね。パイプラインのフラッシュというのは一個所から複数のアドレスに分岐するようなケースで発生しやすい。
条件分岐や間接ジャンプ、リターン命令など。
だからレジスタの内容で間接的にジャンプ先が指定される疑似retはペナルティが発生しやすい。
そのためスタックポインタには特別な監視機構がついてる。
748:デフォルトの名無しさん
15/07/08 02:16:34.27 u/EIUunr.net
ほとんどのret命令は直前に実行したcall命令の次の命令に分岐するから非常に高い精度の分岐予測ができるのは大きいな。
749:デフォルトの名無しさん
15/07/08 02:20:24.53 u/EIUunr.net
>>728
それじゃx86ではリロケータブルなコードは書けないぞw
exeをロードした後セグメントの値をゴリゴリ書き直したり
MMUでロードする論理アドレスを固定したりと
いくらでもリロケータブルにする方法はあるのに無知って怖いな
750:,,・´∀`・,,)っ-○○○
15/07/08 03:10:34.57 88H8yWBh.net
> exeをロードした後セグメントの値をゴリゴリ書き直したり
そんなん知ってるが?てかJITのコード書いてましたが?
ユーザーモードでコードセグメントの書き換えを行うには特別なAPIを呼び出す必要がある上
キャッシュのinvalidationを都度やる必要があるからペナルティを伴う
その時点のEIP値をとった方が遥かに柔軟だしそもそもそんなコードの書き換えしてまで
call命令をわざわざ回避する理由がねーぢゃん
751:,,・´∀`・,,)っ-○○○w
15/07/08 03:25:16.20 88H8yWBh.net
んで、自己書き換えでオフセットの整合をとるために結局EIPを取る必要があって
特に32ビットではCALL命令を使う必要がある、と。
本末転倒だな
752:デフォルトの名無しさん
15/07/08 03:54:52.00 u/EIUunr.net
別にcall命令を使わないってことじゃないよ。
使わなくてもリロケータブルなコードは書けるってだけ。
68Kとかだとリロケータブルにするためにそういうテクニックを使うが
86はセグメントと内蔵MMUがあるからそこまでしなくてもリロケータブルになる。別に1バイト単位でリロケータブルにしても意味ないからね。
ところでおじいちゃん明日から大丈夫なの。
753:デフォルトの名無しさん
15/07/08 05:15:05.60 Y+kE74C9.net
ぽんこつはよしね
754:,,・´∀`・,,)っ-○○○w
15/07/08 06:24:13.84 88H8yWBh.net
> 86はセグメントと内蔵MMUがあるからそこまでしなくてもリロケータブルになる。
> 別に1バイト単位でリロケータブルにしても意味ないからね。
うわークソ老害が姿を表したぞ
おま絶対50歳超えてるだろ
> 86はセグメントと内蔵MMUがあるからそこまでしなくてもリロケータブルになる。
> 別に1バイト単位でリロケータブルにしても意味ないからね。
このおじいちゃん再配置可能の意味をものすごい古い意味でしか知らないようだけどVista以降のOSは触ったことがなさそうだな 👀
Rock54: Caution(BBR-MD5:0be15ced7fbdb9fdb4d0ce1929c1b82f)
755:,,・´∀`・,,)っ-○○○w
15/07/08 06:30:07.39 88H8yWBh.net
まあとりあえず今のWindows(DEP+ASLR前提)環境で通用する知識を頼むはwww
756:,,・´∀`・,,)っ-○○○w
15/07/08 07:54:58.71 88H8yWBh.net
WindowsというよりMacのほうが先か
それでなくとも*NIXでforkとかやるのにEIP/RIPの取得は必須なんだが
(子プロセスで完全なコピーをとるからね)
結果的にスレッドが割り当てられるアドレスをバイナリ生成時に決め打ちすることができないんだよ
おじいちゃんは所詮DOSとかの時代のシングルタスク知識止まり
757:デフォルトの名無しさん
15/07/08 09:01:04.05 u/EIUunr.net
うわー
こいつリエントラントとリロケータブル混同してるよ
758:デフォルトの名無しさん
15/07/08 09:47:32.45 7ROcSmAH.net
>>717の質問意図がちょっと理解できないんだけど、
命令デコード後に複数μOPに展開されて処理される命令と単純な命令を並べた場合の比較なら
新しいCPUほどデコーダーの制限の影響が小さくなってるから、どちらでも速度的なメリットはほぼ関係なくなった。
ただしサブルーチンコールは専用の命令を使うべき。
core以前のPentium 3とかだとメモリオペランドが複数μOPに分解されるため
デコーダーの制約に引っかかりやすかったが、今のCPUでは1μOPに変換されるから関係なくなってるし。
日本語版の最適化マニュアルは古すぎて今の最適化マニュアルでは非推奨のコーディング法になってるのも多いから注意してね。
759:デフォルトの名無しさん
15/07/08 10:16:23.88 8utIjUev.net
見苦しい老害がいるな
URLリンク(ja.m.wikipedia.org)リエントラント
760:デフォルトの名無しさん
15/07/08 10:31:10.51 8utIjUev.net
setjmp/longjmpすらcallでeipとって保存してることも知らないゴミか
761:デフォルトの名無しさん
15/07/08 10:41:45.36 u/EIUunr.net
>>742
setjmp/longjmpはスタックポインタを保存してることも知らないゴミか
762:デフォルトの名無しさん
15/07/08 22:01:58.21 7ROcSmAH.net
>>740のメモリオペランドが1μOPになるのはソースオペランドの場合のことね。
デスティネーションオペランドは最新coreでも2μOPになるので、昔のCPUと変わってないよ。
763:デフォルトの名無しさん
15/07/08 22:03:18.41 Y+kE74C9.net
アスペですね
判ります
764:デフォルトの名無しさん
15/07/16 06:27:13.33 l6l+0TT5.net
>>736
DOSの時代なら30代後半にさしかかったばかりの若造でも余裕で使ってる気がするんだが……
765:デフォルトの名無しさん
15/07/16 09:52:43.32 qia5kD2O.net
リロケータブルじゃなくてOSの作りの問題だな。
プログラムを構成するコード、リテラル、データ、これらを任意の物理アドレスに配置できるのがリロケータブル。
マルチプロセス、マルチスレッド、
リエントラントで同一バイナリが同時に複数の箇所からコールされても動くかどうかは別問題。
データはコンテキスト毎に別物を用意しなければならないから、通常はコンテキスト毎に別のメモリを割り当ててそのポインタを渡すかスタックで利用できる範囲内で使う。
コードはPC相対分岐が可能なのでロードされたアドレスとは関係なく動かすことができる。
問題はリテラルでリテラルはデータと違って原則として一つだけあれば良いがそのアドレス指定をどうするか。さらにリテラルに分岐先アドレスを書いてのテーブル参照分岐をどうするか。
x86の場合はセグメント/LDTを使った論理/物理アドレス変換機能があるためそれを使えば簡単に解決する。しかしx86以外のCPUにはその機能が無い。RISCを含めた多様なCPUに対応したOSを実現しようとした時それはまずい。
またLDTを使うとセグメントの切り替えが頻繁に発生して性能が上がりにくい。それはCPUのマイクロアーキテクチャの改良で何とでもなるがそこまでして使わなければならないものでもない。
x86を含む多くのCPUにはPC相対アドレッシングモードの利用条件に制限があるが全てのCPUでcall命令を実行すればそのリターンアドレス=call命令の次の命令のアドレスが取得可能なのでそこを基準にした疑似PC相対アドレッシングモードが実現可能である。
リテラルの参照や分岐先アドレステーブルにこれを使うとCPUに依存しないOS、コンパイラが実現できて具合が良い。
なおリテラルの参照にPC相対アドレッシングモードが利用可能な場合はそれを使うと命令数を節約できるのでx64ではその機能が追加されている。
766:デフォルトの名無しさん
15/07/16 11:05:05.35 +XrxSP+3.net
三行で頼む
767:,,・´∀`・,,)っ-○○○w
15/07/16 20:02:18.69 zs3wJnLw.net
今のOSはDLLの関数の配置すら固定アドレスではない
関数がどこのアドレスにマッピングされるか実行時まで不定なん�
768:トのはJITではよくあることですし EIPを取るためにCALLは事実上必須の技術要素 化石には理解できんでしょうよ
769:デフォルトの名無しさん
15/07/16 22:33:05.29 qia5kD2O.net
>>749
おまいさんがx86を理解していないことはよく分かったよ
770:デフォルトの名無しさん
15/07/17 06:17:34.00 LRu5x31a.net
バイナリがリロケータブルじゃなくてもローダがリロケートしてるんだからEIPなんて必要ないべ
JITだってコードジェネレータが確保したメモリに命令を埋めてくんだから
callでEIP取らんでもコードジェネレータが把握してるものだよな
771:,,・´∀`・,,)っ-○○○
15/07/17 11:57:49.98 jB6b4zL7.net
> JITだってコードジェネレータが確保したメモリに命令を埋めてくんだから
そうやってJIT開発経験ないこと暴露しなくていいよ
それじゃ例外処理を実装できない
772:デフォルトの名無しさん
15/07/17 13:16:26.01 KpkroeLG.net
>>752
整数主体の簡単なJITなら別に例外なんて必須じゃないけどな
例外処理まで含んだJIT環境を実装したと言うのなら
具体的にどんな環境でどんな手順でコードを生成するのか具体例を示してもらえません?
773:デフォルトの名無しさん
15/07/17 13:21:27.49 KpkroeLG.net
×具体的にどんな環境でどんな手順でコードを生成するのか具体例を示してもらえません?
○具体的にどんな環境でどんな手順で例外部分コードを生成するのか具体例を示してもらえません?
774:デフォルトの名無しさん
15/07/17 18:02:27.98 rsdGdSBA.net
xbyakも例外なんて実装されてないからtry文使ってるよ
例外処理で必要なのはスタック上のコンテキストであってEIPじゃないよね
EIPは例外発生したことによってその位置が渡されるんだから
カーネルとユーザプログラムの処理がごっちゃになってないか
setjump/longjmpも例外処理自体には直接関係してないし
775:デフォルトの名無しさん
15/07/17 18:07:59.31 z7xtLFhW.net
例外処理にcall/popでeipを取得する必要があるとは初耳だな。
例外が発生したらスタックフレームにeipを含む例外内容が積まれるから
それを処理するというのなら普通だが。
776:,,・´∀`・,,)っ-○○○
15/07/17 18:51:13.61 jB6b4zL7.net
> 例外が発生したらスタックフレームにeipを含む例外内容が積まれるから
x86の例外だけはな
~~~~~
777:デフォルトの名無しさん
15/07/17 19:48:00.37 XnN0+6K+.net
callでeip取らなきゃならないJIT例外処理の具体的なコード例はよ
778:デフォルトの名無しさん
15/07/17 19:56:00.34 XnN0+6K+.net
>>720,,・´∀`・,,)っ-○○○
>CALL命令使わずに戻り先の命令ポインタをどうやってスタックにセットするつもりだ?
>>721
>アセンブラがアドレスを計算して入れればいいじゃん。
>分岐先やデータ参照のアドレスはそうやってるんだし戻り番地が計算できないとかない。
>>728,,・´∀`・,,)っ-○○○
>それじゃリロケータブルなコードは書けないぞ
>>738,,・´∀`・,,)っ-○○○
>結果的にスレッドが割り当てられるアドレスをバイナリ生成時に決め打ちすることができないんだよ
>>739
>うわー
>こいつリエントラントとリロケータブル混同してるよ
779:デフォルトの名無しさん
15/07/17 19:59:37.86 XnN0+6K+.net
>>749 :,,・´∀`・,,)っ-○○○w
>関数がどこのアドレスにマッピングされるか実行時まで不定なんてのはJITではよくあることですし
>EIPを取るためにCALLは事実上必須の技術要素
>>751
JITだってコードジェネレータが確保したメモリに命令を埋めてくんだから
callでEIP取らんでもコードジェネレータが把握してるものだよな
>>752 :,,・´∀`・,,)っ-○○○
>そうやってJIT開発経験ないこと暴露しなくていいよ
>それじゃ例外処理を実装できない
>>755
>例外処理で必要なのはスタック上のコンテキストであってEIPじゃないよね
>EIPは例外発生したことによってその位置が渡されるんだから
>カーネルとユーザプログラムの処理がごっちゃになってないか
>>756
>例外処理にcall/popでeipを取得する必要があるとは初耳だな。