トップページ⇒tech
988コメント306KB

アセンブラヽ(`Д´)ノモルァ

レス数が950を超えています。1000を超えると書き込みができなくなります。
0001デフォルトの名無しさんNGNG
全スレ
アセンブラ… (・∀・)イイ!

http://pc3.2ch.net/test/read.cgi/tech/1016991911/
0002 ◆F52DmOxJlc NGNG
>>2でいいかな?
0003豊田スタジアム ◆lgnmT9tYFg NGNG
Kぐらいしか使い方知らない・・・
0004デフォルトの名無しさんNGNG
>>1
スレタイは前回となんにも変わらないし、全スレとかいってタイトル違ってるし、
ここは糞スレだな。>>1は馬鹿丸出し
0005デフォルトの名無しさんNGNG
VBとかは電気屋で売ってるんだけど、アセンブラはどこに売ってるの?
0006デフォルトの名無しさんNGNG
>>1
ドンマイ!
そのうち良い事あるさ
0007デフォルトの名無しさんNGNG
アセンブラ キタ━(゚∀゚)━!!

はどうだろう
0008デフォルトの名無しさんNGNG
>>5
ジャパネットに電話して聞いて見ろ
0009デフォルトの名無しさんNGNG
即死避け
0010デフォルトの名無しさんNGNG
>>5
DOS窓開いて
debug
と打て

ヘルプは?だ
抜けるのはqだ
0011デフォルトの名無しさんNGNG
/++++++++++++++++++++++++++++++++++++++++++++++【LINKその1】
アセンブラ… (・∀・)イイ!
http://pc.2ch.net/tech/kako/1002/10022/1002267809.html
アセンブラ入門
http://www5c.biglobe.ne.jp/~ecb/assembler/assembler00.html
Win32 アセンブラ
http://www7.plala.or.jp/keny01/masm/101-02.html
NASM マニュアル
http://www.bekkoame.ne.jp/~bero/docj/nasm/nasmdoc0.htm
0012デフォルトの名無しさんNGNG
【アセンブラの種類】
○gas=GNUのアセンブラでGCCにがあればついてくる
形式はAT&T型で慣れるまで読みにくい mov A to B
gcc -S hello.c でアセンブラ出力

○MASM
Win32用のアセンブラ。
VCにアドオンとしてもってくるか、MASMの灰色フリーのパッケージがある。
結構使われてたらしい

○NASM
Linuxにもはいってることもある優秀アセンブラ
日本語マニュアルサイトがウレシイ

-----------------
結論 gas最強。
0013デフォルトの名無しさんNGNG
Java / C# / Perl
なども言語自体が仮想CPUになってるので
アセンブラの基本を学ぶことでこれらの造詣が深まること間違いナ死!
0014デフォルトの名無しさんNGNG
>>13
VMで動くって事を言いたいのか?
それなら、Perlは違うだろう。
0015デフォルトの名無しさんNGNG
インタプリタとVMを混同してるのか?
0016デフォルトの名無しさんNGNG
>12
> 形式はAT&T型で慣れるまで読みにくい mov A to B
プロセッサによりけり。MIPS 系だと

inst rd, rs, rt

だし。

gas 使う場合には gas 用マクロプリプロセッサ, gasp も合わせて使うと、幸せに
なれるぞ。
0017」 ■┏┓■L_酉~NGNG
そういえばNASMの日本語サイトの訳はもう少しなんとかならんもんだろうか。
機械翻訳かはしらないけど、一応顔なんだし。

他にわかりやすく解説してるサイトがいるからいい、と言われればそればそ
うなんだけど
0018デフォルトの名無しさんNGNG
アセンブラ
アセンブリ
アセンブル
どれが正しくてどう違うんでつか?。・゚・(ノД`)・゚・。
0019デフォルトの名無しさんNGNG
アセンブリソースをアセンブラでアセンブル
0020デフォルトの名無しさんNGNG
でも最近はアセンブリ言語の事をアセンブラとも言うそうで
0021デフォルトの名無しさんNGNG
石って何?
0022デフォルトの名無しさんNGNG
高水準言語に置けるコンパイラと
低水準言語に置けるアセンブラと
同じ関係である。
時としてアセンブリ言語をアセンブラと
呼ぶこともある。
0023デフォルトの名無しさんNGNG
↑で良いんだっけ?
0024デフォルトの名無しさんNGNG
>23
良い。っつか、品詞考えれば明白だと思うが。

アセンブラ 名詞
アセンブリ 形容詞
アセンブル 動詞
0025デフォルトの名無しさんNGNG
カタカナ英語で品詞も糞も・・・
0026デフォルトの名無しさんNGNG
間違った用法でもある程度の馬鹿が使えば
辞書でも正当な用法として評価されたりする
馬鹿が新語や新用法をつくっていく
実際現在の言葉も誤用から生まれた物が腐るほどある
0027デフォルトの名無しさんNGNG
>>26
それが文化の真髄だと思われ
フォーマルなものでなく、自由の元にうまれんだよ
0028デフォルトの名無しさんNGNG
まあ言い易いように言い易いように進化してくのが一番なのさヽ(´ー`)ノ
0029デフォルトの名無しさんNGNG
>27
語る前に、言語の変遷を勉強しましょうよ…
0030デフォルトの名無しさんNGNG
なんで文化の真髄になるんだらう
0031デフォルトの名無しさんNGNG
豹変するなんて使うと悪い意味でとられるし
全然あるとか肯定すると言葉遣いが間違ってるとか言われる
このあたり既に意味が変わったり用法がなくなりつつある
「ふんいき」は「ふいんき」布団を「しく」は布団を「ひく」とか
かなり一般的に誤用されている
平安時代と今で同じ言葉を使っているわけもなく
言葉はこうして変化していくものだが
個人的にはあまり誤用の多い馬鹿には近づきたくないな
0032デフォルトの名無しさんNGNG
Windows2000はOS自体にSSE命令を使ったAPIとか組み込んでないですよね?
SPxとかでかっに組み込まれてるのかもしれませんが
となるとSSEの機能を生かすにはアプリに組み込むしかないんですよね。
0033デフォルトの名無しさんNGNG
アセンブレ
アセンブロ

これらは命令形。
0034デフォルトの名無しさんNGNG
馬鹿もここまでいくと手におえんな…。
0035デフォルトの名無しさんNGNG
>>32
どこまでをOS自体のAPIと言うつもりか知らんが、
Directなんちゃらとかサウンド/ビデオコーデックに既に使われとるんじゃないか?

そんなことに関係なくアプリで勝手につかわにゃ生かせないのは同じだがな。
アプリがやりたいことが全部APIに有るわけでもないし。
0036デフォルトの名無しさんNGNG
>>35
それでは明示的にVC6(アセンブラパック適用済)でSSE/SSE2を使うには
インラインアセンブラで書くしかないですよね?
VCがオブジェクトコードとしてSIMD命令やMMXを吐くか?っていうのが聞きたいです。
0037デフォルトの名無しさんNGNG
>>36
コンパイラオプションにそういう指定ないの?
なけりゃ吐かないと思う。
0038デフォルトの名無しさんNGNG
>>36
組み込み関数やインラインアセンブラで明示的に使用しない限り吐かない
SIMD命令を吐くコンパイラはVectorC{PC}しか知らない
いずれにせよスレ違い
0039デフォルトの名無しさんNGNG
ICC の最新版でも吐けるようになったらしいけど
0040デフォルトの名無しさんNGNG
アセンブラァ! - ゴルァの親戚
0041デフォルトの名無しさんNGNG
アセンブレ 鳩サブレの親戚 機械語の味がする
0042デフォルトの名無しさんNGNG
>>40
>>41
( ´_ゝ`)
0043デフォルトの名無しさんNGNG
C++のコードをアセンブラで出力したら(g++&cl)
わけわかめで笑うしかないんですけど、、、、
なぜこんな複雑なんですか?
0044デフォルトの名無しさんNGNG
>>43
ビヒャ〜ンに聞いとくれ。
0045デフォルトの名無しさんNGNG
「はじめて読む8086」買ったけどDUMPすらできない。

探してみたら任意のメモリ間のバイナリ?を表示するのはあったんですけど
本みたいに特定の実行ファイルをDUMPするのはないんですかね。


0046デフォルトの名無しさんNGNG
>>45
こんなツールを使えば?
ttp://www.nx.sakura.ne.jp/~elysium/software/pwtr/

ダンプのソースが欲しいなら
http://pc3.2ch.net/test/read.cgi/tech/1009080085/166-168
0047デフォルトの名無しさんNGNG
gasどこで勉強しましたか?
0048デフォルトの名無しさんNGNG
>>45
DUMP ファイル名 |MORE
でダメ!?
004945NGNG
>>46
使ってみますた。(・∀・)イイですね。
個人的には開始時の女の子の絵が無ければなおいい(w
005045NGNG
>>48
できました。こっちのほうが好きかも。
005132NGNG
どうもWindows2000.SP3/KERNEL32.DLに
SSE/mmxはくみこまれてるっぽいです

$ objdump -d KERNEL32.DLL |grep mm
77e54958: 0f 10 11 movups (%ecx),%xmm2
77e91c92: 0f e9 77 0d psubsw 0xd(%edi),%mm6

ただobjdumpがちゃんと逆アセしてるのかは怪しいですが
0052デフォルトの名無しさんNGNG
>>46
その作者、技術はあるんだろうけど何かキャラが濃いんだよね
005346NGNG
紹介する都度、この展開か

やれやれ・ オマエラ ほんとニホンジンだねぇ
0054デフォルトの名無しさんNGNG
http://www.vector.co.jp/soft/dl/win95/util/se137933.html

こっち紹介したらどうなるんだろうな。
0055デフォルトの名無しさんNGNG
>>51
カーネルで使われているのはたぶんこの「ページのゼロフィル/コピー」って奴だとおもう
http://pc.watch.impress.co.jp/docs/article/20011024/xp14.jpg
0056デフォルトの名無しさんNGNG
>>54
その作者、キャラはいいんだけど何か技術が薄いんだよね
0057デフォルトの名無しさんNGNG
>>55
うぉ、情報あるもんですね
できればその絵が使われてるページ教えていただけませんか?
0058デフォルトの名無しさんNGNG
今度新しいマシン買うときは
金もないんでDurunにしようと思うんですが
GCC関連のコンパイルとかx86系の学習を考えるとセレの方がいいですかね?
0059デフォルトの名無しさんNGNG
本文はこれ。
http://pc.watch.impress.co.jp/docs/article/20011024/winxp.htm

>>51は命令でないバイナリを無理矢理逆アセしたものだと思う。
SSEが使われているのはNTOSKRNL.EXEの方。
ページのゼロフィル/コピーぐらいにしか使われてないみたいだから、
ほとんど意味ないと思うけど。
0060デフォルトの名無しさんNGNG
MMX にローテート命令がないのがどうしても納得いかん。
punpcklbw とか変な命令はあるのに。
0061デフォルトの名無しさんNGNG
>>58
Duron はもうフェードしてるぞ。
お得な偽皿 XP1700+ にしる。
0062デフォルトの名無しさんNGNG
VC++ 6.0 にプロセッサパックを入れたら「emms がありません」って警告が出なくなった。
まんせー
006345NGNG
ギコディウスを>>46のツールでDUMPしてたらギコの部分がAAになってたので
そこを書き換えようと思いMS-DOSでDUMPしてたんですが
FFFFより上のアドレスの所はいじれなかったです。エラーになっちゃいます。
これが噂の16bitですか?ヽ(`Д´)ノモルァ
0064デフォルトの名無しさんNGNG
IA32の質問です。

適当なバイトコードから、それに対応するインストラクションセットに変換したいとき、
(要するに低機能なdisassemblerを自分で作りたいわけです)
参考にするための資料を教えてもらえませんか?ネットを探しても見当たらなかったので…
よろしくお願いします。
0065デフォルトの名無しさんNGNG
>>64
http://www.intel.co.jp/jp/developer/design/Pentium4/manuals/index.htm
0066デフォルトの名無しさんNGNG
>>65
thx!
0067386以降よく判らん…NGNG
winのNASMで、

xchg [ebp],al
mov [ebp+1],ah

と書いたら不正終了して

mov ah,[ebp]
mov [ebp],ax

に直したら動いたんだが、プロテクトモードの制限か何か?
0068デフォルトの名無しさんNGNG
>>67
xchg [ebp],al
mov [ebp+1],ah

と

mov ah,[ebp]
mov [ebp],ax

は、やっている事が全然違うような気がするけれど・・・

前者のebpとalになにが入っていて
どんなメモリマップになっているのかは知りませんけれど
念のためbyte ptr〜とかも指定してみては。。
0069デフォルトの名無しさんNGNG
>>67
xchg [ebp],al
mov [ebp+1],ah

と

mov ah,[ebp]
mov [ebp],ax

前者は[ebp]のバイトアドレスに対して
元のaxレジスタの内容が[ebp]、[ebp+1]に入るけれど

後者は結局alの下位バイト分しか入っていないのは・・・よいのかな?
007067NGNG
ありゃ?
xchg [ebp],al
mov [ebp+1],al
だった…
[ebp+1]に[ebp]を移して、alを[ebp]に書き込む処理のつもり。

>68
ちなみにNASMはptr/offsetは無いです。
0071デフォルトの名無しさんNGNG
>>70
こちらはマシン語直打ち環境だけど・・・とくになんの問題もないですねえ。

864500 xchg byte ptr ss:[ebp], al
884501 mov byte ptr ss:[ebp+1], al

8A6500 mov ah, byte ptr ss:[ebp]
66894500 mov word ptr ss:[ebp], ax

デバッガからもコードを追ってみましたが
まったく異常ないです。
0072デフォルトの名無しさんNGNG
>>67=70
nasm CVS 年末あたりの版をVisualC++6.0SP5+ppのC2.DLLでコンパイルして使っているが特に問題なし
バージョンやオプション特有のバグか、nasm自体のコンパイルに失敗しているのでは?

>>71さんの言うとおりプロテクトモードの制限ではないので
007367NGNG
nasmはずいぶん前にバイナリで拾ってきたもので、
今タイムスタンプ見たら99/6/4

…………これか原因はw
0074デフォルトの名無しさんNGNG
http://www.geocities.co.jp/Milano-Killer/1142/sse/sse2.html
0075デフォルトの名無しさんNGNG
X86系でアセンブリソースを最適化できるツールて無いですか?
あったら便利だと思うんですけど…

例1 (コンパイラが良く吐くコード)
sub eax, 1
test eax, eax
jnz short xxx
↓
sub eax, 1
jnz short xxx

例2 (ターゲットにするCPUによって)
xor eax, eax
mov al, bl
↑↓
movzx eax, bl
0076デフォルトの名無しさんNGNG
>>X86系でアセンブリソースを最適化できるツールて無いですか?
それがC/C++コンパイラでしょ?
intelのVTなんたらっていうのとか買うしかないのかな?
コンパイラがあなたが望むアセンブルを出力するとはかぎらないから
アセンブラつかってるんでしょ?
0077デフォルトの名無しさんNGNG
>>75
そういうのを作ったら? 単なる置換ツールと考えたらそう難しくないでしょ

パターンデータをこのスレで募集して皆で育てたりしたら面白いかもね。
0078IP記録実験NGNG
IP記録実験
http://qb.2ch.net/test/read.cgi/accuse/1042013605/

1 名前:ひろゆき ◆3SHRUNYAXA @どうやら管理人 ★ 投稿日:03/01/08 17:13 ID:???
そんなわけで、qbサーバでIPの記録実験をはじめましたー。

27 名前:心得をよく読みましょう 投稿日:03/01/08 17:20 ID:yL/kYdMc
SETTING.TXT管轄でないということは全鯖導入を視野に、か?

38 名前:ひろゆき ◆3SHRUNYAXA 投稿日:03/01/08 17:22 ID:rLfxQ17l
>>27
鋭いです。

73 名前:ひろゆき ◆3SHRUNYAXA 投稿日:03/01/08 17:27 ID:rLfxQ17l
>ところで、IPが抜かれて何か今までと変わることってあるのでしょうか?
・今までより、サーバが重くなる。
・裁判所や警察からの照会があった場合にはIPを提出することがある。
0079デフォルトの名無しさんNGNG
名スレの予感
0080デフォルトの名無しさんNGNG
まあ別にいいんじゃないの?
やりようによっちゃ匿名にはできるわけで、ただちょっと面倒にはなるけど。
ヌー速の糞スレも減るかもしれないし。
ただ誰がログを読めるのかは知っときたいなあ。
0081デフォルトの名無しさんNGNG
だっせ〜フシアナ失敗・・・・
008275NGNG
>>76
>コンパイラがあなたが望むアセンブルを出力するとはかぎらないから
そうなんですが、あれば便利だと思って聞いたんですけど
やっぱり無いのかな

>>77
単純なものなら結構簡単に作れそうなんですが
完全にフラグを追いかけたり、命令順を入れ替えたりする事まで考えると
何処から手を付ければ良いのか分からないんですよね…
0083デフォルトの名無しさんNGNG
削除人はIP表示されない悪寒
0084デフォルトの名無しさんNGNG
メルマガきたけど、IPを保存したとことで何もかわないよ。
IPを保存することで書き込んだ人に
責任を擦り付けられるとでも思ってんのか?
関係無いぜ。
警察の捜査はしやすくなるかもしれんが、公開責任は依然ひろゆき。

いい加減理解しろや。
日本生命の時から言われてるぜ。
判決もこれに沿ったものだったしな。

日本生命
http://www.geocities.co.jp/Technopolis-Mars/6820/hoken/
0085デフォルトの名無しさんNGNG
>>713
キャップはどした?
0086デフォルトの名無しさんNGNG
>>85
ん?
ヅラがどうしたって?
0087デフォルトの名無しさんNGNG
殺人予告でもせん限りIP取られてどうなるもんでもねぇだろ。
0088デフォルトの名無しさんNGNG
>>143
どこの板が取っているの?
0089デフォルトの名無しさんNGNG
ごめん、そんなにおもしろくなかったので寝ます(^_^;)
0090デフォルトの名無しさんNGNG
藪医者ウハウハだな。漏れのIDもだけど。
0091デフォルトの名無しさんNGNG
コピペうざい
0092デフォルトの名無しさんNGNG
>>626
自作PC板も誤爆&宣伝がかなり舞い込んでます
0093デフォルトの名無しさんNGNG
串使ったらええんちゃうんかと・・
って問題じゃないの?
0094デフォルトの名無しさんNGNG


3日で業者のエロいコピペで埋まるのがオチ
0095デフォルトの名無しさんNGNG
>>355
ばいばい
0096デフォルトの名無しさんNGNG
これさいたまだよね?
http://www2.ezbbs.net/19/techside/img/1039679575_1.jpg
0097デフォルトの名無しさんNGNG
      __ )
   γ´γ~   \
   |∞/ 从从) )    __________
   W |  |┬ イ |〃  /
   ヽリ.ハ~ ワノ  <ろりは全員皆殺しだ     | ̄|    \
  | ̄ ̄ ̄ ̄ ̄|〜 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
  ◎ ̄ ̄ ̄ ̄ ̄◎ ころころ〜
0098デフォルトの名無しさんNGNG
内部告発やったら自分がただですむわけナイヨ
0099デフォルトの名無しさんNGNG
煽られたら訴えればいいんだね。。。 
0100デフォルトの名無しさんNGNG
======2==C==H======================================================

         2ちゃんねるのお勧めな話題と
     ネットでの面白い出来事を配送したいと思ってます。。。

===============================読者数: 139038人 発行日:2003/1/10

なにやら、連日メルマガだしてるひろゆきです。

そんなわけで、ログ記録実験ですが、いちいちサーバ指定するのが面倒なので、
全部のサーバに入れてみました。

重くなって落ちたりしてもご愛嬌ってことで。。。

んじゃ!

────────────────────────Age2ch─
■この書き込みは、Age2chを使って配信されています。
────────────────────────────
Keep your thread alive !
http://pc3.2ch.net/test/read.cgi/software/1041952901/l50
────────────────────────────
0101デフォルトの名無しさんNGNG
でもなー訴えるって事は名前ださにゃならんわけで
どう考えても奴らに分があるというか
最終的に骨を断たれるというか
0102デフォルトの名無しさんNGNG
(^^)
0103デフォルトの名無しさんNGNG
そうそうこれからあんぐらはnyBBSで
はっきりいってまだ実用レベルとは言い難いが(^^;
0104デフォルトの名無しさんNGNG
やろうマルチ・・・
0105デフォルトの名無しさんNGNG
はどこで叩かれた有名人さんだろう?
0106デフォルトの名無しさんNGNG
半角系板では、業者が書き込むとリモホが表示させられてるみたい
0107デフォルトの名無しさんNGNG
【無料】みんなでお揃いのユニフォーム【祭り】
http://life2.2ch.net/test/read.cgi/offevent/1042037013/

みんなで2ちゃんユニフォームを作ってワショーイしよう!
同じカッコしたちゃねらーで街を埋め尽くそう!

ユニフォーム代はなんと無料です!
↓ここを利用します。
http://www.getuniform.com/

0108デフォルトの名無しさんNGNG
肛門から心臓が飛び出そうなくらい怖いです(^_^;)
0109デフォルトの名無しさんNGNG
保守age

最近荒らしが酷い
0110デフォルトの名無しさんNGNG
>>109
荒らしというより、スクリプトのバグでは?IP実験を始めた途端に他のスレの
書き込みがPC板全般に流れてきてるみたい。
0111デフォルトの名無しさんNGNG
>>110
そうなん?そうなら良いが。
0112デフォルトの名無しさんNGNG
お前ら、年がバレます
0113デフォルトの名無しさんNGNG
2002年2ちゃんねるアニメランキング1位のアニメに・・・・

モナーが出演決定!!!!!!!!!!!!!!!!!!!!!

<<放送時間>>
1/12
大阪 テレビ大阪 (日)9:30〜10:00
東京 テレビ東京 (日)9:30〜10:00
名古屋 テレビ愛知 (日)9:30〜10:00
福岡 TVQ九州放送 (日)9:30〜10:00
札幌 テレビ北海道 (日)9:30〜10:00
岡山・高松 テレビせとうち (日)9:30〜10:00 
0114デフォルトの名無しさんNGNG
前スレ上げちまったから
こっち上げるぞ。
0115C++厨NGNG
>>113
ギャラクシーエンジェルに出たのか?
寝てて見なかったけど
0116デフォルトの名無しさんNGNG
>>75
> X86系でアセンブリソースを最適化できるツールて無いですか?

まずないだろうね。

コンパイラが吐くコードを最適化するのは、結局コンパイラが変わったらだめになるし、最近のコンパイラは結構まともなコードを吐くからね。

人間が作成したコードを最適化できるとすばらしいけど、そんな余地はあんまりないだろうからね。
(余地がいっぱいあるぐらいなら、アセンブラなんか使わんだろうし。)
0117デフォルトの名無しさんNGNG
皇太子様のAAが好きだから。
0118デフォルトの名無しさんNGNG
はい。トリップやめました。。(オレも で間違えた・・・)
 # ちと煽り過ぎたかなとも反省。

で、質問。
今後起こりうる裁判と切り分ける部分って具体的にはどのヘンなのでしょうか?

0119デフォルトの名無しさんNGNG
くすぐり攻撃。

まぁ 火曜日までには、
0120デフォルトの名無しさんNGNG
>>115
出てないよ。
というか、その荒らしにはもう辟易...。
0121デフォルトの名無しさんNGNG
久しぶりに「はじませ」読んだけど
V-syncとれとか、割り込みコントローラいじれとか
ゲーム作れと言わんばかりの内容なのな。

俺の読み方が偏ってるせいもあるかもしらんけど
0122DDKインストールできなかった( -.-)NGNG
DDKインストールできませんでした。
プッププップ、ビープ音が鳴って...
MS社に嫌われた。
0123デフォルトの名無しさんNGNG
DDKくらはい
0124DDKインストールできなかった( -.-)NGNG
DDKネット上にありました
0125デフォルトの名無しさんNGNG
まじすか
MSからは落とせなくなってるんでし
0126DDKインストールできなかった( -.-)NGNG
最新のはDownloadできないですけど、2000,Me,98はOKです。
ttp://www.microsoft.com/ddk/
のぺーじの
ttp://www.microsoft.com/ddk/W2kDDK.asp
のあたり。
インストールできたらおしえてちょ。
0127山崎渉NGNG
(^^)
0128DDKインストールできなかった( -.-)NGNG
DDK別のマシン(シングルCPU)にインストールしたらできました。
どうも、私のデュアルマシンは駄目なようです。
0129デフォルトの名無しさんNGNG
http://www.geocities.co.jp/SiliconValley-Cupertino/5873/special/index.html
0130山崎渉NGNG
(^^)
0131デフォルトの名無しさんNGNG
皆は今どんなアセンブラ使ってるんすか?
NASM一択なの?
0132デフォルトの名無しさんNGNG
>>131 WindowsならDelphiのインラインアセンブラが一番だな
0133デフォルトの名無しさんNGNG
なに、デルピーってインラインアセンブラも使えたのか。
俺は VC++6.0 のインラインアセンブラだyo
0134デフォルトの名無しさんNGNG
Delphiの便利なのはインラインというかアセンブラ手続きというのを作れる事
で、Cみたいに可搬性を考えなくていいから、最初の引数はEAXで次はEDX
と決まってるし(もちろん cdecl にすればスタックフレームも使える)

Delphiで書いてDLL作れば他からも呼べて、ホンモノのアセンブラより
そこらへんは楽

0135デフォルトの名無しさんNGNG
( ´Д`)/ <16ビット版のNASMをいぢくってたんですが
スタックが最低40byteないとバグるっぽいです。
スタックを使わない小さなプログラムでもこれ以下だと暴走するっす。
以上、報告終わり。
0136デフォルトの名無しさんNGNG
>>131
GNU as + gasp
必要に応じて、その上に gcc とか vcl が被る。
0137デフォルトの名無しさんNGNG
>>131
32ビットならNWSA
16ビットならLSICに付属のやつ(正式名は何なのだろうか)
0138デフォルトの名無しさんNGNG
R86 だったか?
漏れは MASM だが。
0139デフォルトの名無しさんNGNG
>>131
昔 wasm + Watcom C/C++
今 Digital Mars C/C++ のインラインアセンブラ
0140デフォルトの名無しさんNGNG
SSE2を使ってプログラムの勉強をしているのですが、MOVSDで下位64ビット
に倍精度浮動小数点が渡るんですよね。それで、CMPSDを使って比較をした
後、結果の使い方がわかりません。

結果はディスティネーション・オペランドの下位64ビットに返るわけですが、
それを使って分岐させる方法がわからないのです。
どなたか御指南くださいませ。
0141デフォルトの名無しさんNGNG
掛け算して足し算するんでは?
0142デフォルトの名無しさんNGNG
>>141
xmmレジスタに戻ってきた値にかけ算して足し算するという事でしょうか?
0143デフォルトの名無しさんNGNG
MMXの頃の知識だからどうだかあやしいけど、
計算結果が二通りあって、それらをある条件で切り替える場合、

・条件の値を0 or 1に変換する
・二通りとも計算する(SIMDの並列性を生かせるとgood)
最後に
 (条件値) * (結果1) + (1-条件値) * (結果2)
を計算すると、望みの結果が得られるという話。

条件値を0 or -1(0xffffffff)にして、
掛け算をbit-andに、足し算をbit-orにするという方法もあるよん。

SSE2見てないからよくわからんが、MMXのころはこうだった。
0144デフォルトの名無しさんNGNG
>>143
なるほど、ありがとうございます。やってみます。
0145デフォルトの名無しさんNGNG
>>140
普通の分岐をしたいのであれば
CMPSDではなくCOMISDを使うとかそういうことではなくって??
0146デフォルトの名無しさんNGNG
>>145
そうです!この命令を探していました。ありがとうございます。
COMISDというのか。SSE2命令はどうもニーモニックが紛らわしくて。
0147デフォルトの名無しさんNGNG
実際、機械語はどのようになっているんですか?
思うに、XXX.exeが作成されるとAPIコールするという
命令?が羅列されているのでしょうか?
また、DLLを参照するようなプログラムはDLL参照命令があると想像します
ちなみにネイティブコードとはCPUに依存するというよりOSに依存するという意味で正しいですよね?
0148デフォルトの名無しさんNGNG
>>147
プログラミング暦をちょっと語ってみ。
0149デフォルトの名無しさんNGNG
>>147
書店に行って Linkers & Loader 買ってきて読め。もし読んでも意味が分からないなら、
その前に勉強することがあるってコトだ。
0150デフォルトの名無しさんNGNG
>>148
学生でホビーでプログラムを楽しんでます^^;
まともなプログラムはつくったことがありません><

オープン系といいますか制御、ネット、WEB、DB系のプログラムを
ちょこっとだけ組んでます、、
C言語MASMで組み込んでやったのですがいまいち理解できません
なんでも少しだけかじってます
0151147NGNG
>>149
英語で書いてなかったらがんばってみます
かなり古いのでしょうか、大きな書店にあるか見てみます
0152デフォルトの名無しさんNGNG
>>150
>>147は、ほぼ全面的に間違えています
1から出直しましょう
0153147NGNG
ほぼでよかった
もしよかったら専門用語でもよいので2,3行で教えてください
0154デフォルトの名無しさんNGNG
とりあえずどれかOS一つ決めて、とことん調べてみては?
0155147NGNG
そのようなことを調べるのに資料が多いのはどのOSでしょうか?
0156デフォルトの名無しさんNGNG
>>155
DOSやUNIX系
0157デフォルトの名無しさんNGNG
今なら日本語リソースが多くて、実物がすぐに使えるLinuxかなあ。

DLLについてはWindowsのほうがスッキリしているかもしれない...
0158147NGNG
BSDで調べるとしてどの項目から調べるのがよいですか?
タスク制御?
ヒントをきぼん
一応OSの概要を理解しているつもりだったんだけど
だれかリヌのカーネル程度を組めるひといるんだろうか?
0159147NGNG
あーというかOSを調べてほんとにたどりつくのか?
コンパイラを調べたほうがいいのかな?

スタティックリンクしてるときはどーしても相対アドレスにCPUが理解できる
命令がはいっているとしか思えない
DLLリンクは特定のシステムコールエリアを利用しているとしか思えない

ほんとに全然ちがう?
0160デフォルトの名無しさんNGNG
調べれば分かる程度のことを説明するお人よしは
あんまりいないと思う
0161デフォルトの名無しさんNGNG
>>157
しかし「充実したドキュメント」とやらら信用できるかというと、イマイチ…

個人的には man page の section 9 が充実してる NetBSD を推すが、147 は
それ以前に MINIX 本でも読んだ方が良いと思われ。タネンバウム先生の
「オペレーティングシステム」って本な。
0162157NGNG
うひゃあ、予想通りBSD厨登場ッ
0163デフォルトの名無しさんNGNG
>>162
分かりやすい煽りだな(w
0164デフォルトの名無しさんNGNG
自作のアセンブラを作ってみたいと思っているんですけど、
参考にするソースは何が良いですか?やっぱりNASMのソースコード?
0165デフォルトの名無しさんNGNG
>>164
まづは、四則演算をさせらる所からどうぞ
字句解析->構文解析->ラベル解決->配置 みたいな流れを意識しておいた方がいいよ
0166山崎渉NGNG
(^^)
0167デフォルトの名無しさんNGNG
他のプロセスを実行する時、レジスタの内容退避しますよね?
デバッグレジスタの内容も退避しますか?
0168デフォルトの名無しさんNGNG
>>167
まっとうなマルチタスクOSなら。
i386系でのFPUレジスタの退避はちと違う。
0169デフォルトの名無しさんNGNG
あるプロセスをデバッグ中に他のプロセスが止まったらこまります
0170にゃんNGNG
「はじめて読むMASM」って本を買ってきたのですが MASM はどうやったら
手に入れられるんでしょう?
0171デフォルトの名無しさんNGNG
MASMは商品なので買うことになります。
フリーのアセンブラで互換性の高いのなんかあったよね。
0172デフォルトの名無しさんNGNG
とりあえず一通りそろってるやつなら
ttp://www.movsd.com/

でもこれ
> The assembler, linker and some other binary file are the property of
> the Microsoft Corporation and are supplied under the conditions of
> the (EULA) End User Licence Agreements for both the WIN98DDK
> and the PLATFORMSDK.
なんて書いてあるけど、大丈夫なのかな?
0173デフォルトの名無しさんNGNG
>>172
EndUserライセンスと再配布ライセンスを混同した屁理屈

DDKのLICENSE.TXTにサンプルコード以外の扱いが書いていなかったので
都合のいいように解釈して配布しているもよう

大丈夫か否かはマイクロソフトの意向次第だが
敢えてほとんど黒な灰色のものを使う意義は感じられない

0174173NGNG
と思っていたが読み返してみたところ
98DDKの場合10copiesライセンスなのでやっぱり駄目らしい
0175にゃんNGNG
どっちにしろプロ向けみたいです。DOS用プリーズ。

MASM32 is not intended as a programming beginners package,
it is squarely aimed at experienced programmers who are
familiar with windows API programming with compilers and
have done some work in assembler. The package assumes that
the programmer already knows enough to start working in
assembler and is designed with this level in mind. Any
programmer is welcome to use MASM32 but unless they have
the experience level that is assumed in the design of MASM32,
concepts like register sizes to data types, register usage,
assembler mnemonics, API calls, calling conventions and other
similar technical data will be very difficult to grasp.
Programming beginners are better served by learning a higher
level language first and when they are familiar enough with
the technical concepts involved, they can come back to
assembler later.
0176にゃんNGNG
プリーズあげ。
0177デフォルトの名無しさんNGNG
VCP6Processor Packにはいってるのでは
0178デフォルトの名無しさんNGNG
DOS用なら Arrowsoft Assembler なんてどうよ。
# 使ったことないけど MASM互換って書いてあるし。
ttp://hp.vector.co.jp/authors/VA007890/dos/language.html

そういえば OpenWatcom に付属のwasmもMASM互換だったはず。
これなら 16bit DOS から Win32 までM$系は一通り対応している。
コマンドラインの文法にかなり癖があるのが難点だが。
0179デフォルトの名無しさんNGNG
masm.exe index とかで検索すりゃみつかるじゃん

0180デフォルトの名無しさんNGNG
>170
あったでー、互換アセンブラ
http://www.vector.co.jp/soft/win95/prog/se183316.html?y
0181デフォルトの名無しさんNGNG
>>180
それはWindows用

今ならやっぱりOpenWatcomかな
http://www.openwatcom.org/
0182デフォルトの名無しさんNGNG
韓国に、masm5.x が落ちている罠。
0183デフォルトの名無しさんNGNG
日立汎用機Mシリーズのアセンブラについて詳しい書籍はありませんか?
0184デフォルトの名無しさんNGNG
メモリ間コピー専用の 32 バイトのレジスタがあったらうれしいですか?
汎用レジスタとの値の交換や演算は一切できません
0185デフォルトの名無しさんNGNG
というか、汎用レジスタがもっと増えてくれればそれで十分。
64ビット系ではR8〜R15なるレジスタが増えてるラスィので、
早くそれが普通に使える時代になってホスィ。
0186デフォルトの名無しさんNGNG
>>184
それぐらいなら、CPU と非同期に動く DMA 使った方が。
0187デフォルトの名無しさんNGNG
>>183
青マニュアル。
0188183NGNG
>>187
なんですかそれは?
やっぱり一般の書店では入手不可能なんでしょうかねえ。
0189デフォルトの名無しさんNGNG
>>188
まあ、Mシリーズ (今は、MPxxxx か...) がそこら辺のヤ○ダ電気とかじゃ売ってないからね。
今からMシリーズ買うんなら、日立の営業に電話して「Mシリーズ買うから青マニュアルちょうだい」と言えば OK
どっかにある、Mシリーズ使うなら、そこの運用管理担当者に聞いてみな。
0190183NGNG
>>190
職場の倉庫みたいなところを探せばMシリーズの機械命令のマニュアルとかあると思うんですけど、
一人で占有するわけにも行かないので、手軽に入門的なことだけでも分かる本があればいいと思ったんです。
営業に電話するって、汎用機のマニュアルなんて個人で入手できるんですか?
0191デフォルトの名無しさんNGNG
SH4の命令で次のようなループをアセンブラで書くときどうすればいいの?

for(i=0,SUM=0;i<N;i++)
SUM=SUM+A[i]*B[i];
0192デフォルトの名無しさんNGNG
>>191
gcc とかで出力見れば?
0193デフォルトの名無しさんNGNG
>>192
切れ味のいいエレガントな回答にちょっと萌えた。
0194デフォルトの名無しさんNGNG
アセンブラ(nasm)でdll作成に挑戦してます。

segment _TEXT use32 public class=CODE align=4096

global ADD1

ADD1:
 add eax, edx
 ret

export ADD1

..start:
global DllEntryPoint
DllEntryPoint:
 mov eax, 1
 ret 12

>nasmw -fobj dll_test.nas

は問題ないのですが

>ilink32 /Tpd dll_test, dll_test.dll
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
Fatal: Error detected (IMP829)
Fatal:
Warning: インクリメンタル リンクできません。リンクをやり直します
Fatal: Error detected (IMP829)
Fatal:

なんでー?
(ALINKを用いると普通にdllができたので、ますます何が悪いのかわかりません)
0195194NGNG
誰か疑問を解いてーage
0196デフォルトの名無しさんNGNG
教えて君ですみませんが。

cpl = 0 -> cpl 3の切り替えをiretlでやろうと思って、

stackframe : %esp -> %eip
%cs
%eflags
%esp
%ss

これをbochs上でやると
00003160446i[CPU ] | SEG sltr(index|ti|rpl) base limit G D
00003160446i[CPU ] | DS:002b( 0005| 0| 3) 00000000 000fffff 1 1
00003160446i[CPU ] | ES:002b( 0005| 0| 3) 00000000 000fffff 1 1
00003160446i[CPU ] | FS:002b( 0005| 0| 3) 00000000 000fffff 1 1
00003160446i[CPU ] | GS:002b( 0005| 0| 3) 00000000 000fffff 1 1
00003160446i[CPU ] | SS:002b( 0005| 0| 3) 00000000 000fffff 1 1
00003160446i[CPU ] | CS:0023( 0004| 0| 3) 00000000 000fffff 1 1
00003160446i[CPU ] | EIP=00100404 (00100404)
00003160446i[CPU ] | CR0=0x00000011 CR1=0x00000000 CR2=0x00000000
00003160446i[CPU ] | CR3=0x00000000 CR4=0x00000000
00003160446i[CPU ] -----------------------------------
00003160446p[CPU ] >>PANIC<< exception(): 3rd (10) exception with no resolution

こんな感じで止まります。
ちなみに割り込みから呼び出してるわけではありません。

参考となる情報があったら教えてください。
0197デフォルトの名無しさんNGNG
誰か疑問を解いてーage
0198デフォルトの名無しさんNGNG
>>194
exportは使い方が特殊なので
defファイルで指定したほうが簡単です

>>196
Gフラグが立っているので問題ないのかもしれませんが
一見した所、eipがcsのlimitを越えているように見えます
0199デフォルトの名無しさんNGNG
>>198
すいませんでした、ちょっと離れていたので。

このプログラム、a20を有効にした後、1Mbyte以上の領域に転送してから、
しばらくcpl0で実行した後なんですが、
いきなりリミットの制限にひっかかることもあるのでしょうか。

もちろん記述子はcpl0用のと変わらずに、
リミットはフラットモデルに従っていて、dplが違うだけです。
0200198NGNG
>>196
あとalign=4096は標準OMFでは不正です。

>>199
bochsのlimit表記000fffffがGフラグ適用前の素の値なら問題ありません
0201194NGNG
>>198, 200
ありがとうございます。.defファイルを書くことで成功しました。

ilink32は、align=4096を理解してくれるようです。
でも、おっしゃる通りnasmのドキュメントに4096は拡張と書いてあったので、今後256を使います。

しかし今度はALINKでリンクできない…(苦笑)…ソースを共通にすることは無理か…。

不思議なのは、Cで__declspec(dllexport)のように書いて、-Sでアセンブリソースを出力させてみると
その中でエクスポートしている=エクスポート情報が.objに埋めこまれている、ように見えることです。

ALINKがnasmと相性がいいように、ilink32はTASMと相性がいいのかな。
0202Leliel(れりえる)NGNG
NASMについてお聞きしたいのですが、NASMの展開先とPATH(AUTOEXEC.BAT)設定を以下のようにしても
問題ないでしょうか?
この手のソフトで、パス内にスペースがあると正常動作しないものもあると聞いたもので...

展開先 : C:\Program Files\NASM
PATH(AUTOEXEC.BAT) : C:\Program Files\NASM

すいませんが、何方かご教授お願いします。
0203デフォルトの名無しさんNGNG
SSE2のパック加算命令で
adc命令のようにキャリー分を足してくれる命令ってないんだ?
使えねー
0204デフォルトの名無しさんNGNG
>>202
NASMは知らんが普通
"C:\Program Files\NASM"
とするもんじゃないかな。
0205デフォルトの名無しさんNGNG
PATH 設定時は C:\PROGRA~1\NASM じゃないかのう
0206デフォルトの名無しさんNGNG
そもそもnasmはnasmw.exeのみで完結しているから無関係だろう
多分
0207Leliel(れりえる)NGNG
>>204-206さんレスどうもです。
とりあえずやってみますね。
0208デフォルトの名無しさんNGNG
直線描画関数をアセンブラで作れ ゴラァ
0209デフォルトの名無しさんNGNG
drawline:
pusha
mov dx, line
mov ah, 09h
int 21h
popa
ret
line: db '----$'
0210デフォルトの名無しさんNGNG
push 0
push y1
push x1
push hdc
call dword ptr MoveToEx
push y2
push x2
push hdc
call dword ptr LineTo
add esp, 4 * 7
ret
0211デフォルトの名無しさんNGNG
アセンブラと関係なくてごめんなさい。

ある整数を、4の倍数に切り上げたい。
しかも、元との差分を最も小さくしたい。

これを早く計算したい時は
どうすればいいですか?

自分は
int x; // <- target
// as follows...
x *= 3;
x += (4 - (x & 03)) & 03;
と書いたのですが…
0212デフォルトの名無しさんNGNG
>>211
まちがえました(x *= 3のところはなし)
こう書きました

int x; // <- target
// as follows...
x += (4 - (x & 03)) & 03;
0213デフォルトの名無しさんNGNG
x = (x + 3) & ~3;
最速という保証は全く無し

0214デフォルトの名無しさんNGNG
コンパイラによる
そんなときこそアセンブラを・・
0215デフォルトの名無しさんNGNG
> ある整数を、4の倍数に切り上げたい。
> しかも、元との差分を最も小さくしたい。

そりゃ切り上げじゃなくて四捨五入?なんでは
0216デフォルトの名無しさんNGNG
>>215 四捨五入ではないだろ。
0217デフォルトの名無しさんNGNG
4を法とする整数のceil()の実装の問題。
0218デフォルトの名無しさんNGNG
x = (x+2) & ~3
0219デフォルトの名無しさんNGNG
>>218
それは一捨二入
0220デフォルトの名無しさんNGNG
>>219
>>211がやりたいのはそれに見えるが・・・
0221デフォルトの名無しさんNGNG
ここは、アルゴリズムスレでしか?
0222デフォルトの名無しさんNGNG
日本語解読スレです
0223デフォルトの名無しさんNGNG
>>220
>>211の式ではx=1の時の結果は4ではないかい?

> しかも、元との差分を最も小さくしたい。
これが意味不明だが、1を8や12にするなという事かな
0224デフォルトの名無しさんNGNG
よーするに、四捨五入ではなくて、メモリアドレスかなんかを
4 バイト境界に合わせたりしたいんだろ?
0225デフォルトの名無しさんNGNG
「差分を最も小さくする」というのを解釈すると
0→0
1→0
2→4
3→4
になりそうな気がする(これは>>218の式)
0226デフォルトの名無しさんNGNG
>225
でもそれでは”切り上げて”いる事にはならない。
0227デフォルトの名無しさんNGNG
>>225
俺もそれであってると思う
0228デフォルトの名無しさんNGNG
>>222
ワラタ
0229デフォルトの名無しさんNGNG
メモリアドレスの境界合せがしたいなら、切り上げでないとおかしい。
0230デフォルトの名無しさんNGNG
え、逆だろ
0231デフォルトの名無しさんNGNG
>>211-230
曖昧な仕様に翻弄されてる典型。
0232デフォルトの名無しさんNGNG
逆じゃねー
0233デフォルトの名無しさんNGNG
あの〜、VC++6.0のプロセッサパックどこでダウンロード出来るでしょうか?
前までMSのサイトで見つかったんですけど…。
今見つからないんです、教えてください。
0234211NGNG
すごいことになってる…
日本語へんですみませんでした

>>213
>x = (x + 3) & ~3;
これ、いいですね
さっそく使わせていただきます

>>214
>コンパイラによる
>そんなときこそアセンブラを・・
ちなみにアセンブラだと
どうなるのでしょうか?

>>218
>x = (x+2) & ~3
これ、213と違うのですがなぜですか?

>>221,>>222
>ここは、アルゴリズムスレでしか?
>日本語解読スレです
すみません…
0235211NGNG
>>223
>これが意味不明だが、1を8や12にするなという事かな
はいそうです
つまり、もし増えるとしたら+1/+2/+3の
どれかにしたかったのです

>>224
>よーするに、四捨五入ではなくて、メモリアドレスかなんかを
>4 バイト境界に合わせたりしたいんだろ?
はいそうです
ビットマップです

>>226
>でもそれでは”切り上げて”いる事にはならない。
”切り上げて”にはゼロは含まれていなかったんですね
以下とか未満みたいに難しいです
ごめんなさい…

>>231
>曖昧な仕様に翻弄されてる典型。
ほんとにすみません…
0236デフォルトの名無しさんNGNG
>>234 214じゃないけど、例えばER6にある番地がある時、(H8の命令だと)
inc.l ER6
inc.l ER6 ;この3行はmov.l #3,ER5、addl.ER5,ER6より小さく速い
inc.l ER6
and.b #4,R6L  で済む。
cで213の展開型は
mov.b #3,R5L
extu.w R5
exts.l ER5
add.l ER5,ER6
add.l #1,ER5
and.l ER5,ER6  この辺がコンパイラが出せる最小の命令です
0237デフォルトの名無しさんNGNG
and.b #-4,R6L でしょ?

0238デフォルトの名無しさんNGNG
あ、ありがと、そのつもりでした。maskはちゃんとHexで書かないといかん(^^;
0239211NGNG
>>236
アセンブラってよくわかんないけど…

incってincrement?

andってビットのアンド?
後についた.bってもしかしてbitのこと?
ファイルの拡張子(.exeとか)みたいだ

いかにも3足してマスクみたいだ…

extu.wとかextsとかがある下の方は
さっぱりわからんです

>>234
>ちなみにアセンブラだと
>どうなるのでしょうか?
興味本位で聞いたのですが…
興味だけで聞いてもやっぱり
アセンブラはよくわからない

みなさんすごいですね
0240211NGNG
>>236
>inc.l ER6
>inc.l ER6 ;この3行はmov.l #3,ER5、addl.ER5,ER6より小さく速い
>inc.l ER6

これって
x += 3;
より
++x;
++x;
++x;
の方がはやいということ?
なんか意外だ…
0241デフォルトの名無しさんNGNG
>>240
236のはH8では、ということなので、他のCPUでは
そうとは限らない。
0242デフォルトの名無しさんNGNG
アドレス値のシフトや論理積を求めることってどんなことに役立つのでしょ?
いまいちその効力が分からないのですが、、、
0243デフォルトの名無しさんNGNG
論理積はアラインメントのときに使うだらふ
シフトをすることなんかあるのくわ?
0244デフォルトの名無しさんNGNG
座標値をシフトしてアドレスを出す場合が
あるのでは
0245デフォルトの名無しさんNGNG
アドレス値を何かのインデックスとして使う場合もあると思う
0246デフォルトの名無しさんNGNG
データレジスタとアドレスレジスタが分かれている680x0で
アドレスレジスタに対して直接演算する命令がadda, subaしかないのも、
アドレス値に対して加減算以外の演算をすることはまずないだろうと
いうことなのでは。
0247デフォルトの名無しさんNGNG
石器時代のCPUの命令セットを持ち出されても・・・
0248デフォルトの名無しさんNGNG
以前、SH-3のELFのリロケータブルファイルを展開するときに、
各セクションを配置する際にアラインメントを指定通りにしてあげ
ないといけないので、それでやったぐらいかな・・
0249デフォルトの名無しさんNGNG
>>246
leaも加減算に使えるぞw
0250デフォルトの名無しさんNGNG
>>245
それは例えば、上位10ビットをインデックスのように
使うということでしょうか?それに対する加減算する
ために、アドレスをシフトするというか。。。
0251デフォルトの名無しさんNGNG
>>250
上位というか、どこか一部分だろうねえ。
0252デフォルトの名無しさんNGNG
前スレ
ttp://pc3.2ch.net/tech/kako/1016/10169/1016991911.html
0253デフォルトの名無しさんNGNG
質問です。C言語で、

struct a {
   int i
   char c
} v;

という構造体があって、

v->i = 4660 //0x1234
v->c = 'm' //0x6d

などという処理をする場合、一般にアセンブリ言語ではどのように記述するのでしょうか?

#最近高級言語のソースを見てると、内部的にどうなっているのかが気になってしょうがない・・・。もしかして毒されてる?
0254253NGNG
v->i = 4660; //0x1234
v->c = 'm'; //0x6d

(´・ω・`)でした。
0255デフォルトの名無しさんNGNG
>253
構造体のメンバアクセスはベースレジスタ+インデックス指定
でいいんじゃないかな。
0256253NGNG
>>255
レスありがとう。
例えば二次元配列では、「ベースポインタ+(行サイズ*行添え字)+列添え字」
でそれぞれを引数として渡してやれば、要素のアドレスが得られると思うんですけど
構造体は各々の要素サイズが不定じゃないですか。
要素サイズをどこかに格納しておかなければならないのかな?
0257デフォルトの名無しさんNGNG
>256
構造体の先頭から各要素のアドレスへのオフセットを
「定数」として定義すればよいです。
0258253NGNG
>>257
おお!何かが見えてきた気がする。
コンパイラの本なんかも読んでみようと思います。
ありがとうございました。
0259デフォルトの名無しさんNGNG
スタックの構造ってどうなってるの?
STLのスタックみたいな感じと思って(・∀・)イイ?
0260デフォルトの名無しさんNGNG
>259
LIFO型のバッファなので概念的には似てるけど、中身は当然別物。
スタック領域とpush, pop時に使用するスタックポインタがあるだけなので、
push, pop以外にランダムアクセスだってできる。

また、データの一時的バッファとして使用される以外に、
サブルーチンコールの際の戻り先アドレスや引数を格納したり、
自動変数領域として使われたりもする。
0261デフォルトの名無しさんNGNG
axをal,ahに分けて使う場合は一つ8bitになるので
使える値も0〜255ということになりますか?
0262デフォルトの名無しさんNGNG
intの割り算とcharの割り算に
処理速度の差はありますか?

それから以下のコードで
**Error** div2.ASM(32) Operand types do not match
が出るのですが…どうしてですか?
0263262NGNG
>>262
#include <iostream>

template<typename T>
inline int f(T t) { return static_cast<int>(t); }

template<>
inline int f(int t) { return t; }

int main()
{
  typedef char NumType;
  volatile NumType x = 17;
  volatile NumType y = 5;
  NumType q, r;

  _asm {
    xor edx, edx
    mov eax, x
    div y
    mov q, eax
    mov r, edx
  }

  std::cout << f(x) << " / " << f(y) << " = " << f(q) << "..." << f(r) << '\n';
  return(0);
}
0264259NGNG
>>260
詳しい説明ありがとん。
スタックって偉いね。
0265デフォルトの名無しさんNGNG
>>262
スピードは小さい方が速い。

エラーは読んだとおりだが。
movのオペランドのサイズ一致してない。
マシン語に暗黙のキャストなんかないからな。
alにmovするかmovzxとかつかう。

それよりもdivの使い方調べした方がいいんじゃね?
ついでにidivも調べとけ。
0266262NGNG
> 265
> スピードは小さい方が速い。
そうですかなるほどなるほど。

> alにmovするかmovzxとかつかう。
> それよりもdivの使い方調べした方がいいんじゃね?
> ついでにidivも調べとけ。
アセンブラはわからないのです
これもCマガ2001年10月の記事を
みて便利そうだなとテストしていたのです

どこで調べたらいいのでしょうか…

あとNumTypeをintにして-Sでアセンブラコードを
出力したらcdqとかidivとか出てきたんですが
これは何をしているのですか?
0267デフォルトの名無しさんNGNG
>>266
符号付きと符号無しで命令が違う。
div=符号無し
idiv=符号付き
コンパイラが勝手にやってくれることをアセンブラでは自分でやらなきゃいかん。

それとバイトで割りたかったら、被除数はax ah=余り al=商
cdqはeaxの値をedx:eaxのクワッドワードに変換する。
ナゼかというと、32ビットで割るときは被除数がedx:eaxになるから。

0268262NGNG
あれからグーグルで勉強できるところを
検索して勉強しました(すこしだけど)
難しいイメージがあんなにもあったのに
どうしてもやりたい欲望があったせいか
なんとかはじめることができました
すごくうれしい!
感謝です

変更したところは
 _asm {
  xor ah, ah // (1)
  mov al, x // (2)
  div y
  mov q, al
  mov r, ah
 }
です

divとidivの違いもわかりました(テストで正どうしなのでdivにした)
cdqも意味もわかりました
除算の注意点もしりました
・ゼロで割るな
・結果が格納されるレジスタをこえるな
・割る値を直接かけない(レジスタに入れてから割る)
0269262NGNG
また(1)(2)のところなのですが、最初は
 mov ax, x
とだけ書いていたのですがまたOperand types...
というエラーが出て悩みました
(1byte除算なのでaxレジスタにいれているのになぜ)
ログをもう一度よんだら「alにmovする…」とあった
のでこうしました。
もしかして(1)は不要ですか?
(このテストでは不要だが普段は必要とか?)

あとmovzxとは?説明をみつけれなかった…
ほかにコンパイラにアセンブラコードを
吐かせるとmovszとかもよくみるし…
0270デフォルトの名無しさんNGNG
Intelのサイトへご〜
0271デフォルトの名無しさんNGNG
>>269
mov ax, word ptr x
と書けばいいじゃん。
0272デフォルトの名無しさんNGNG
但し word ptr は x が short の場合に限る。
movzx ax, x (xがcharの場合) でもいい。
0273デフォルトの名無しさんNGNG
今度はループでやってみようとしているのですが
「現在のアドレスの-128〜+127番地以内」
とかいうのがわかりません。
たとえば
  mov  ecx,dword ptr [eax]
のサイズはいくらですか?
それから
@2:
  mov  ecx,dword ptr [eax]
  and   ecx,-16843010
  shr   ecx,1
  mov  dword ptr [eax],ecx
  add   eax,4
  cmp  edx,eax
  jne   short @2
@3:
の@2〜@3のサイズはいくらですか?
0274デフォルトの名無しさんNGNG
普通はアセンブラに計算させるもんだが・・・
0275デフォルトの名無しさんNGNG
>>273
気にするな。
shortで届かなかったらアセンブル時にエラー出るから判る。

というか、今時shortとか指定しない。
386以降では条件ジャンプのロング版があるから、ショートジャンプが届かなかったら勝手にロングジャンプにアセンブルされるだろ。
0276273NGNG
それでは毎回shortをつけてみます

>というか、今時shortとか指定しない。
ここ以下がよくわからなかったです
私はbcc32(tasm32)をつかっています
-Sでアセンブルコードを出力すると
よくshortが付いているのですが、
私が_asm{}のなかで
je END としても je short END とは
勝手にしてくれませんでした…

shortを付けないと速度で損をしますか?

それから、なんだかアセンブラに
慣れてきた気もするので、C/C++で
書いたコード(昔の私のコード)と
速度の比較をしたいのですが…
どうやって計測すれば
いいのでしょうか?
ハァハァしたい…
0277デフォルトの名無しさんNGNG
>je END としても je short END とは
そういう最適化は普通はしてくれんだろう。
0278デフォルトの名無しさんNGNG
> shortを付けないと速度で損をしますか?

超タイトなループでかつ運が悪いと損するかもしれないけど
普通はデコードステージで隠されちゃうから見えないと思う
0279デフォルトの名無しさんNGNG
> どうやって計測すれば
> いいのでしょうか?
> ハァハァしたい…

1000回とか100万回とか適当な回数ループさせて
CPU時間を計測するテストプログラムを書くとか。
0280デフォルトの名無しさんNGNG
>>276
timeGetTime()またはQueryPerformanceCounter()
0281デフォルトの名無しさんNGNG
>>277
tasmなんかはやってくれるよ。
0282デフォルトの名無しさんNGNG
>>276
P5以降ならrdtsc命令を使うとか。

但し最近のCPUでは先にCPUIDとか呼んでおかないと、
結果がパイプラインの状態に左右されるよ。
それよか計測部を数千回呼ぶ方が面倒がなくていいかも。
0283デフォルトの名無しさんNGNG
>>276
命令的には386からP6(PenIIIもだ)まで実行時間は同じはずだ。
もっとも、命令単体で速いからと言って、全体で速くなるとも限らない。
速いはずの命令使ったら、そのほうが遅いこともよくある。
命令を選ぶには、アドレス配置とか、キャッシュがどうとか、P5なら命令のペアリング、P6ならマイクロ命令数とかCPUのパイプラインの状態まで考えないとダメ。

ハァハァしたかったらまずループアンロールくらいしろ。
そうしないとコンパイラに負けるぞ。というか、こういう単純な処理で勝つことの方が難しい。

>>277
MASM6でもやってくれるよ。
やらないのはインラインだからか?
TCは常時TASM呼び出しだったが、BCは一応内蔵したんでTASM呼び出しオプションがあったんじゃなかったっけ?
使ってないのでうろ覚えでスマソ。
0284デフォルトの名無しさんNGNG
TASMはパス数を増やせばやってくれる。
普通は1パスだから、やってくれないけど。
0285276NGNG
ぜんぜんだめだった…ガックシだよ…
いや、さ、はかる前から体感できなかったけど…
何が悪いかわからん!教えてください。
目的:
__unsigned int64が、32bitレジスタを2つ使って
処理しているようなので、64bitレジスタを1つ
使って処理しようとした(その方が速いと思った)

元のコード:
void
f0(unsigned __int64 *p, unsigned __int64 *pend, char s8,
LARGE_INTEGER *li0, LARGE_INTEGER *li1)
{
QueryPerformanceCounter(li0);

for ( ; p != pend ; ++p ) *p = ((*p) & 0xfefefefefefefefe) >> 1;

if ( s8 ) {
unsigned int *q = (unsigned int*)p;
*q = ((*q) & 0xfefefefe) >> 1;
}

QueryPerformanceCounter(li1);
}
0286277NGNG
がんばったコード(1/3):
void
f1(unsigned __int64 *p, unsigned __int64 *pend, char s8,
LARGE_INTEGER *li0, LARGE_INTEGER *li1)
{
QueryPerformanceCounter(li0);

_asm {
mov ecx, -16843010 /* fefefefe */
movd mm1, ecx
punpckldq mm1, mm1 /* fefefefe fefefefe */

mov eax, p
mov edx, pend

LOOP1: /* eax=p, ecx=mask1, edx=pend, mm1=mask2 */
movq mm0, [eax]
pand mm0, mm1
psrlq mm0, 1
movq [eax], mm0
0287277NGNG
がんばったコード(2/3):
movq [eax], mm0 /* (1/3)の最後 */

add eax, 8
cmp edx, eax
jne short LOOP1

emms
0288277NGNG
がんばったコード(3/3):
emms /* (2/3)の最後 */

/* fraction */
cmp s8, 0
je short END
mov edx, [eax]
and edx, ecx
shr edx, 1
mov [eax], edx
END:
} /* end _asm */

QueryPerformanceCounter(li1);
}
0289デフォルトの名無しさんNGNG
> movq [eax], mm0

アドレスが8byte alignしてないと怒られるかペナルティかあったような。

あと283の言うようにループをアンロールして複数要素を順次処理する
ようにしないと勝てないぞ。具体的には
| data[i]:read data[i]:calc data[i]:write |
    | data[i+1]:read data[i+1]:calc data[i+1]:write |
みたいにオーバーラップさせる。

ただ、演算内容が単純だとメモリのread/writeのバンド幅で処理時間が
決まってしまう。この例(andとshiftだけ)はまさにそれに該当する。

ハァハァするのは難しいかも。
0290デフォルトの名無しさんNGNG
>>288
P4 2.8Gでやってみた。
データ数=500000

BCB 5.6
func1 = 23464
func2 = 15576

VC7
func1 = 23335
func2 = 15316

十分速くなってるよ。CPUにもよりそうだね。
0291デフォルトの名無しさんNGNG
P4のメモリが速いからかな。>>288のCPUは何だろ。
ま、関数の外で失敗している可能性もある。

しかし、ソフトウエアパイプラインすればまだ速くなる可能性があるのは明らか。
とりあえずmmxレジスタを全部使って書いてみることを勧める。

面白そうだからそのコンパイル可能なソースくれ。>>290
0292デフォルトの名無しさんNGNG
>>291

#include <windows.h>
#include <iostream>

#define SIZE 500000

void func1(unsigned __int64* p, unsigned __int64* pend, char s8)
{
for (; p != pend; ++p) *p = ((*p) & 0xfefefefefefefefe) >> 1;

if (s8) {
unsigned int* q = reinterpret_cast<unsigned int*>(p);
*q = ((*q) & 0xfefefefe) >> 1;
}
}

void func2(unsigned __int64* p, unsigned __int64* pend, char s8)
{
_asm {
mov ecx, -16843010 /* fefefefe */
movd mm1, ecx
punpckldq mm1, mm1 /* fefefefe fefefefe */

mov eax, p
mov edx, pend
0293デフォルトの名無しさんNGNG
LOOP1: /* eax=p, ecx=mask1, edx=pend, mm1=mask2 */
movq mm0, [eax]
pand mm0, mm1
psrlq mm0, 1
movq [eax], mm0

add eax, 8
cmp edx, eax
jne LOOP1

emms

/* fraction */
cmp s8, 0
je END
mov edx, [eax]
and edx, ecx
shr edx, 1
mov [eax], edx
END:
} /* end _asm */
}
0294デフォルトの名無しさんNGNG
int prof(void (*func)(unsigned __int64*, unsigned __int64*, char), unsigned __int64* p1, unsigned __int64* p2, char c)
{
__int64 start, end, freq;
HANDLE hprocess;
DWORD oldclass;

hprocess = GetCurrentProcess();
oldclass = GetPriorityClass(hprocess);

Sleep(10);
SetPriorityClass(hprocess, REALTIME_PRIORITY_CLASS);
QueryPerformanceFrequency((LARGE_INTEGER*)&freq);
QueryPerformanceCounter((LARGE_INTEGER*)&start);

func(p1, p2, c);

QueryPerformanceCounter((LARGE_INTEGER*)&end);
SetPriorityClass(hprocess, oldclass);

return (int)(end - start);
}

int main()
{
unsigned __int64* p1 = new unsigned __int64[SIZE];
unsigned __int64* p2 = p1 + SIZE;
char c = 0xff;

std::cout << "func1 = " << prof(func1, p1, p2, c) << std::endl;
std::cout << "func2 = " << prof(func2, p1, p2, c) << std::endl;
}
0295デフォルトの名無しさんNGNG
prof()関数はトリッキーなプログラムスレでどなたかが作って
くださったものをそのまま流用しています。コピペで簡単に
ベンチマークできるのでとても重宝しています。
0296288NGNG
よくわからないので仕様一覧という紙の
なかからそれっぽいところを書きます
モバイルPentium2(233MHz)
メモリ64MB(SDRAM SO-DIMM)
増設したメモリ64MB
0297288NGNG
>>294
私のだと
func1 = 68498
func2 = 69137
でした

あと私のテストコード
#include <windows.h>
#include <stdio.h>

extern void f0(unsigned __int64 *, unsigned __int64 *, char,
LARGE_INTEGER *, LARGE_INTEGER *);

extern void f1(unsigned __int64 *, unsigned __int64 *, char,
LARGE_INTEGER *, LARGE_INTEGER *);

int
main(int argc, char* argv[]) /* ./abc in.bmp out.bmp 0 */
0298288NGNG
main(int argc, char* argv[]) /* ./abc in.bmp out.bmp 0 */
{
HANDLE hf, hh;
BITMAPFILEHEADER bfh;
BITMAPINFOHEADER bih;
DWORD bfhsize, bihsize, hhsize, dw;
unsigned __int64 *buf;
LARGE_INTEGER li0, li1;

if ( (argc < 4) || (! lstrcmp(argv[1], argv[2])) ) return(1);

hf = CreateFile(argv[1], GENERIC_READ, FILE_SHARE_READ, 0,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);

ReadFile(hf, &bfh, sizeof(bfh), &bfhsize, 0);
ReadFile(hf, &bih, sizeof(bih), &bihsize, 0);

hh = HeapCreate(HEAP_NO_SERIALIZE, 0, 0);
hhsize = bfh.bfSize - (bfhsize + bihsize);
buf = (unsigned __int64 *)HeapAlloc(hh, HEAP_NO_SERIALIZE, hhsize);
printf("(%d, %d, %d) = %d\n",
bih.biWidth, bih.biHeight, bih.biBitCount, hhsize);
if ( bih.biBitCount != 24 ) return(2);

ReadFile(hf, buf, hhsize, &dw, 0);
CloseHandle(hf);
0299288NGNG
CloseHandle(hf); /* 前の最後の行 */

if ( argv[3][0] == '0' ) {
f0(buf, buf + (hhsize >> 3), hhsize & 7, &li0, &li1);
}
else {
f1(buf, buf + (hhsize >> 3), hhsize & 7, &li0, &li1);
}

hf = CreateFile(argv[2], GENERIC_WRITE, 0, 0,
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
WriteFile(hf, &bfh, bfhsize, &dw, 0);
WriteFile(hf, &bih, bihsize, &dw, 0);
WriteFile(hf, buf, hhsize, &dw, 0);

HeapDestroy(hh);
CloseHandle(hf);

printf("%d\n", li1.QuadPart - li0.QuadPart);

return(0);
}
0300デフォルトの名無しさんNGNG
>>299
倉木麻衣の壁紙で実行。
P4 2.8G MEM1G WinXP Pro SP1

-- f0 --
(1024, 768, 24) = 2359296
9560

-- f1 --
(1024, 768, 24) = 2359296
9009

サイズが小さいとあまり効果が出なかった。
次に松浦亜弥の大きめの壁紙で実行。

-- f0 --
(2536, 3492, 24) = 26567136
137591

-- f1 --
(2536, 3492, 24) = 26567136
150749

おやおや、遅くなってしまった。多分倉木麻衣の壁紙の方も測定誤差だろう。
0301トリッキー2の129NGNG
>>295
漏れです。使ってくれてありがとう(^д^)
0302デフォルトの名無しさんNGNG
>>302
こちらこそありがとう感謝してます。
もちろん商用には使いませんのでご安心を。
0303デフォルトの名無しさんNGNG
ARMの「アーキテクチャリファレンス」とかいうアセンブラのページ
(日本語)があったと思うんだけど、アドレス無くしました・・
検索でも拾えません・・
どなたかアドレス教えてください一生のお願いです
0304デフォルトの名無しさんNGNG
これか?
http://www.bekkoame.ne.jp/~yardserv/arm/archit/armarchit.htm
0305デフォルトの名無しさんNGNG
みなさんは何のCPUからASM Worldに入っていきました?
それから>>11以外にも良いサイトがあったら教えてくだちい
0306デフォルトの名無しさんNGNG
>>305
x86を少し触ってTK85弄ってx86に帰ってきた。
0307デフォルトの名無しさんNGNG
学んだ履歴。

Z80 (PC-8801)
->8086 (PC-9801)
->会社オリジナルの変なCPU1 (8bit)
->会社オリジナルの変なCPU2 (8bit)
->会社オリジナルの変なCPU3 (24bit)
->会社のセミカスタムx86互換CPU1
->会社のセミカスタムx86互換CPU2
->会社のセミカスタムSH3互換CPU

一番いやだったのは、会社オリジナルの変なCPU3かな。
24bitつーても、アーキテクチャがマイコンとは言い難い
ブツだったのでいろんな意味で特殊だったなぁ。PICがかわ
いく見える。

あと、趣味でPIC,AVRなんかも使ってまつ。
0308デフォルトの名無しさんNGNG
>>305
Z80→8086→SC62015→68000→日立の4bit→H8→SH→SX28→8086→H8
なんか抜けてる様な気もするが…こんな感じ。
ちなみにZ80/SC62015/日立4bit/SX28は忘れかけてる。
まー使うこともないだろう。
0309デフォルトの名無しさんNGNG
Z80→8086→80386
かなあ。68000は見ただけ。
0310デフォルトの名無しさんNGNG
俺がやったアセンブラはx86,MIPSとTI社のVLIWプロセッサかな…
VLIWは性能出すのにかなり疲れた記憶があるなあ
0311デフォルトの名無しさんNGNG
>>305
英語だがPC Assemblerというのが32bitのx86ではいい感じだった。
0312デフォルトの名無しさんNGNG
>>305 IBM 360/370 YHP YEW M6809 i8086 PF/C280 FMR i8085 H64180 i80286
i8751 M68020 Z80 H8/532 三菱50747 NEC75008 三菱3825 H8/338 三菱3825
H8/3434 NEC784031Y H8/3007 Ti/C54x H8/SH2 NEC78C17 H8/SH7050 NEC789026
石のマニュアルのどこ見れば仕事ができるかつきとめるのが速くなったなあ。
0313デフォルトの名無しさんNGNG
>>312
次はTLCS-900あたりを使って、国産ワンチップを制覇して下さい。
0314デフォルトの名無しさんNGNG
>>305
z80/6802/6501 → 6809/8086 → 6301
→ 68000/(DSP みたいな独自プロセサ)
→ 80186/68020 → SH-1 → SH-2 → Pentium

会社で作った独自プロセサは ECL-10K でサイクルタイム 33ns
が目いっぱいだった。今なら、FPGA で...。
0315デフォルトの名無しさんNGNG
みなさんはどっち派ですか?
http://science.2ch.net/test/read.cgi/kikai/1001645835/l50
0316デフォルトの名無しさんNGNG
ちょっと質問です。
VC6で、以下の2つの式をそれぞれコンパイルして、アセンブラ出力しました。
(xは構造体で、aは配列です。)

1) x->r = (x->r == x->a[0]) ? x->a[1] : x->a[0];
-----------------------------------
moveax, DWORD PTR [esi+32] ; x->a[0]
movecx, DWORD PTR [esi+8] ; x->r
cmpecx, eax
jneSHORT $L66838
moveax, DWORD PTR [esi+36] ; x->a[1]
$L66838:
movDWORD PTR [esi+8], eax
-----------------------------------

2) x->r = x->a + (x->r == x->a[0]);
-----------------------------------
moveax, DWORD PTR [esi+32] ; x->a[0]
movedx, DWORD PTR [esi+8] ; x->r
xorecx, ecx
cmpedx, eax
setecl
leaecx, DWORD PTR [ecx+ecx*4]
leaedx, DWORD PTR [eax+ecx*2]
movDWORD PTR [esi+8], edx
-----------------------------------
C言語のソースでは一見2)の式が単純ですが、
アセンブラ出力してみると、2)の方が命令数が増えてます。
この場合、1)と2)では、一般的にどっちが速いんでしょうか?
0317デフォルトの名無しさんNGNG
ありゃ、tabが消えちゃった・・もう一度。

1) x->r = (x->r == x->a[0]) ? x->a[1] : x->a[0];
-----------------------------------
mov eax, DWORD PTR [esi+32] ; x->a[0]
mov ecx, DWORD PTR [esi+8] ; x->r
cmp ecx, eax
jne SHORT $L66838
mov eax, DWORD PTR [esi+36] ; x->a[1]
$L66838:
mov DWORD PTR [esi+8], eax
-----------------------------------

2) x->r = x->a + (x->r == x->a[0]);
-----------------------------------
mov eax, DWORD PTR [esi+32] ; x->a[0]
mov edx, DWORD PTR [esi+8] ; x->r
xor ecx, ecx
cmp edx, eax
sete cl
lea ecx, DWORD PTR [ecx+ecx*4]
lea edx, DWORD PTR [eax+ecx*2]
mov DWORD PTR [esi+8], edx
-----------------------------------
よろしくお願いします。
0318デフォルトの名無しさんNGNG
あ、2)は、
x->r = x->a[x->r == x->a[0]];
の間違いでした。
0319デフォルトの名無しさんNGNG
Pen3,Pen4と仮定して、
条件が偏っているなら前者が速い

と思う
0320デフォルトの名無しさんNGNG
486の頃までは 確実に 2)が速い。
以後は、分岐予測がヒットすれば 1)も遜色なくなってきた。

今では、殆ど差が無い。 
差が出てもアライメントとかデータキャッシュ関係の差だろう。

命令実行そのものは並列でされるので、キャッシュアクセスに隠れてしまう為だ。
0321316NGNG
>>319-320
ありがとうございます。
書き忘れましたが、テスト環境はPen3でした。
この式を使う個所は、主にスクリプト言語の述語判定です。
(局所的なfor文などで繰り返し使うわけではない。)
なので、どっちに転びやすいとかいうのは多分無いと思います。
今はジャンプの無い2)で組んでましたが、
実際に測ってから決めることにします。
(leaが遅そうだとか思いこんだりしてました)
0322初心者NGNG
ごめんなさい。教えて君させてください。以下のプログラム、多摩ソフトウェアの
LASMなら
LASM HELLO.ASM
LIL HELLO
でEXEファイルができるのですが、MASM32だと
ML HELLO.ASM
LINK HELLO
でアセンブルできてもリンクできません。
どうすればよいのでしょうか?
assume cs:cseg,ds:dseg,ss:sseg
cseg segment
start:
mov ax, dseg
mov ds, ax
mov dx, offset msg
mov ah, 09h
int 21h
mov ax, 4C00h
int 21h
cseg ends
dseg segment byte
msg db 'Hello !',0Dh,0Ah,'$'
dseg ends
sseg segment stack
db 100h dup(?)
sseg ends
end start
0323デフォルトの名無しさんNGNG
16bit用リンカが必要
0324初心者NGNG
ぐぐって見つけました。
ftp.microsoft.com/softlib/mslfiles/lnk563.exe
MASM32/BINにコピーして、コンパイル・リンク
HELLO.EXEが出来ました。実行!
HELLO!
ありがとうございました。さあ、悪いプログラムをガンガン作って世界を征服するぞー!
0325デフォルトの名無しさんNGNG
ストリング命令(REP,MOVS,LODS,...)って
積極的に使うべきなの?

あとLEAってなんですか?
便利?
0326デフォルトの名無しさんNGNG
>>325
速度に関係しないところならどうでもいいんでない?
速度に関係するなら常にベンチマークをとるべき。

あと本ぐらいよもう。>LEA
0327デフォルトの名無しさんNGNG
>>324
おいおい(w
0328デフォルトの名無しさんNGNG
16bit DOSアプリで世界征服か…
まあ、気長にがんばれ。
0329デフォルトの名無しさんNGNG
>>328
> まあ、気長にがんばれ。

ダメだよ、急がないと環境がなくなるぞ。
0330デフォルトの名無しさんNGNG
仮想マシンとエミュで生き残るんじゃない?
0331デフォルトの名無しさんNGNG
仮想マシンの世界を征服できてもな・・・(w
0332デフォルトの名無しさんNGNG
まあでも その手の仮想マシンてのは、案外セキュリティは甘いからな
.NET とかで破ろうとガンバルより効率いいかもな
0333デフォルトの名無しさんNGNG
16ビットコードはワンダースワン用に転用できるかもな
0334デフォルトの名無しさんNGNG
ワンダースワンも、急がないと環境がなくなるわけだが。。。
0335デフォルトの名無しさんNGNG
まだぷらっとほーむに売ってるかなぁウィッチ
0336デフォルトの名無しさんNGNG
stoswとかstosdとかって、
ediが奇数アドレスをさしているときに
使ってもいいことになってますか?
0337デフォルトの名無しさんNGNG
大丈夫だが386以降はペナルティがドッチャリ付く
0338デフォルトの名無しさんNGNG
>>337
それなら避けられるなら避けたほうがいいですね

stosdのばあい、奇数アドレスではないけど
4で割ったら2があまるようなアドレスだったら
どうなんでしょうか?
やっぱりドッチャリつきますか?
0339デフォルトの名無しさんNGNG
>>338
4byte alignをまたいだらドッチャリ付く。

ああ、ということはrep stoswは二回に一回だね。間違えたスマソ
0340デフォルトの名無しさんNGNG
> ああ、ということはrep stoswは二回に一回だね。間違えたスマソ

どういうことかわからないです…
二回に一回とは?
あと、何を間違えたのでしょうか?
0341デフォルトの名無しさんNGNG
>>340
rep stoswを奇数番地から始めた場合、
4byte境界をまたぐのは二回に一回という意味でつ
0342デフォルトの名無しさんNGNG
>>341
なるほど、了解しますた
0343341NGNG
いや、了解してなかった

では2回に1回は大丈夫ということ?
ペナルティ→大丈夫→ペナルティ→大丈夫…
0344342NGNG
↑の名前はまちがえました

343を書いたのは342です
0345デフォルトの名無しさんNGNG
実験してみようか。(ベンチマーク厨のお出ましですヽ( ´¬`)ノ)

1,1バイト単位で奇数アドレスから始める。
2.2バイト単位で偶数アドレスから始める。
3.4バイト単位でアラインされたアドレスから始める。

コンパイラの new がどんなアラインを返すのかちょっと調べてから
にする。
0346デフォルトの名無しさんNGNG
newが返すチャンクのアラインがよくわからないので、longを確保させて
返されるチャンクを使う事にした。
賢いコンパイラなら、さすがに4バイトでアラインされた先頭アドレスを
返すだろうと勝手に仮定。
0347デフォルトの名無しさんNGNG
ふーループ条件を間違えて、永久ループに入り、REALTIME_PRIORITY_CLASS
になっていたため事実上ハングアップしてしまった。WindowsXPでリセットボタン
を押すのは初めてだよ。

さて、肝心のループ部分をうpする。

asm {
mov ebx, 100
start:
mov edi, p
cmp byte ptr[align], 0
je label
inc edi // 1バイトアライン
cmp byte ptr[align], 1
je label
inc edi // 2バイトアライン
label:
mov eax, 0
mov ecx, SIZE
cmp byte ptr[mode], 0
jne lword
rep stosb // バイト
jmp next
0348デフォルトの名無しさんNGNG
lword:
cmp byte ptr[mode], 1
jne ldouble
rep stosw
jmp next
ldouble:
rep stosd
next:
dec ebx
cmp ebx, 0
jne start
}

これで、SIZE = 500000で実験した結果を次に示す。
0349デフォルトの名無しさんNGNG
1バイトアライン(BYTE) = 132050
2バイトアライン(BYTE) = 130763
4バイトアライン(BYTE) = 129686
1バイトアライン(WORD) = 412949
2バイトアライン(WORD) = 441081
4バイトアライン(WORD) = 391805
1バイトアライン(DWORD) = 914535
2バイトアライン(DWORD) = 918916
4バイトアライン(DWORD) = 912975

BYTEのSTOSは予想通りアラインの影響を受けない。WORDは2バイト
アラインの方が何度やっても1バイトアラインよりペナルティを食う。
どうもキャッシュが関係しているのではないかと思う。
DWORDはアラインの影響を受けないようだ。これは意外だな。
0350デフォルトの名無しさんNGNG
なお測定条件はOS = WindowsXP Pro SP1、CPUはPentium4 2.8G、
メモリはPC2100を使用。

測定結果はOS、CPU、メモリの影響を強く受けると思われるので、
要望があれば全リストをうpする。
0351デフォルトの名無しさんNGNG
バグっていた。

asm {
mov ebx, 100
start:
mov edi, p
cmp byte ptr[align], 2
je label
inc edi // 1バイトアライン
cmp byte ptr[align], 0
je label
inc edi // 2バイトアライン
label:
0352デフォルトの名無しさんNGNG
1バイトアライン(BYTE) = 131815
2バイトアライン(BYTE) = 128789
4バイトアライン(BYTE) = 130906
1バイトアライン(WORD) = 451881
2バイトアライン(WORD) = 405049
4バイトアライン(WORD) = 422643
1バイトアライン(DWORD) = 895154
2バイトアライン(DWORD) = 899134
4バイトアライン(DWORD) = 876400

うーん何かよく分からなくなってきた・・・・Pentium4は多分Pentium3とは
全然傾向が違う石なんでしょう。
0353デフォルトの名無しさんNGNG
1バイトアライン(BYTE) = 132450
2バイトアライン(BYTE) = 130877
4バイトアライン(BYTE) = 120831
1バイトアライン(WORD) = 504302
2バイトアライン(WORD) = 457035
4バイトアライン(WORD) = 376032
1バイトアライン(DWORD) = 1002256
2バイトアライン(DWORD) = 1007482
4バイトアライン(DWORD) = 922796

Visual-C++での結果。これなら理解できる。さっきのはBorland-C++。
やっぱりBCCはnewが返すメモリチャンクのアラインがワードか何か
なんだろうな。よくわからんけど。
0354デフォルトの名無しさんNGNG
>>353
少し大きく確保して、得られたアドレスを (a + 15) & ~15 とかすればいいやん。
0355デフォルトの名無しさんNGNG
>>354
それいいですね。それでやってみました。

1バイトアライン(BYTE) = 228404
2バイトアライン(BYTE) = 218411
4バイトアライン(BYTE) = 223208
1バイトアライン(WORD) = 438036
2バイトアライン(WORD) = 445308
4バイトアライン(WORD) = 455428
1バイトアライン(DWORD) = 877391
2バイトアライン(DWORD) = 860253
4バイトアライン(DWORD) = 896863

BCCでの結果です。やはり傾向は変わりませんね・・・・
0356デフォルトの名無しさんNGNG
ちなみに>>355はデータサイズを10倍にし、ループ回数を1/10にして
います。なぜかというとBYTEを500000回書き込んでも、Pentium4
(Northwood)の場合全部2次キャッシュに収まってしまうので、
それを避けるためにプログラムを変えました。
その結果メインメモリへのフラッシュが発生し、BYTEの結果が約2
倍時間がかかるようになっています。

どなたかPentium3系やAthlonで試していただける方はいらっしゃいま
せんか?その時はソース貼りますので。Pentium4ではアラインの影響
がいまいちわからないのです。
0357336NGNG
最初に質問したものです
いろいろと検証してくださって
ありがとうございます

私のはPintium2です
コンパイラ(アセンブラ)は
bcc32(tasm32)しかありません

試してみたいのですがソースを
貼っていただけますでしょうか?
0358デフォルトの名無しさんNGNG
>>356
stos系などの書き込み時はキャッシュの遅延書き込みが効いてると思われ。
scas, lods, movsなどの読み込みではいかがだろうか?
0359デフォルトの名無しさんNGNG
>>357
遅れました。ソースを貼ります。bcc32でコンパイル検証済みです。
>>
358
やってみます。

#include <windows.h>
#include <iostream>
#include <cstdlib>

#define SIZE 5000000

void func1(long* p, char align, char mode)
{
asm {
mov ebx, 10
start:
mov edi, p
cmp byte ptr[align], 2
je label
inc edi // 1バイトアライン
cmp byte ptr[align], 0
je label
inc edi // 2バイトアライン
label:
mov eax, 0
mov ecx, SIZE
cmp byte ptr[mode], 0
jne lword
rep stosb // バイト
jmp next
0360デフォルトの名無しさんNGNG
lword:
cmp byte ptr[mode], 1
jne ldouble
rep stosw
jmp next
ldouble:
rep stosd
next:
dec ebx
cmp ebx, 0
jne start
}
}

int prof(void (*func)(long*, char, char), long* p, char align, char mode)
{
__int64 start, end, freq;
HANDLE hprocess;
DWORD oldclass;

hprocess = GetCurrentProcess();
oldclass = GetPriorityClass(hprocess);

Sleep(10);
SetPriorityClass(hprocess, REALTIME_PRIORITY_CLASS);
QueryPerformanceFrequency((LARGE_INTEGER*)&freq);
QueryPerformanceCounter((LARGE_INTEGER*)&start);

func(p, align, mode);
0361デフォルトの名無しさんNGNG
QueryPerformanceCounter((LARGE_INTEGER*)&end);
SetPriorityClass(hprocess, oldclass);

return (int)(end - start);
}

int main()
{
long* dsts = new long[SIZE + 16];
long* dst;

dst = reinterpret_cast<long*>(reinterpret_cast<unsigned long>((dsts + 15)) & ~15U); // 4バイトアラインにする

std::cout << "1バイトアライン(BYTE) = " << prof(func1, dst, 0, 0) << std::endl;
std::cout << "2バイトアライン(BYTE) = " << prof(func1, dst, 1, 0) << std::endl;
std::cout << "4バイトアライン(BYTE) = " << prof(func1, dst, 2, 0) << std::endl;

std::cout << "1バイトアライン(WORD) = " << prof(func1, dst, 0, 1) << std::endl;
std::cout << "2バイトアライン(WORD) = " << prof(func1, dst, 1, 1) << std::endl;
std::cout << "4バイトアライン(WORD) = " << prof(func1, dst, 2, 1) << std::endl;

std::cout << "1バイトアライン(DWORD) = " << prof(func1, dst, 0, 2) << std::endl;
std::cout << "2バイトアライン(DWORD) = " << prof(func1, dst, 1, 2) << std::endl;
std::cout << "4バイトアライン(DWORD) = " << prof(func1, dst, 2, 2) << std::endl;

delete dsts;
}
0362デフォルトの名無しさんNGNG
lods、SIZE=5000000×10回でやってみた結果です。

1バイトアライン(BYTE) = 277337
2バイトアライン(BYTE) = 268935
4バイトアライン(BYTE) = 269434
1バイトアライン(WORD) = 421938
2バイトアライン(WORD) = 280317
4バイトアライン(WORD) = 280200
1バイトアライン(DWORD) = 474518
2バイトアライン(DWORD) = 450938
4バイトアライン(DWORD) = 367506
0363336NGNG
>>361
1バイトアライン(BYTE) = 565462
2バイトアライン(BYTE) = 564352
4バイトアライン(BYTE) = 506370
1バイトアライン(WORD) = 1063233
2バイトアライン(WORD) = 1014034
4バイトアライン(WORD) = 1014949
1バイトアライン(DWORD) = 2097202
2バイトアライン(DWORD) = 2017584
4バイトアライン(DWORD) = 2034207
このような結果になりました
どう評価すればいいのでしょうか?
アライメントの影響はないということ?
0364デフォルトの名無しさんNGNG
>>363
ありがとうございました!そうですね、ライトバックキャッシュが効いているので
あまりアラインの差は出ないようです。今からlodsのfunc貼ります。これならかなり
差が出るでしょう。
0365デフォルトの名無しさんNGNG
void func1(long* p, char align, char mode)
{
asm {
mov ebx, 10
start:
mov esi, p
cmp byte ptr[align], 2
je label
inc esi // 1バイトアライン
cmp byte ptr[align], 0
je label
inc esi // 2バイトアライン
label:
mov ecx, SIZE
cmp byte ptr[mode], 0
jne lword
rep lodsb // バイト
jmp next
0366デフォルトの名無しさんNGNG
lword:
cmp byte ptr[mode], 1
jne ldouble
rep lodsw
jmp next
ldouble:
rep lodsd
next:
dec ebx
cmp ebx, 0
jne start
}
}
0367デフォルトの名無しさんNGNG
後からmovsもやってみます
0368デフォルトの名無しさんNGNG
movsの結果です。BYTEとWORDがアラインの影響を強く
受けているのはなぜなんでしょうか?

1バイトアライン(BYTE) = 421525
2バイトアライン(BYTE) = 389473
4バイトアライン(BYTE) = 309287
1バイトアライン(WORD) = 1019163
2バイトアライン(WORD) = 637366
4バイトアライン(WORD) = 617137
1バイトアライン(DWORD) = 1293675
2バイトアライン(DWORD) = 1250312
4バイトアライン(DWORD) = 1244611
0369デフォルトの名無しさんNGNG
(dsts+15)だと、dstsがlong*なので実アドレスはdsts+15*4になりませんか?
先にdstsをバイトポインタに変換しないとまずいのでは。
この部分は保険ですから結果に影響はないかもしれませんが。。

あと、movsの場合は、転送元と転送先がキャッシュの同じラインに
格納されるか("破壊的"か)どうかも結果に影響すると思います。
キャッシュのブロックサイズや連想度等を考慮して転送アドレスを
調整すれば、結果が変わるかもしれません。
0370デフォルトの名無しさんNGNG
アラインテストの上のコード、転送以外のコードのオーバーヘッドが
気になったので、BYTE転送、WORD転送、DWORD転送にわけて
アライメントは呼び出し時にそれぞれ dst+1, dst+2, dst と
1MBの転送時間を計測するように書き直してテストしてみた。
cmps?, movs?はsrcとdstを256バイトずらして破壊的にならないようにした。

結果。
Pentium III (x86 Family 6 Model 8 Stepping 6, GenuineIntel)では
読み込み系(lods?, scas?, cmps?) などはアライメントにほぼ影響なし。

DWORD境界DWORD転送を 1.00 とすると BYTE境界DWORD転送で1.10
DWORD境界WORD転送で 1.23、BYTE境界WORD転送で1.36
DWORD境界BYTE転送で 1.75、BYTE境界BYTE転送で1.74

つまり
読み込み時のアライメントの影響はあまりないが
WORD読み込みは DWORD読み込みより 30%前後遅く
BYTE読み込みは DWORD読み込みより 75%前後遅かった。

書き込み系(stos?, movs?) は全テストにおいてほぼ同一値。
転送単位、アライメントに関係ない結果に。。。
0371370NGNG
上記と同じプログラムでL1 Cacheに収まる範囲内のメモリアクセスを
ためしてみた。(= 64KB)

結果。
Pentium III (x86 Family 6 Model 8 Stepping 6, GenuineIntel)では
読み込み、書き込みに関係なくほぼ同じ傾向が出た。

DWORD境界DWORD転送 を 1.0 として
WORD境界 DWORD転送 が 4.2
BYTE境界 DWORD転送 が 4.6

DWORD境界WORD転送 が 2.0
WORD境界 WORD転送 が 5.0
BYTE境界 WORD転送 が 5.5

DWORD境界BYTE転送 が 2.0
WORD境界 BYTE転送 が 9.5
BYTE境界 BYTE転送 が 9.7

WORD境界やBYTE境界はペナルティがどっちゃりつくという予想通りの結果。
L1 Cacheを超える場合はあまり関係ないということになるな。
0372デフォルトの名無しさんNGNG
>>370
rep movsとかrep stos一命令だけで全コードの99%以上の実行時間を
占めるので、他のコードのオーバーヘッドなんか関係ないと思うのだが。
>>371
そんなに差が出た?ペナルティがどっちゃりだと言っても最高4倍ほど
しか付かないように思うのだが。多分キャッシュのラインの関係もある
んだろうね。
0373デフォルトの名無しさんNGNG
> 最高4倍ほど

充分ペナルティだと思うが、どうか。
0374336NGNG
>>366
遅くなりましたが2番目の
実験コードの結果です
1バイトアライン(BYTE) = 1302662
2バイトアライン(BYTE) = 1275674
4バイトアライン(BYTE) = 1275531
1バイトアライン(WORD) = 2065923
2バイトアライン(WORD) = 1662876
4バイトアライン(WORD) = 1662833
1バイトアライン(DWORD) = 3121135
2バイトアライン(DWORD) = 3094505
4バイトアライン(DWORD) = 2721193
0375デフォルトの名無しさんNGNG
>>374
lodsの場合はライトバックキャッシュの代わりにプリフェッチ機構が働く
ので、結果が変わってくると予想されますが確かにそのようになって
いますね。
結果的にはPentium4とPentium3はそんなにペナルティの傾向に差は
ないようです。
>>371さんはL1キャッシュに限定しているから、「素の」CPUのペナルティ
を測ることができたようですね。Pentium4はトレース・キャッシュという
怪しげなキャッシュを使っていますが、一応データもキャッシュできると
仮定して、L1に乗るようなプログラムを走らせてみました。

1バイトアライン(BYTE) = 167753
2バイトアライン(BYTE) = 167779
4バイトアライン(BYTE) = 48657
1バイトアライン(WORD) = 293953
2バイトアライン(WORD) = 173335
4バイトアライン(WORD) = 52731
1バイトアライン(DWORD) = 431089
2バイトアライン(DWORD) = 431042
4バイトアライン(DWORD) = 76308

てな感じでやはりアラインはL1キャッシュ内だとすごく大きく効いてきますね。
0376デフォルトの名無しさんNGNG
NASMアセンブラで
アセンブラを記述するにはどうすればいいのでしょうか?
0377デフォルトの名無しさんNGNG
db 'アセンブラ',0
0378デフォルトの名無しさんNGNG
L2キャッシュの有り難みが今までイマイチわからなかったが、
実はアラインの問題をかなりの程度まで解決してくれるのか・・・・
0379376NGNG
誰かまともに答えてください。
0380デフォルトの名無しさんNGNG
>>376
dispe nasmw.exe
0381757NGNG
>>380
できませんが・・・
0382デフォルトの名無しさんNGNG
>>376
アセンブラでアセンブラ記述する ?
エディタでしこしこ書けば OK
0383デフォルトの名無しさんNGNG
PUSH GR3
ってか?
0384デフォルトの名無しさんNGNG
>>376
とりあえず、君がまともに質問することが必要だと思うが(w
おそらく誰も質問の意味を理解できていないぞ。
0385デフォルトの名無しさんNGNG
もしかして構文がわかっていないだけなのか?
0386デフォルトの名無しさんNGNG
アセンブラを使って
アセンブラを作りたいのかな

キチ○イか神になるからやめておけ
0387デフォルトの名無しさんNGNG
もう春ですね
0388デフォルトの名無しさんNGNG
>>i386
おめでと、386の地雷を踏みました。

>>382
glibcとか使えば比較的楽かもね。
でも、ほんとにキチ○イか神にでもなってしまうぞ。
0389デフォルトの名無しさんNGNG
>>388
でも昔の何人かのきちが・・・おっと神はやってのけたんだよなー
0390デフォルトの名無しさんNGNG
つーかアセンブラもなかったころは機械語直接書いてアセンブラをつくったんだろうな・・・
今よりは単純だったとはいえ・・・ハァ・・・
0391デフォルトの名無しさんNGNG
>>386
6809を使ってた頃は1パスアセンブラをアセンブラで書いたものだよ。
2パスアセンブラはさすがに頭が爆発して無理ですた。
ハッシュなんか機械語で実装するのは事実上無理ぽ・・・・・
0392デフォルトの名無しさんNGNG
>>391
ならそのアセンブラで実装すりゃいいじゃな

というか1パスという事はラベル解釈しないアセンブラって事だよね?
0393デフォルトの名無しさんNGNG
>>392
そう。一行アセンブラ。だからほとんど使い物にならない。
もちろんこれをファイルから読み込ませるように改造すれば、
ラベルの使えないアセンブラができるわけだけど、ラベルが
使えないという事はジャンプもテーブルも使えないわけで、
使い物にならない。
でもちょっとしたコードをいちいち本を見てハンドアセンブル
する手間が大幅に省けたよ。
0394デフォルトの名無しさんNGNG
そういえばフルアセのやつがあったな
http://fasm.sourceforge.net/
結構本格派

面倒くさい、時間の無駄というだけで
スピードとか機能とか凝ったことをしなければ
このスレでは作れない人のほうが少数派だろうが
0395デフォルトの名無しさんNGNG
>>394
optasmもフルアセンブラだったような・・・
マクロは超強力だったなぁ・・・・

tasmも、一応1パスという話だったと思ったが。
ただ1パスだとジャンプがshortでできる場所も、みんな
nearになったり、無駄な場所にnopが埋め込まれたりする。
0396デフォルトの名無しさんNGNG
tasmはパス回数指定可能。嘘書くな厨房め
0397デフォルトの名無しさんNGNG
>>392
>>395 も書いてるとおり、1パスでラベル使えるアセンブラは、いくらでもあったよ。
アドレスが確定しない所は、領域だけ空けといて確定したら埋め込めばいいだけ。
オンメモリで全部処理しておもむろにファイルにオブジェクト吐く奴とか、埋めるべき所とその値のテーブルをファイルの最後にくっつけてリンカやローダに「あと、よろしくね」という無責任野郎な奴もあったね。

アセンブラで書けたら「神」とか言ってる奴いるけど、ほんの15年ぐらい前は当たり前だったし、アセンブラだってサブルーチン/ライブラリが使えるんだから、そんなに言うほどのことではないよ。
0398395NGNG
>>396
あぁ、「可能」という文字が抜けてたか。
そりゃ、複数指定できるのは知ってるさ。普段はtasmを使ってるからな。

鬼の首取ったように、わざわざageて書く程度のことでもあるまいに(w
0399377NGNG
>>376
盛り上がる話題を提供してくれたのでチョット協力。

1. どのCPUのアセンブラを書くか決める。
2. CPUのレジスタの表記法を決める。
3. CPUのオペコードに対応するニーモニックを決める。
4. オペランドのアドレッシングモードに対応する表記法を決める。
5. ラベルの表記法(スコープも含む)を決める。
6. 必要な擬似命令(マクロを含む)を決める。
7. 字句解析ルーチンを設計。
8. 構文解析ルーチンを設計。
9. シンボル管理(ラベルなど)方法を決める。
10. バイナリーのフォーマット(リンカに依存)を決める。
11. コード生成ルーチンを設計。
12. アセンブル、実行、デバッグ、仕様変更を根性の続く限り繰り返す。

>識者様、抜けている所や間違いを補足してね。
0400デフォルトの名無しさんNGNG
EBXレジスタって、EBPレジスタと
何か関係があるのでしょうか?
-Sでアセンブラコードを出力すると
関数の最初と最後のあたりで
よくpush/popしているようでが

あと、レジスタの汎用度の順番
(気楽に使える順番)をしりたいです。
自分は今、
EDI > ESI > ECX > EBX > EAX > EDX
だと思ってます。
そして ESP, EBP はふれないようにしています。
0401デフォルトの名無しさんNGNG
中途半端にアセンブラを触ってみて
引数なんかのスタックに直でアクセスするのに
BPとBXが無いと辛かった気はするのだがなんでだったか忘れた。
0402デフォルトの名無しさんNGNG
BX は BPと同じくベースポインタに使える4つの一つだったので、
オブジェクトポインタにEBXが使われてるのでは?


演算用には EAX:EDX,ECX, を使うの普通では?

 EDI,ESI,EBP,EBX は保存してから使うのが普通

EBPはスタックフレーム(ローカルレジスタ・引数アクセス)に使うのが普通
0403デフォルトの名無しさんNGNG
>>401
BPはデフォルトのセグメントがSSなので、スタックフレーム
にアクセスするときにセグメントオーバーライドしなくてもOKという利点が。
だからスタックフレームアクセス専用と考えておいていいね。

BXはDSだけど、二次元配列にアクセスするのに [BX+SI+xx]とか
できるんだよね。[SI+DI+xx]は無理(たしか)。


LSI-Cだと引数や返し値にBXとか使ったりして特殊(w
tasmなんかと組み合わせて使うときは面倒だね。
ARG疑似命令とか使えないし。素直に腐ったr86使えってこと
なんだろうけど。
0404401NGNG
なるほど、ためになります。
LSI-Cでなんか思い出してきました。
intdos()じゃダメなDOS Callをアセンブラで書いて
LSI-Cのソースとリンクさせようとして居たような気がする
引数AX〜DXまで順番に割り当てられるんですよね
引数が少ない内は結構使いやすいんですが
引数のが4個以上になると汎用レジスタ埋まっちゃって
他のレジスタは基本的に破壊禁止だからpushするしか身動きとれない。
それでどっかのレジスタをプッシュすると
こんどはSPの値が-2されちゃうという具合で単純にpush とpopだけでは
スタックに積まれた引数まで取り出すことができなかった
それで
push ax
mov ax,[sp+4]
みたいなのを試みるもなぜかできなかったようなきもする。
それでLSI-Cが-Sオプションで吐き出すアセンブラをみながら
なんとなくBPを使うのかなあと思ったところで
面倒くさくなってアセンブラの勉強を止めました。
もしかしてmov ax,[??+4]みたいな使い方のできるレジスタが
ベースなんですかねえ。
0405デフォルトの名無しさんNGNG
80386以降はほとんどのレジスタをベース・ポインタとして使えるように
なったのでとても使いやすい。命令の対称性が高まったためだと
考えられる。しかしレジスタの少なさは相変わらずだったね。
PentiumPro以降でレジスタ・リネーミング機構を内蔵したためレジスタ
の依存関係に起因するストールの確率が減ったが、プログラマが
その事を意識しつつアセンブラで書くのは不可能に近い。
内部的にはRISC(μops)で動いているので、μopsの数を減らすような
命令を優先的に選択してプログラムするとパフォーマンスが上がるが、
プログラマから見れば単調な命令を繰り返し書いているように見え、
あまり面白くない。
0406デフォルトの名無しさんNGNG
MMXだと8バイトまとめてコピーできますが
SSE使えば16バイトまとめてコピーできるんですよね?

ビットマップなどの画像のピクセルデータをコピーするときに
MMX使ってますが同様にSSE使っても大丈夫でしょうか?

以前どこかでSSEでコピーするのは良くないやらなんやら聞いたもので
もしできるのであれば単純に2倍近い速度になって助かるのですが・・・
0407デフォルトの名無しさんNGNG
>>406
実際やってみたらいいと思うが。
2倍どころか全然変わらん予感がする。
0408デフォルトの名無しさんNGNG
>>407
それはメモリアクセスのレイテンシのせいか?
キャッシュ内に収まっている場合はかなり高速化すると思うが、ビットマップじゃ収まらないか
0409デフォルトの名無しさんNGNG
>>408
メモリバスの幅でせう。
0410デフォルトの名無しさんNGNG
>>409
アーキテクチャにもよるかも知らんが、最近の CPU はバス幅は関係ないぞ。
CPU 内部の L2 キャッシュ外の領域が要求された場合、その領域のデータは
32bytes 単位で内部キャッシュに転送され、レジスタに読み込まれる。
0411408NGNG
↑ キャッシュラインは 32bytes とは限らんな。
  Pentium 4 では 128bytes だし
0412デフォルトの名無しさんNGNG
キャッシュライン全体が埋まると同時に利用可能になるというわけでもなかったような
メモリバスから読み込んだ分が順次利用可能になっていくCPUもあった気がする
0413デフォルトの名無しさんNGNG
Pen3,Athlon?Pは128ビットSSE命令は
内部で64ビットμops命令x2に分割してから実行する。
0414408NGNG
以下の各ルーチンで 1GB のメモリコピーに要する時間を測定してみた。
(1) memcpy test : memcpy 関数を使用
(2) MMX test : movq を使用、ループアンロール 4 回
(3) SSE test : movaps を使用、ループアンロール 4 回
ソース、デスティネーションのアドレスは、128bytes でアラインメントしてある。

環境 : VC++ 6.0 SP5 + Processor Pack, 実行速度最適化
Athlon XP 1666MHz, AMD 761, 266MHz DDR-SDRAM 512MB, Windows XP

・src, dest それぞれ 8KB の領域、128K 回繰り返し
 memcpy test : 260ms
 MMX test : 180ms
 SSE test : 170ms
・src, dest それぞれ 64KB の領域、16K 回繰り返し
 memcpy test : 560ms
 MMX test : 461ms
 SSE test : 431ms
・src, dest それぞれ 512KB の領域、2048 回繰り返し
 memcpy test : 3455ms
 MMX test : 2764ms
 SSE test : 2744ms
・src, dest それぞれ 4MB の領域、256 回繰り返し
 memcpy test : 3435ms
 MMX test : 2794ms
 SSE test : 2754ms

少なくとも Athlon XP では、キャッシュ内においても
MMX から SSE にした場合メモリコピーは速くならないようだ。
ちなみに、GetTickCount で計ったからあまり精密な値ではない。
0415デフォルトの名無しさんNGNG
>>414
乙〜

コピーするならMMXで十分ということで
ファイナルアンサー?
0416デフォルトの名無しさんNGNG
んー結局P3、P4系のCPUはデータバス幅が64bitなので、SSE128ビット
を使って転送しても結局は64ビット×2回の転送になるのでそんなに
速くならない、そういう事かな?
0417デフォルトの名無しさんNGNG
>>416
データバスというよりロード/ストアユニットかな?

0418デフォルトの名無しさんNGNG
P4のロード/ストアユニットはP3と違って128bitなので、
SSE128ビットの方が速い。
0419デフォルトの名無しさんNGNG
>>414
なんで8KB×128Kがダントツで速いんだ?
本当に4MBx256の13倍以上も速いのか?
0420デフォルトの名無しさんNGNG
>>419
同じ8KB領域への連続読み書きだと完全にL1キャッシュにヒットするからでしょ。
64bit266MHzDDRSDRAMの性能と
64bit×2本1666MHzL1キャッシュメモリの性能差。
0421407NGNG
予想通りの結果だね。
確かP4でもSSE movapsの方がレイテンシもスループットも倍だたんだよ。
413の言うことがP4でも当てはまるんだろうね。

ちなみにスループットでMMX 1クロックSSE 2クロック。
それで転送しかしてないんだから、メインメモリのレイテンシを隠しようがない。
0422デフォルトの名無しさんNGNG
>>421
P4は、movapsによるメモリアクセスはスループット1クロックだよ。
0423デフォルトの名無しさんNGNG
ぐぐったらでてきた
ttp://www.geocities.co.jp/SiliconValley-Oakland/8071/pa_mem.html
これで再計測してみたら?
0424デフォルトの名無しさんNGNG
C++の名前空間がからんでいる場合の
データ転送の書き方をおしえてください。

namespace A { // Aという名前の名前空間
 int a;
}

namespace { // 名前なし名前空間
 int b;
}

void f()
{
 _asm {
 // ここで、eax に A::a を mov する
 // ここで、ebx に b を mov する
 }
}
0425デフォルトの名無しさんNGNG
処理系に激しく依存すると思うが。
0426デフォルトの名無しさんNGNG
>>424
BCCとかでは using namespace A; とやって a を外に出さないと
だめみたい。
0427デフォルトの名無しさんNGNG
>>414
memcpy,movq,movapsでPentium4でやってみた。
16バイトアラインメント、Pentium4 2.8G、PC2100、WindowsXP
SIZE=5000000バイト
memcpy = 52655
MMX movq = 30186
SSE movaps = 29940

Pentium4でもMMXとSSEの差はほとんど出ていない。
0428デフォルトの名無しさんNGNG
私はbcc32(tasm32)しかありません

C/C++ の union や bitfield について、
アセンブラは、これらをレジスタに使うかどうかに
消極的なのでしょうか?

たとえば、uchar*2 を ushort*1 にパックするには
 mov al, c0
 mov ah, c1
で済むので、そうなるように期待して
 union X {
  unsigned short ushort;

  struct {
   unsigned char low;
   unsigned char hi;
  };
 };

 x.low = c0;
 x.hi = c1;
と書いても、レジスタを使わずに
スタックを使っているようなのですが…
0429デフォルトの名無しさんNGNG
PentiumProとか2とか3とかではペナルティがもっさり付くよ
避けるのも無理はない
0430デフォルトの名無しさんNGNG
>>428
unionに限らず、structやclassを使ってもレジスタを使ってくれない。
常にthisを通したアクセスにするようだ。C++でなくてもCモードで
コンパイルしても「隠れthis」があるようなコードを吐く。
0431デフォルトの名無しさんNGNG
コンパイラは?
0432デフォルトの名無しさんNGNG
>>431
BCC32だとそうなる。VC++.NETではthisポインタが必要ない時は
そのような面倒なコードは吐かないようだ。
でもVC++.NETでもunionはレジスタを使ってくれなかった。
0433デフォルトの名無しさんNGNG
ここは良スレだなぁ。
アセンブラだから下手な厨も寄り付けないからだろうな。
ほかの言語スレはひどいありさまだ…。

# sage
0434デフォルトの名無しさんNGNG
誰か無知な漏れのために
「アラインメント」が何なのか説明してくださいまし
0435デフォルトの名無しさんNGNG
アセンブラで ALIGN というと、命令やデータをその位置を何ワード毎に配置するかの設定の事

最近のCPUではループ負荷が配置の差によって数割変わる事も多く、
小手先の高速化手法よりアライン調整(単にNOPを入れるだけだが)の差が大きい
0436434NGNG
>435
ひとつ賢くなりますた、thx!
0437デフォルトの名無しさんNGNG
VC++の最適化でアラインメント調整とかしてくれてますかね?
さすがにそこまでは無理かな
0438デフォルトの名無しさんNGNG
>>437
しない。(6.0)
0439デフォルトの名無しさんNGNG
struct は #pragma pack しないと勝手にパディングするけどな。
データ領域もアラインされてる。
コードはL1キャッシュが効くから下手にnop入れるほうが返って遅い。
0440デフォルトの名無しさんNGNG
VC++6.0だと4byteでアラインされるね

0441デフォルトの名無しさんNGNG
>>438
してるに決まってんだろーがゴラァ
一からやり直し
0442デフォルトの名無しさんNGNG
もうアセンブラだけで作る時代は終わったね。
アセンブラでAPI呼ぶ人ももういないでしょ。
どうしても必要なとこだけ関数の一部を置き換えるくらい。
0443デフォルトの名無しさんNGNG
>>441
nop のことだよ。
0444デフォルトの名無しさんNGNG
>>441
つか、構造体メンバのアラインメントはしてあって当然だっての。
そのための設定項目も存在するってのに
0445デフォルトの名無しさんNGNG
>>444
つーか、>>437 の聞き方が良くない。

最適化によって「自動的」にアライメントを調整するか ? と言うなら No.
あらかじめ設定したアライメントに自動で調整するか ? と言うなら Yes.
0446デフォルトの名無しさんNGNG
私はアセンブラは
画像の処理速度を高速にするのと
エロゲー画像の吸出しツールとかを作るときに
使うのぐらいかな・・・?
0447Leliel(れりえる)NGNG
MASM32v8が出ているですよ。

masm32.com
http://www.masm32.com/
0448デフォルトの名無しさんNGNG
ho
0449デフォルトの名無しさんNGNG
bcc32を使っているのです

逆アセンブラというのを使ってみようと
思ったのですが、何を使えばいいですか?
そしてそれはどこにありますか?
0450デフォルトの名無しさんNGNG
>>449
ウインドウズプログラム 逆アセンブル
http://pc2.2ch.net/test/read.cgi/tech/1034744077/93-101
0451デフォルトの名無しさんNGNG
a = b>c ? d : e

を↓のように分岐使わないコードを吐くコンパイラって
ないですか?

mov eax,b
cmp eax,c
mov  ebx,e
cmovg ebx,d
mov  a,ebx
0452デフォルトの名無しさんNGNG
gcc
ただし、cmovは必ずしも速いとは限らないことにご注意。
0453デフォルトの名無しさんNGNG
>>451
それって d,eが普通の変数ならいいけど、 そうじゃないと両方評価してしまうから
良くないかも
0454デフォルトの名無しさんNGNG
mov eax,b
cmp eax,c
cmovg eax,d
cmovle eax,e

これならレジスタも使わないし、評価もCの要件を満たすから
いいんじゃなかろうか。
0455デフォルトの名無しさんNGNG
しもた

mov a,eax

を最後につけてね。
0456デフォルトの名無しさんNGNG
>>451
IntelC++7.0
0457デフォルトの名無しさんNGNG
SIZE=5000000、16バイトアライン、Pentium4 2.8G、PC2100、WindowsXP Pro SP1
でやってみた。

cmov = 106988
cmp = 202720

cmovの方が2倍ほど速かった。std::rand()を代入している配列で比較したので
分岐履歴テーブルが働かない状態なのでパイプラインストールが発生している
のだろう(cmpの方)。
0458デフォルトの名無しさんNGNG
bとcに相関性があれば、jcc使った方が速い場合もあるとおもう。
cmovのレイテンシってでかいよね。

VC6++でもsetccを使って分岐コードを排除してた
0459デフォルトの名無しさんNGNG
>>458

配列に全部 1 を入れてみた結果。

cmov = 106287
cmp = 81764

配列に1、2、3、4と 1 を入れてみた結果。

cmov = 107042
cmp = 90303

確かに配列に何らかの規則性があり、BTBが有効に働く場合は
jccの方が速いようだ。
0460デフォルトの名無しさんNGNG
http://pc2.2ch.net/test/read.cgi/tech/1038215563/l50
cmov vs 分岐予測ネタはこのスレでやってたよ
0461デフォルトの名無しさんNGNG
Σ(゚Д゚;
0462デフォルトの名無しさんNGNG
できて一ヶ月になるロボットテクノロジー板ですが
人が集まらず寂れっぱなしです。
一回のぞいてやってください。
http://that.2ch.net/robot/
0463デフォルトの名無しさんNGNG
関数の頭で
subsp,#0x0c
のようにスタックポインタを後退させて
↓のような感じで
strr0,[rp,#0x00]
ldrr0,[rp,#0x00]
スタックを使っているソースを見たことがあります。
この方法で沢山の数値を保存できるとは思うのですが
スタックは無限ではないので↑のように
勝手にスタックポインタを動かすことに抵抗があります。

そういえばpush/popをするとき
スタックの限界なんて意識するひとはいないようですが
それが原因でバグがおきたなんて話しも聞いたことがありません。

一体どうしてなんでしょ?
0464デフォルトの名無しさんNGNG
>>463
環境によっては、あふれて挙動不審になります。
そういうことを気にしなくてもいいのは、
足りなくなると適当に割り当ててくれるから。
0465デフォルトの名無しさんNGNG
>>463
組み込みでは厳密にスタック消費量をみるのが普通ですよ。
まともなコンパイラセットなら、ライブラリ関数ごとのスタック消費
量まで書いてあります。

PCだとあんまり気にしないですけどね。。。とれるスタックの
量が桁違いですし。。。
組み込みだと4Kバイトとか8Kバイトがなんてのがよくあります。。。。
0466デフォルトの名無しさんNGNG
タスク1個じゃなくてシステム全体のスタックが128バイトです(;_;)
0467デフォルトの名無しさんNGNG
>>466 羨ましいねえ 2個しかないや
0468デフォルトの名無しさんNGNG
>>466
よくあることです。
で、ワーストケースの見積もり間違えで、悲しいことになる…
0469デフォルトの名無しさんNGNG
汎用機(日立VOS3/FS)のアセンブラを勉強したいのですが、アマゾンでも本がみつかりません。
IBMのsystem/370のアセンブラの入門書が見つかったので、とりあえず同じ汎用機だから似てるかなあと思って注文したのですが、
この本で勉強しても日立系でも応用利きますか?
0470デフォルトの名無しさんNGNG
便乗質問します。
スタックってやっぱり後方のアドレスから使うのですよね?
0471デフォルトの名無しさんNGNG
>>470
どのCPUの?
0472デフォルトの名無しさんNGNG
ただの金儲けさ。
そんな宗教やめておけ


0473デフォルトの名無しさんNGNG
>>469
今時どう言う理由で汎用機のアセンブラを勉強したいんだ ?
0474デフォルトの名無しさんNGNG
>>470
 汎用のCPUの殆どが ハードウエアスタックを アドレスの大きい方から小さい方へむかって消費します

 でも、特殊なCPU(1チップ系)はそうとは限りません。
0475デフォルトの名無しさんNGNG
>>469使えるよ。 >>473バグが出て読まなきゃいけなくなったに1000クロック。
>>474俺のいじった数十種のチップには残念ながら無かった。例を挙げてみて。
0476デフォルトの名無しさんNGNG
>>475
> >>473バグが出て読まなきゃいけなくなったに1000クロック。

今使ってるんなら、普通マニュアルぐらい持ってるだろう ?
余分に必要なら、営業に電話すればいいだけ。
CD-ROM 版なら、破格の \300/冊 で買えるみたいだよ。
http://www.hitachi.co.jp/Prod/comp/soft1/VOS3/manual/cd.html

つーか、アセンブラで書いた部分のバグを今からアセンブラ勉強しますって言う奴に修正させるなんて自殺行為に等しいと思うぞ。

>>474俺のいじった数十種のチップには残念ながら無かった。

ハードウェアスタックを持たない CPU はあるけどねぇ。
上に書いた汎用機もそうだし。
0477デフォルトの名無しさんNGNG
>>475
例えばPIC なんかは PUSH でアップするのかダウンするのかマニュアルに書いていない。
まあ専用スタックなんで、そんな情報は不要なんだけどね。

今使ってるチップはスタックは2レベルしかない。 だから、スタック選択はカウンタではなく
フラグを反転するだけ。
0478469NGNG
>>476
??私は469でしか書き込んでないですよ。
仕事でアセンブラを直接使うわけではないです。
主体はコボルなのですが、アセンブラで書かれたソースもあるので、少しは知りたいと思ったのが本を欲しいと思った理由です。
マニュアルって一般人でも買えるんですか?
0479デフォルトの名無しさんNGNG
>>478
> マニュアルって一般人でも買えるんですか?

そりゃ買えるけど、多分ソフトを一緒に買わないとダメだと思う。
汎用機のソフトって普通の個人じゃ買える値段じゃないと思う。(最近は知らんけど。)
仕事で汎用機使ってるなら、その管理者の人に言ってマニュアル買ってもらえば良いと思う。
アセンブラの勉強したいのでと言えば、普通の上司なら \300 ぐらいの経費は認めてくれるでしょ。
0480デフォルトの名無しさんNGNG
6502関係の資料(書籍など)を探しています。
学生の頃(4年前)にゲーム喫茶のマスターにプログラムを組んでくれと
頼まれて本を借りてそのままどこかになくしたんですが、
最近になって返してくれと言われて困っています。
なんでもいいので何かあれば教えて下さい。
0481デフォルトの名無しさんNGNG
>>480
http://www.6502.org/
0482デフォルトの名無しさんNGNG
>>480
カリパクってやつやね。
0483山崎渉NGNG
(^^)
0484デフォルトの名無しさんNGNG
CODESEGMENT
ASSUMECS:CODE,DS:CODE
;
ORG5CH
FCBDB12 DUP(?)
DB25 DUP(?)
BUFFERDB128 DUP(?)
;
ORG100H
ENTRY: ;保守上げ
0485480NGNG
>>481
thxです。6502日本語のサイトってないんですかね?
0486デフォルトの名無しさんNGNG
>>485
むしろ65816のサイトを巡った方が良いサイトが見つかるかも。
日本語のページはスーファミばかりの関係であまりいい所は
ないみたい。
0487デフォルトの名無しさんNGNG
最強の開発言語
http://www.borland.co.jp/delphi/personal/
0488デフォルトの名無しさんNGNG
最弱の開発言語
http://www.google.co.jp/search?q=%E3%81%AC%E3%82%8B%E3%81%BD&ie=UTF-8&oe=UTF-8&hl=ja&lr=
0489485NGNG
>>486
全然無知なんですが6502と65816は同じ系統と考えていいんですか?
今探してる情報としてはコード表(?)を探してます。
「6502 コード表」でグルってもイマイチなんですよね・・・
0490デフォルトの名無しさんNGNG
>>489
ttp://www.apple2world.jp/apple2/COL/MapItems/6502/6502opcode.html

と言うか、http://www.6502.org/ からたどればいくらでもでてくるけど。
もちろん英語だけど、6502 自体国内ではファミコンぐらいしか使われなかったし、今となってはかなりマイナーな情報だから英語は必須と思うべき。
0491デフォルトの名無しさんNGNG
>>489
英語でもよければ
http://www.6502.org/tutorials/6502opcodes.htm
0492デフォルトの名無しさんNGNG
>>490
ゲーム喫茶のポーカーゲーム賭博機も 6502 でつ。
未だ現役で動いてるだろ?
0493デフォルトの名無しさんNGNG
ファミコンのおかげで、あちこちの企業とかエンジニアの手元に資料はあるんだけど

その為に逆にWebにまで資料を上げてくれる奇特な人はいないんだろうね
0494デフォルトの名無しさんNGNG
>>489
6502はファミコン、65816はスーパーファミコンに採用されたCPUですね。
それでここがミソなのですが、65816は6502互換モードというのを持って
おり、それに切り替えると(エミュレーションモードという)、拡張された
6502として使用できるようになっており、従って65816のサイトには同時に
6502の解説も書いてあるのが普通です。
0495デフォルトの名無しさんNGNG
>>489
同じく英語ですが
http://www.defence-force.org/computing/oric/coding/annexe_2/
6502と65816の簡単な対比ができます。
0496山崎渉NGNG
   ∧_∧
  (  ^^ )< ぬるぽ(^^)
0497山崎渉NGNG
   ∧_∧
  (  ^^ )< ぬるぽ(^^)
0498デフォルトの名無しさんNGNG
逆アセンブルソフト
で、オススメのやつありますか?
0499デフォルトの名無しさんNGNG
15F2:0100 MOV AX , FFFF
15F2:0103 MOV DX , 0001
15F2:0106 MOV WORD PTR [0200] , 100
15F2:010C DIV WORD PTR [0200]
15F2:0110
-G =100 110

AX=01FF DX=00FF

axの01がどうやって出たのかどなたか教えていただけませんか?
宜しくお願いします。
0500デフォルトの名無しさんNGNG
>>499
1FFFFh / 100h = 1FFh 余り 0FFh
 DX:AX [0200h]  AX     DX

ok?
0501デフォルトの名無しさんNGNG
ありがとうございます。
分かりました。
分子にはdx(この場合は0001)も含まれるのですね。axだけで考えてた・・。
ありがとうエロイ人 (・∀・)ノ
0502500NGNG
>>501
誰がエロイ人じゃ!
まあ分かればよろしい。


さて、半角に寄ってから寝るか。
0503デフォルトの名無しさんNGNG
>>502
> さて、半角に寄ってから寝るか。

エロイ人やん !!
0504デフォルトの名無しさんNGNG
     _   (⌒Y´ ̄ヽ  ∧_/( ̄)) ∧_∧
    γ´  `ヽ_`と.__   )( ・ ∩( 《 ( ・∀・)  ゴロン
     )) ,、 , ) <、_,.ノ  ヽ、.__,ノ  l  つ つ
    ((_/し∪V              .ヽ.__ノ!__)) ゴロン
  ∧__∧       ∧_∧          ∧_∧  
 (    )       ( ;´Д`)         (・∀・ ) エロイ人から逃げられると思うなよ。
 (    つ     (U_U )つ       (つ  と)
 .ヽ___ノj       503          (⌒Y⌒)
    ∧__∧                . / ̄ヽ ̄
   (・    )           __    ( __  ) (  ゴロン
    と   ヽ ( ̄))∧_∧  /´ `Y⌒) VUVJ_)
    (__ト、__丿 〉 》∩ _) (   .__つ´
          ヽ、.__,ノ   ヽ、__,.>
0505デフォルトの名無しさんNGNG
>>499-504
あさっぱらからワラタヨ
0506デフォルトの名無しさんNGNG
初歩的ですが質問です。

ターゲットはWindowsなんですが、
関数を書くときに
破壊していいレジスタ/いけないレジスタ
というのはあるのでしょうか?

今まで全部破壊してはいけないと思ってたのですが
VC++で書いた単純なCコードに汗リストを吐かせると
ebp しか push してなかったので。
0507デフォルトの名無しさんNGNG
>>506
処理系によって違うから、その処理系のマニュアルを見るべし。
(全部自前で書くなら適当に決めればいい。)

とりあえず VC++ とかなら
http://www.asia.microsoft.com/japan/developer/library/default.asp?URL=/japan/developer/library/vccore/_core_using_and_preserving_registers_in_inline_assembly.htm
とかを参考にスレ。
0508デフォルトの名無しさんNGNG
eax ecx edx キャリーなどの算術フラグ 以外は保存すべき
FPU SSEレジスタはコンパイラ毎に扱いが違うが関数呼び出しで破壊されると仮定した方が良い気がする
0509デフォルトの名無しさんNGNG
>>507-508
即レスサンクス!

汎用的に呼び出したい(更にはDLLにするかもしれない)ので
心配だったんです。

MSDNまで教えていただいたので公の仕様が手に入って安心しました。
#でもこんな奥深くにあったら分からないって

FPU SSEがコンパイラ毎に違うというのがちょっと気がかりですが、
今回とりあえず使わないので良しとします。
#破壊「されてる」のはコールした関数のバグかも、
#とか思えるからまだしも、自分が破壊してもいいものかどうか...
0510デフォルトの名無しさんNGNG
>>509
心配なら保存しとけばいいと思うが...。
0511デフォルトの名無しさんNGNG
Windowsだろうと処理系(コンパイラ)依存だよ。
Win32APIではEBX,ESI,EDI、EBPが非破壊。

このくらい調べられないようじゃお先真っ暗だぞ。

0512デフォルトの名無しさんNGNG
>>511
> このくらい調べられないようじゃお先真っ暗だぞ。

はい...頑張ります。
0513デフォルトの名無しさんNGNG
アセンブラからCで書いたコードを
呼び出すにはどうすればいいのか教えてください。

http://www.microsoft.com/japan/msdn/library/ja/vcsample/html/vcsammasmprimesstep2.asp

というのを見つけたのですが概要だけのようでして。
0514デフォルトの名無しさんNGNG
>>513
処理系によって引数の渡し方が異なるから、
まずはCで簡単なテストプログラムを作って
コンパイラにアセンブリ・リストを吐かせてみたら?
0515デフォルトの名無しさんNGNG
>>514
えぇと、C側は

?hoge@@YAXXZ PROC NEAR

みたいにハッシュ化(?)されちゃうようなんです。

毎回リスト吐かせて調べて

extrn ?hoge@@YAXXZ

みたいに書かなきゃいけないのかな、と思いまして。
0516デフォルトの名無しさんNGNG
>>515
それCじゃなくてC++だよ

extern "C"とかで対処
0517デフォルトの名無しさんNGNG
>>516
なるほど!
ありがとうございました。

あぁ、「このくらい調べられないようじゃ」という声が、、、
0518デフォルトの名無しさんNGNG
(・∀・)ノマァ、キニスンナ
0519デフォルトの名無しさんNGNG
int kakezan(int a, int b)
{
  asm("imul %2, %0"
     :"=r(a)"
     :"0(a)",
     "r(b)"
     );

  return a;
}

と

int kakezan(int a, int b)
{
  asm("imul %2, %0"
     :"=r(a)"
     :"r(a)",
     "r(b)"
     );

  return a;
}

って 実行結果は同じなんですが、内部的にはどう違うか教えて下さい。
0520デフォルトの名無しさんNGNG
あ、""が間違ってますね すいません。
0521デフォルトの名無しさんNGNG
>>519
実行結果ちがうでー。
0522デフォルトの名無しさんNGNG
asm("imul %2, %0"
   :"=&r"(a)
   :"r"(a),"r"(b));
だよね
0523デフォルトの名無しさんNGNG
>>519-520
アセンブラ出力結果見ればいいじゃん

>>522
?
0524デフォルトの名無しさんNGNG
そっか インラインアセンブラ使えばいいのか と独り言
0525519NGNG
入力オペランド部の "0"(a) と "r"(a) の違いを・・・ どっちつかってもいいんですか?
0526デフォルトの名無しさんNGNG
>>525
%1見てないならどっちでもいいんでは?
0527デフォルトの名無しさんNGNG
>>519
よく分かってないんだが、
上のは、
mov eax, a
mov ebx, b
imul eax, ebx
だけど、
下のは、
mov ecx, a
mov ebx, b
imul eax, ebx
で、imul結果が不定にならない?
0528527NGNG
>>527
のレジスタは、てきとーに書きました。
出力の"r"(a)と入力の"r"(a)が同一レジスタに
なる保証はないのかと・・・
だから、"0"(a)なんて書き方があるのかと・・・
0529527NGNG
>>528
(誤)出力の"r"(a)
(正)出力の"=r"(a)
0530デフォルトの名無しさんNGNG
age
0531デフォルトの名無しさんNGNG
windowsで動くMotorola 68000 アセンブラってないですか?
DOSで動くやつでもいいんですが・・・
0532デフォルトの名無しさんNGNG
アセンブラでウィンドウとか表示できないんですけ?
前にアセンブラとAPI組み合わせていたのを見たのだが。
なんでこんなこと聞くのって?
いや、ウィンドウ使える新しい言語作る人とかいるじゃん?
HSPとかACTIVEBASICとか・・・。
このかたがたってアセンブラで言語作ってんだと思っているんだ。
んで、この人達がEXEファイルを出力できるからさぁ、どういう仕組みなんだって気になってな・・・。
0533デフォルトの名無しさんNGNG
勘違いもいいとこだね。
0534デフォルトの名無しさんNGNG
>>531
> windowsで動くMotorola 68000 アセンブラってないですか?

Ex68 (X68000 シミュレータ) 上で AS.X 動かすってのはダメ ?

ttp://www.ksky.ne.jp/~yamama/emul/
0535デフォルトの名無しさんNGNG
>>531
DOS用で良ければ
68000 クロスマクロアセンブラ AS68K
ttp://www.vector.co.jp/soft/dos/prog/se007609.html

0536デフォルトの名無しさんNGNG
>>532
Delphi製らしいです
0537デフォルトの名無しさんNGNG
>>531
x68買え....て 無理か
0538デフォルトの名無しさんNGNG
>>537
別にX68k買わなくても
run68.exe+has.x
で良いような
0539名無し@沢村NGNG
おれが、windows用のアセンブル言語開発環境(RADツール付き)をつくってやろうか?
どうよ?
0540デフォルトの名無しさんNGNG
>>539 氏ね
0541デフォルトの名無しさんNGNG
広告・宣伝掲載ページ(無料)
http://wave8.hp.infoseek.co.jp/bckp.html
0542デフォルトの名無しさんNGNG
bcc32(tasm32)を使ってます

変数の型を short や char ではなく int にすると、
足し算するところに、よく、lea という命令を
使うようになります。

short の場合だと movzx, add などが連続しているのに対して
int の場合だと lea だけですませているようです。

質問1
add よりも lea のほうが効率がいいのですか?

質問2
lea は int 以外(short や char など)では使えないのですか?

質問3
やはり int の計算は、char や short よりも効率がいいのですか?

質問4
整数の型は(たとえもっと小さい型ですむ場合でも)
int を第一に考えるのが最も自然なのですか?

ところで、最近、計算の型をそろえるということは
効率(実行速度)への影響が実は大きいのでは…と
感じてきました。
なんだかコンパイラ(アセンブラ?)が裏でコソーリとやっている
型合わせ処理が、無視できないコストなのでは…大げさかな
アホな感想ですいません
0543デフォルトの名無しさんNGNG
詳しい理由はIntelのマニュアルぐらい読んで勉強すれ。
486-Pentiumクラスの知識で答えてるんで最近のx86じゃ
違うかも知れない。

1 殆どの場合no. つーか単純加算でleaなんか生成するっけ?
 掛け算ならわかるが(eax*5 == lea reg,[eax+eax*4],etc)
2 だいたいyes. 16bitのleaはレジスタ組み合わせが少ない
3 yes.
4 yes.

型変換が結構なコストになるのは周知の事実だろう
0544デフォルトの名無しさんNGNG
お前らアセンぶってんじゃねーよ(プ
0545542NGNG
>>543
ありがとうございました

あ〜自分の型への認識を少し改めよう…
0546デフォルトの名無しさんNGNG
MOV AL,90H
MOV DX,00F3H
の機械語を教えてくれ
0547デフォルトの名無しさんNGNG
>>546
t季右・tE畿
0548デフォルトの名無しさんNGNG
>>547
('A`)
0549デフォルトの名無しさんNGNG
>>548
「そんなに長くなるわけねーだろ」と言いたそうだな。
0550546NGNG
まじお願いします_| ̄|○

MOV AX, CS
MOV DS, AX
みたいのならわかるんだが(´・ω・`)
0551546NGNG
お礼ならするぞ


('A`*( * )
0552デフォルトの名無しさんNGNG
WindowsXPにもdebugコマンドがちゃんとあるわけだが。
0553546NGNG
>>552
MS-DOSでやってるんだがエラーでる∧||∧
0554デフォルトの名無しさんNGNG
>>552
XP で DEBUG 起動した事ある奴と、UFO 見た事ある奴、どっちが多いかな?
0555546NGNG
|A`)誰か教えてくれ


MOV AL,の部分まではB0になるのは分かるんだ
90Hやら00F3Hってのがわからねぇぇぇぇぇぇぇええぇぇぇっぇぇぇぇぇえっぇ
0556デフォルトの名無しさんNGNG
>>546
debugでは数値は16進数入力だから、後ろのHはいらんぞ。
0557546NGNG
>>556
アリガ�d
そんなことに悩んでた漏れ萎え。
tu-kaこんなことやってる大学ってうちぐらいか?


お礼
コイヨ('A`*( * )
0558デフォルトの名無しさんNGNG
>>557
だから、後ろのHはいらんてばさ。
0559デフォルトの名無しさんNGNG
debug.comはあんまり役に立たないからナァ
symdeb.exeなら、結構役に立つが。mapsym使ってシンボルファイル
作って、学生時代にTurboPASCALのコードのデバッグしてた。
TurboDebuggerだとでかすぎて読み込めないプログラムも、ちゃんと
デバッグできたし。

そういえば、新電子立国で一太郎の話が出とったときは、デバッガが
symdebだったナー
0560デフォルトの名無しさんNGNG
たしかMS-DOS2.0か3.0までは、masmやsymdebも標準添付だったんだよなー。
一応DOSだけ買えば、アセンブリ開発環境は揃ってしまうと(w
0561デフォルトの名無しさんNGNG
>>560
98すか?
2.11がmasm+link+debug
3.1がlink+symdeb
で、そのうち拡張セット(だったっけ?)に入るようになった。
と思うんだけど、さすがに昔過ぎて記憶があいまい。
0562デフォルトの名無しさんNGNG
AT互換機の割り込みについてお教えください。

とりあえずDOS上からとDOSエクステンダ上からどれくらいの割り込み
までかけられるのかなぁとやってみたのですが、割り込みコントローラ
と割り込みリターンの速度上CPUが1GHz以上でも200kHzあたりで頭
うちになるっぽいです。
1.AT互換機上でやるのがまちがい
2.DOSでやるのがまちがい
3.80x86でやるのがまちがい
4.実はやりかたがある
のどれあたりなのか、もしご存知ならお教えください。なんかせっかく
クロックの高いCPUがあるのにもったいないなぁとおもったので・・・
0563デフォルトの名無しさんNGNG
>>562
仮想86モードを使わない。
x86って応答そんなに早くないけど。そこまでひどくないと思う。

0564デフォルトの名無しさんNGNG
単に空の割り込みルーチン?
それともI/Oに何か読み書きしてる? I/Oの読み書きするだけで結構
時間がかかるんだけど。。

あと>>563で指摘されてるよーに、DOSでHIMEM.SYSだけ組み込んでやれば
ちっとは速くなるんじゃないかナ。

0565デフォルトの名無しさんNGNG
>563 >564
なにも組み込んでないPC-DOSだと、仮想86モードにはなってないんじゃない
かと思ってたんですが、実は違うんでしょうか?
ちょっとぐぐってみました。EMM86って仮想86にして仮想EMSを実現してたの
ですね。知りませんでした。HIMEMだけにしたり、なにも無い状態にしたりして
テストしてみます。

>564
最初は8ビットI/Oを1ヶ所だけ読み出していたのですが、200KHzくらいのテスト
の時には特定1ワードのメモリをインクリメントするだけの割り込みルーチンに
しました。I/OにはEOIを書込みしています。
メモリの読み書きが遅いとは思えないので、割り込みの突入、EOIの書込み、
retiのどれかが重いと思っていたのですが、まさかこれらでμS単位の時間が
消えるとも思えないので・・・

お二方に教えていただいたことでまた実験してみます。ありがとうございます。
0566デフォルトの名無しさんNGNG
>>565
何の割り込みを使ってるのか分からんが「割り込みの突入」に
激しく大きなペナルティーがあるはず。
まぁCHIPSETなんてなかった単独の割り込みコントローラーが
あった時代の話だが、、、(^^;

定期的に200KHz以上の周期が本当に欲しいのか
デザインしなおすほうがいいかも。
普通は割り込み側にFIFOバッファなどおいて
割り込み周期は落とすようにしてある。
0567565NGNG
>566
使用してたのはISAバスの割り込み腺です。
4ビットカウンタを適当なクロックでまわしておいて、その値を割り込み時に
読み出すようなテスト回路を作ってみてました。とりあえず定期的な割り込
みで50〜1MHz位で試してみて、どのくらいまで取りこぼさずにとれるのか
なぁって。1GHzのCPUで1000clockもあるわけだから、まぁいけるんじゃない
のかな?って思ったのです。

さすがにISAバスももうないので、パラレルポートで割り込み&データ溜め
込み&HDDに記録&ちょっぴりの制御 なんかができたら、いろいろ遊べる
かなぁと思ったのです。せっかくGHzクラスのCPUがあるんだし。

>激しく大きなペナルティーがあるはず。
>まぁCHIPSETなんてなかった単独の割り込みコントローラーが
>あった時代の話だが、、、(^^;
今はチップセットなんかがCPUの近くで全部面倒見てるんだから、割り込
み応答も高速になってると思っていいんでしょうか?DOSから8259相当と
してたたくと遅くなるだけとかだということなんでしょうか?

>定期的に200KHz以上の周期が本当に欲しいのか
>デザインしなおすほうがいいかも。
>普通は割り込み側にFIFOバッファなどおいて
>割り込み周期は落とすようにしてある。
そういうFIFOのついた安いPCIのボードとかPCMCIAのカード、もしご存知
でしたらお教えください。さがしてみても数万円しちゃうようで、ちょっと遊
んでみるには高価なので・・・

お教えいただいてありがとうございます&長文失礼しました

0568デフォルトの名無しさんNGNG
Pentiumで、mallocとかで確保したメモリ領域を、
マシンコードと見なしてcallしたいんですが、
インストラクションコードがわかりません。
最初、nearの

8E <フラットアドレス32bit>

かと思ったんですが、これじゃなくて、どうやら

FF ?? <フラットアドレス32bit>

という形式にしないと駄目らしいんですが、
??に何を入れたら良いんでしょうか?
0569デフォルトの名無しさんNGNG
ちなみに<フラットアドレス32bit>
は、32bitの絶対値です。
0570デフォルトの名無しさんNGNG
>>567
ISAバスだと、 4MHzじゃなかったっけ?
それと、割り込みとかDMAって技術はクロック数10メガの世界迄で、今のCPU速度にとっては双方邪魔
0571デフォルトの名無しさんNGNG
>>568
mallocで確保した領域をcall出来たかな?
VirtualAlloc で PAGE_EXECUTE_READWRITE とかで確保してないとダメじゃないの? Windowsだよね?
0572567NGNG
>>571
問題ないです。
普通にmallocした領域にインストラクションコードを並べるだけでokです。
0573568NGNG
567じゃなくて568でした
0574568NGNG
あ、つまり>>568の質問は、ヒープ上のマシンコードから
別のヒープのマシンコードをcallで呼び出したいという事です。
そのときのアドレスの指定の仕方で悩んでます。
最初のヒープの実行には成功してます。
0575568NGNG
ちなみに先ほど

B8 <フラットアドレス32bit> ;mov eax, addr
FF D0 ; call eax

というEAXレジスタ間接呼び出しには成功しました。
これを直接、

call <フラットアドレス32bit>

とできればいいんですが・・・
0576デフォルトの名無しさんNGNG
>>568
アドレスをレジスタに入れて

call eax

みたいな形でコール。
0577デフォルトの名無しさんNGNG
>>575 なんでインテルのサイトからpdfを落として読まないの?

E8 cd CALL rel32  相対 near コール、次の命令とディスプレースメント相対。
FF /2 CALL r/m32  絶対間接 near コール、r/m32 でアドレスを指定。
9A cp CALL ptr16:32 絶対 far コール、オペランドでアドレスを指定。
FF /3 CALL m16:32  絶対間接 far コール、m16:32 でアドレスを指定。


という事で、絶対 near コールは無い
0578563NGNG
>>567
割り込みの制御は今も基本的には同じ。

>>570
8MHzじゃなかったっけ?
たまーに10MHzとか言うのもいたような気もするが。
割り込みだけなら、バスクロックの影響は無いと思う。
Bridge経由になる分PCIより遅くなるかな?
0579568NGNG
>>577
その表の見方がわからんのです。
/2とか/3とか。
0580デフォルトの名無しさんNGNG

3.1.1.1. オペコード欄
/digit - 0 から7 までの数字で、命令のModR/M バイトがr/m ( レジスタまたはメモリ) オ
ペランドだけを使用することを示す。reg フィールドには、命令のオペコードを拡張する数
字が入っている。

具体的にはその前の2章を読め
0581568NGNG
>>580
その辺のマニュアルの説明読んでも、
いまいち実際の値がどうなるのかがわかりません。
値の設定の仕方が何処にも載ってないし・・。


0582568NGNG
ちなみに今はVC6でstub作ってcodファイルから抜き出したものを
コピペしてる状況です。
しんどいです。
0583デフォルトの名無しさんNGNG
>>581
そこは Try & Error で乗り切るしかないだろ。
0584568NGNG
昔、NASMのソース読んだりしてみたんですが、
さっぱりでした。

そういえば/3とかのフラグ系以外にも、
SIBバイトというのが意味不明でした。
0585デフォルトの名無しさんNGNG
だから 2章を読めって言ってるだろ
表 2-2. ModR/Mバイトによる 32ビット・アドレス指定形式
の表の上から6つめに

/digit (Opcode) REG =

ってあるだろ?
0586568NGNG
>>577

VCソースのstubに
___asm {
call 12345678
}
とか書いて、codファイル出そうとしたんですが、
>error C2415: オペランドの型が無効です。
でエラーになりました。
やっぱ無理っぽいですね。
0587568NGNG
>>585
お手数かけます。
これから読んでみます。
0588デフォルトの名無しさんNGNG
だからnear絶対コールは出来ない。でも、near相対コールで十分だと思うが?
0589568NGNG
>>585
ちなみに、どのマニュアルのことでしょうか?
IA-32 インテル(R) アーキテクチャ・ソフトウェア・デべロッパーズ・マニュアル
の、上・中・下巻が手元にありますが、これでいいんでしょうか?
0590568NGNG
あ、中巻ですね。
0591568NGNG
>>585
まさしくそれっぽいです
やっと意味がわかりそうです。
ありがとうございました。
0592デフォルトの名無しさんNGNG
C++のクラスをアセンブラで作るにはどうやりますか?
作り方の書いてあるホームページあったら教えてください
直接ここで教えてもいいですよ
ちなみにレスはしません
0593デフォルトの名無しさんNGNG
>>591
 折角pdfで提供してくれてるんだから、検索を活用してね。
0594デフォルトの名無しさんNGNG
>>592
作り方の書いてあるホームページないので教えません
0595デフォルトの名無しさんNGNG
作り方知ってるならここに書いて教えてーーーー
0596デフォルトの名無しさんNGNG
知らないけどC++のクラスだと型保証名の管理がやっかいじゃないの?
どうせならC++で書けばいいじゃない。
0597デフォルトの名無しさんNGNG
MMXやSSEの使い方を教えてください。
0598デフォルトの名無しさんNGNG
masm7.0でmmxやsseが使えるかということも
教えてください
0599デフォルトの名無しさんNGNG
フラグを気にしない場合、
lea eax, DWORD PTR [eax+1] と inc eax
ってどっちが速いんですか?
0600デフォルトの名無しさんNGNG
ice box
0601デフォルトの名無しさんNGNG
>>599
たぶんどっちでも同じだろう。 命令コードが短い方がトータルではキャッシュが効いて有利だ。
0602デフォルトの名無しさんNGNG
ただし、命令配置がくるって、逆に遅くなるなんて事もある程度の差でしかない。
0603デフォルトの名無しさんNGNG
なるほど。
短い方にしといた方が条件ジャンプとかでも有利ですよね。
ありがとうございました。
0604デフォルトの名無しさんNGNG
INC EAXって直感できないようじゃ、アセンブラはあきらめろ
0605デフォルトの名無しさんNGNG
>>604
ハッカーキターーーーーーーーーーーーーー!!!!!
0606デフォルトの名無しさんNGNG
MMXやSSEの使い方を教えてください。
0607デフォルトの名無しさんNGNG
>>606 いやです。

  /  /  \、i, ,ノ    ヽ  ヽ
  |  (-=・=-  -=・=-  )  |
0608デフォルトの名無しさんNGNG
嫌ならスルーしてください
0609デフォルトの名無しさんNGNG
俺はSSE2の使い方が知りたい
サポートしているアセンブラ教えれ
0610デフォルトの名無しさんNGNG
NASMってサポートつーか、使えるんじゃない?
0611デフォルトの名無しさんNGNG
あと、Digital Marsのやつとか
0612デフォルトの名無しさんNGNG
ハイパースレッディングの概要と実装方法を教えれ
0613デフォルトの名無しさんNGNG
Intelのコンパイラも当然ながら使えるだろ
0614デフォルトの名無しさんNGNG
>>606
いったいぜんたい何回言われればわかるのか。

マ ニ ュ ア ル 読 め
0615デフォルトの名無しさんNGNG
そのマニュアルとやらはどこにありますか?
0616デフォルトの名無しさんNGNG
おい!だれかこのオシエテクンを連れてってくれ!
0617デフォルトの名無しさんNGNG
>>615
http://www.intel.com
0618デフォルトの名無しさんNGNG
いくら最適化をかけても早くならない。なんとかしてくれ。
0619デフォルトの名無しさんNGNG
intelのアセンブラに付いて詳しく知りたいです
誰かおしえてぴょん
0620デフォルトの名無しさんNGNG
>>578
ISAは8MHzですなぁ。
マジメに速いのを作りたいなら、PCIの拡張ボードを自作してしまう
ことをお奨めする。取りあえず趣味で作るだけなら、I/O固定の
PCIモドキボードでもいけますし。下のとことかね。
ttp://elm-chan.org/works/pci/report.html


つーか、1GHzのCPUと言っても、内部だけだからねぇ。外部は
所詮100MHzとか133MHzで動いてるわけだし。まして、I/OはPCI
なら33MHzだ。
0621デフォルトの名無しさんNGNG
sseとmmxが使えるアセンブラはnasmだけということでいいですか?
0622デフォルトの名無しさんNGNG
>>621
フリーだと他には
fasm http://fasm.sourceforge.net/
wasm http://www.openwatcom.org/
0623デフォルトの名無しさんNGNG
masm 7.1でも使えるっぽい(VS2003付属)
0624デフォルトの名無しさんNGNG
取ってくんのめんどーだよー
masm7.1単体配布してるとこ教えて!
0625デフォルトの名無しさんNGNG
masm6.15でも使えるはず。VCPPで検索しる!
0626デフォルトの名無しさんNGNG
D6パーソナルの無料版でも sse mmx は使える。
0627デフォルトの名無しさんNGNG
>>621
NWSA
0628デフォルトの名無しさんNGNG
masm7.1だけならフリーウエアだから誰かうpしてくれませんか?
0629デフォルトの名無しさんNGNG
> masm7.1だけならフリーウエア

はつみみです
0630デフォルトの名無しさんNGNG
アセンブラは無料配布可になった。
0631デフォルトの名無しさんNGNG
ソースキボン
0632デフォルトの名無しさんNGNG
海外とかだと、ちゃんとしたアセンブラの掲示板に
visual stuio netから取り出したmasm7..0が普通に配られてるよ
0633デフォルトの名無しさんNGNG
PlatformSDKに普通に含まれてますが・・。
0634デフォルトの名無しさんNGNG
>>630, >>632
ホントに無料「配布」可なのか ?

>>633
無料ダウンロード可と無料配布可じゃ全然違うぞ。
0635デフォルトの名無しさんNGNG
アプしない人は黙っててくれる?
0636デフォルトの名無しさんNGNG
vcpp.exeとかいうのがそうかな
0637デフォルトの名無しさんNGNG
たしかM$のftpから落とせた気がするが
0638デフォルトの名無しさんNGNG
binフォルダの中身のファイル全部くれ
いらない奴は捨てるから大丈夫
0639デフォルトの名無しさんNGNG
つーか配布形態がEXE形式しかないのがイカン
ご自慢のcab形式にしてホシイ
0640デフォルトの名無しさんNGNG
※※※注意※※※

うp報告以外不要
0641デフォルトの名無しさんNGNG
ここから落とせる
http://users.easystreet.com/jkirwan/pctools.html
0642デフォルトの名無しさんNGNG
masmは、MSのDDKに入ってるよ。MSDNの鯖から落とせる。
0643デフォルトの名無しさんNGNG
>>642
Win98DDKに入ってるのは6.11。古いんだyp!
vcpp.exe(VS6SP4用)かvcpp5.exe(VS6SP5用)には6.15が入っとる。
0644デフォルトの名無しさんNGNG
>>640
ダウソ板逝け
0645デフォルトの名無しさんNGNG
xor eax, eax
push eax
と
push 0
ってどっちが良いの?
0646デフォルトの名無しさんNGNG
見た目的にはどっちでもいいな
0647デフォルトの名無しさんNGNG
>>645
無駄にレジスタ使う理由も無いだろうと思うがな。
ついでにレジスタ初期化する必要があるなら別だが。
0648名無し@沢村NGNG
おまいらよ、アセンブラは使うよりも作るほうが簡単だぞ!!
というのはアセンブル言語とマシン語は1対1で対応したものだから、単純な変換だからよ。
コンパイラのように字句解析とかパーサをつくる必要もないよ。
といっても、
MOV AX 100
の場合、MOVに対応したネイティブコード、AXに対応したネイティブコード、100に対応したネイティブコードと続いて保存されるわけではなくて、一命令の全部のオペランドが加算されてひとつのネイティブコードになるから、ちょっとややこしいけどな。
まあ、ものすごく根気のいる作業だが、難度の高いことは何もないから、おまいらもつくってみろ?
0649デフォルトの名無しさんNGNG
>>648
2パスアセンブラは結構作るのが面倒だった。
0650デフォルトの名無しさんNGNG
L1:
<test-part>
test eax, eax
je L2
<then-part>
jmp L1
L2:

こういう相互ジャンプのジャンプ先のオフセット計算は
スマートにやるとどうやるの?

<test-part>と<then-part>のサイズによって、
short/nearジャンプの切り替えがある。
je L2はjmp L1の長さが判ってないとだめだし、
jmp L1はje L2の長さが判ってないとだめ。

それと、沢村うるさい。
0651デフォルトの名無しさんNGNG
>>648
マクロとか、欲しくなって複雑になっていく罠
0652デフォルトの名無しさんNGNG
沢村が何か言うと、やる気無くなる。
0653デフォルトの名無しさんNGNG
>>650
全部shortと仮定して、だめなところを順次nearにしていくとか?(あてずっぽう
0654デフォルトの名無しさんNGNG
>>650
簡単にやるには、1パス目で飛び先が確定していないものについては near だと仮定してしまう。
で、2パス目で実は short でも大丈夫とわかったら short にしてあとに nop を詰める。

> それと、沢村うるさい。

毎回言われてることだが、「無視しろ」。
0655デフォルトの名無しさんNGNG
>>642
今は有償。

多分
>>633
が正解。
0656デフォルトの名無しさんNGNG
PlatformSDKの中のどれをインストールすればmasm7.1がはいってるのですか?
0657デフォルトの名無しさんNGNG
DDKにしか入ってない
0658名無し@沢村NGNG
おれは古いバージョンだが、masmは持っているよ。
masmにはたくさんのファイルがついてくるが、その中のQEditorというのが開発環境だよ。
このQEditorでアセンブル言語を打ち込んでアセンブルやビルドをするんだよ。
またQEditorにはプログラミングが楽になるようにテンプレートもついているし、APIやスクリプトも使えるよ。
なかなか高機能のアセンブラといえるね。
またBintodbというファイルはバイナリエディタだよ。
0659名無し@沢村NGNG
>>657
masm32v8なら
http://www.movsd.com/
からダウンロードできるよ。
0660デフォルトの名無しさんNGNG
>>659はブラクラ
0661デフォルトの名無しさんNGNG
フリーの開発環境いっぱいあるし
QEditorなんて使ってられないよ
0662デフォルトの名無しさんNGNG
>>655
Win98DDKならまだ落とせる。ただし直リンのみ。入っているmasmは6.11。
http://download.microsoft.com/download/win98SE/Install/Gold/W98/EN-US/98DDK.EXE
0663デフォルトの名無しさんNGNG
だめもとで聞いてみますが、
いい加減なコードを読ませたら、最適化しつつアセンブルしてくれるようなアセンブラって無いですか?

push ESIとpop ESIで囲っている領域で、ESIを使って無かったら自動でpush/popも取り除いてくれるとか
計算を一時的にスタックを使って行っても、勝手に未使用レジスタを割り当ててくれるとか。

…無いですよね。無いですね。
0664デフォルトの名無しさんNGNG
>>663
そこまでやられたら、アセンブラの意味がないような…
やるならプリプロセスかなぁ?探せばありそう。
0665デフォルトの名無しさんNGNG
昔のコンパイラで、コンパイラのアセンブラ出力を最適化するのなんてのがあったが
今では TIのDSPくらいしか見ないな
0666デフォルトの名無しさんNGNG
>662
まだあったのか・・・わざわざInternet Archiveで落としてた
0667デフォルトの名無しさんNGNG
vcpp.exeに入ってたml.exe(6.15.8803)
欲しい人いる?
0668デフォルトの名無しさんNGNG
各自でvcpp.exeを落としてきてml.exeを取り出せばいいだけの話じゃないのか?
別にインストールせずとも簡単に取り出せるわけだし。
0669名無し@沢村NGNG
おまいらよ、アセンブラについていろいろ語るのはいいが、HelloWorldはつくったか?
おれはアセンブル言語でHelloWolrdをつくったよ。
コンソールじゃないぞ。ちゃんとしたWindowsアプリケーションだぞ!アセンブラでだぞ!
おれは天才だな♪

http://hp.vector.co.jp/authors/VA015412/
0670山崎渉NGNG
━―━―━―━―━―━―━―━―━[JR山崎駅(^^)]━―━―━―━―━―━―━―━―━―
0671デフォルトの名無しさんNGNG
>>669
ブラクラ
0672デフォルトの名無しさんNGNG
ml7.1以外は普通にダウンロード出来るからいらねよー
ライブラリーとか付いて無いし単体だけあってもいみねーしー
0673デフォルトの名無しさんNGNG
ttp://www.microsoft.com/japan/msdn/vstudio/downloads/ppack/default.asp
上からVC++ 6.0のプロセッサーパックvcpp.exeを落としてきて
解凍して、
ml.exe
ml.err
h2inc.exe
h2inc.err
を抜き出して、MASMという名前か何かのフォルダに仕舞えば完了ですか?
あと説明書として
PPreadme.htm
procpack.chm
MasmRef.doc
も必要かな。
0674デフォルトの名無しさんNGNG
神キター
0675デフォルトの名無しさんNGNG
>>673
わかりにくいので
追加使用許諾契約書>承諾する>
ttp://download.microsoft.com/download/vb60ent/Update/6/W9X2KXP/EN-US/vcpp.exe
で落とせるぞ。
vcpp.cabにして解凍する。
MASMの意味がわかってないんだけどね。
h2inc.exeはいらないのか?
0676デフォルトの名無しさんNGNG
ヘッダをincファイルにするって事なんじゃない?
0677デフォルトの名無しさんNGNG
vcpp.exe /c /t:c:\tmp
とかすればc:\tmpに解凍できるんだけどな。
0678デフォルトの名無しさんNGNG
pdfファイルをふつうのテキストファイルか、またはHTMLファイルに
変換してくれるツールはないですか?フリーで

または、インテルのサイトのマニュアルをふつうのテキストファイルか
またはHTMLファイルに変換して公開しているところはないですか?
0679デフォルトの名無しさんNGNG
>>678
http://www.google.co.jp/search?hl=ja&inlang=ja&ie=Shift_JIS&c2coff=1&q=pdf2txt&btnG=Google+%8C%9F%8D%F5&lr=lang_ja
0680デフォルトの名無しさんNGNG
>>673
それだけだとアセンブラだけですよね。
ライブラリ、リンカ、逆アセンブラ・・・・
実際にMASMにはこの他に何があるのでしょうか?
教えてください。
0681名無し@沢村NGNG
>>678
ハゲ!!おまい、PDFをふつーのテキストにしたら図や写真が見れねーだろ!!
PDFはRTFかHTMLにしねーとダメよ。
アクロバットリーダーはコピー&ペーストができねーから不便ではあるよな。
コピー&ペーストでもっと簡潔に読みやすくしてファイルサイズを小さくできると便利だよな。
おまいはちゃんと考えてみろ?
0682デフォルトの名無しさんNGNG
金出してアクロバット買え!
0683デフォルトの名無しさんNGNG
印刷汁
0684デフォルトの名無しさんNGNG
印刷してOCRで取り込め
0685名無し@沢村NGNG
>>682
ハゲ!!アクロバットはフリーでDLできるよ。
10MB近くあるけど落とせ。
またテキストに変換するにはアクロバットでPDFを開いて「全て選択」「コピー」をし、
ワードパッドか何かにペーストすればいいよ。ただしテキストだけ、図や写真は無理だけどな…。
またPDFはサイズがでかいものが多いから、メモ帳じゃ無理があるよ。
ワードパッドかWORDのほうがいいよ。
0686デフォルトの名無しさんNGNG
>>685
 へえどのワレで落としたんだ?
0687名無し@沢村NGNG
>>686
ハゲ!!ここから落とせるつーの!!

http://www.adobe.co.jp/products/acrobat/readstep2.html
0688デフォルトの名無しさんNGNG
>>687
それは、Acrobat Readerであって、Acrobatとは違う。
0689デフォルトの名無しさんNGNG
>>685
Acrobat Readerにはコピーするテキストの長さに制限がある。
0690名無し@沢村NGNG
>>688
だぁぁぁぁぁぁぁぁぁぁぁぁぁぁぁあああああああああああ
あああああああああああああああああああああああああああ
あああああああああああああああああああああああああああ
あああああああああああああああーーーーーーーーーーーー
ーーーーーーーーーーーーーーーーーーーーーーーーーーー
ーーーーーーーーーーーーーーーーーーーーーーーーーーー
ーーーーーーーーーーーーーっ!!!きさまぁぁぁぁあああ
あああああああーーーーーーーーーーーーーーーーーーっ!
0691デフォルトの名無しさんNGNG
おまえら沢村と会話するとろくなことがないぞ
0692デフォルトの名無しさんNGNG
>>689
> Acrobat Readerにはコピーするテキストの長さに制限がある。

ふ〜〜〜ん、今 800ページ (6MB) ぐらいのやってみたけど、ちゃんとコピペできたよ。
どこまで必要なの ?

まさか、メモ帳に貼り付けて途中までしかコピーしてね−とか騒いでいる厨房じゃないよね ? (藁
0693デフォルトの名無しさんNGNG
win95系というオチでは?
0694デフォルトの名無しさんNGNG
沢村はとっととNGNameに入れとけ。
0695デフォルトの名無しさんNGNG
>>694
特撮板のシャイダースレ見るとき困る(爆)
0696デフォルトの名無しさんNGNG
そろそろ(爆もNGWordかしら(゜Д゜)
0697デフォルトの名無しさんNGNG
昔こういうのもあった(ぉ
0698デフォルトの名無しさんNGNG
CQ出版のintel486あたりのマニュアルには
1オペコードごとのクロック数が書いてあるんですが
今のインテルから落とせるマニュアルに(中巻)に
はクロック数とか書いてないんですよね
686とかNetburstは
1オペコードあたりのクロックは状況によりけりってことでしょうか
0699デフォルトの名無しさんNGNG
そうですね
0700デフォルトの名無しさんNGNG
686以降は内部でマイクロコードに分割されて、アウトオブオーダー実行される。
順序どおりに実行されないし(結果は順序どおりに反映されるけど)、
レジスタリネーミングなんかもあいまって、内部で起こってることを予想するのすら困難。
ハッキリしてたのは586までかな。
0701今日始めますたNGNG
質問します。
http://www5c.biglobe.ne.jp/~ecb/assembler2/assembler10.html
にあるプログラムを入力して、EXEを作ることは出来るのですが、
なぜか実行するとエラーが出ます。
このサイトにリンクされてる
「多摩ソフトウェア LASM Ver2.32 体験版」
でコンパイルしたからでしょうか?

環境はWin98SEであります。
0702デフォルトの名無しさんNGNG
>>701
どんなエラーがでるかくらい書け。
それから、そのページのプログラムはみんな.com用の様だが?
0703デフォルトの名無しさんNGNG
>>702
COMなんて時代遅れスよ。これからは.Net
0704デフォルトの名無しさんNGNG
アセンブラ初心者です。アセンブラとの関わりは情報2種をCASLで取った位です。
最近ブックオフで「はじめて読む8086」という本を偶然見つけて買いました。
MS−DOSのコマンドプロンプトで簡易的にアセンブラを体験できる事を初めて知りました。
とりあえずこの本をマスターしようと思います。
0705デフォルトの名無しさんNGNG
「基本情報」じゃなく「情報ニ種」時代の年寄りが今からそんなことやるのかいな。
普通に他の言語覚えれば?人生は短いよ。
0706704NGNG
2種を取ったのは学生時代の2000年秋です。
今はCOBOLERです。
古いプログラムにはアセンブラもあるので、それを少しでも分かればと思って。
704の本はもう今週中には読み終えるので、それからC言語の復習→Javaと勉強する予定です。
IBM汎用機のアセンブラの本も同時並行で読んでいくつもりです。
0707デフォルトの名無しさんNGNG
いまさら8086じゃしんどいと思うよ。
intとかの割りこみは勉強になるだろうけど。
これからやるなら386以降が楽しいと思う。
0708704NGNG
80386ですね?ではそれも本屋で探してみます。
0709デフォルトの名無しさんNGNG
>>708
本買う必要ないよ。入門書は1冊軽く読む程度でok。
図書館行った方が良質な本が見つかる可能性が高い。
CPUがIntelであれば、マニュアルはWebサイトから落とせる。
あとはgoogleでasmやらeaxやらで検索すれば色々サイトが見つかる。
例えば
ttp://tt.sakura.ne.jp/~suzu/asm/index.html
とか。
上のサイトでも書いてある様に、32bitのアセンブラはCと連携する
事が多いから、Cも多少かじっとくと学習効率がいいよ。
(アセンブラだけでももちろんいいけど)
0710デフォルトの名無しさんNGNG
intelのマニュアル
http://www.intel.com/jp/developer/design/pentiumiii/manuals/
ここの
・IA-32 インテル(R) アーキテクチャ・ソフトウェア・デべロッパーズ・マニュアル、上巻:基本アーキテクチャ (日本語 PDF ファイル: 4,183KB)
・IA-32 インテル(R) アーキテクチャ・ソフトウェア・デべロッパーズ・マニュアル、中巻:命令セット・リファレンス (日本語 PDF ファイル: 9,139KB)
・IA-32 インテル(R) アーキテクチャ・ソフトウェア・デベロッパーズ・マニュアル、下巻:システム・プログラミング・ガイド (日本語 PDF ファイル: 7,838KB)
この3つの中身は知っておいた方がいいよ。
(命令とかを全部覚える必要は全くない)
0711デフォルトの名無しさんNGNG
Technical Assembler
ttp://www.e-net.or.jp/user/missing-link/assembler/menu.html
ここの掲示板は結構人が来てる
0712デフォルトの名無しさんNGNG
AMD英語で(´・ω・`)…。
0713名無し@沢村NGNG
おまいらよ、おれはいま量子指向言語の構想を練っているよ。
ふつーの言語では演算によって結果を求めるが、量子指向言語ではすべての結果は重ねあわせの状態ですでに存在しているから、その中から求める結果を選ぶだけよ。
求める結果は重ねあわせの係数で決まるのよ。
このあたりがいままでの言語と大きく文法が異なるところだな。
つまり画期的よ!!!
おまいらよ、これからの言語といったら量子指向言語しかないぞ!!量子でない言語なんてザコだぞ!!
0714デフォルトの名無しさんNGNG
>>713
いいから病院いけ
そんなんだとこの先つらいぞ
0715デフォルトの名無しさんNGNG
>>714
なんでそんな簡単に釣られる...。
いいかげん放置しとけよ。
0716山崎渉NGNG
     ∧_∧
ピュ.ー (  ^^ ) <これからも僕を応援して下さいね(^^)。
  =〔~∪ ̄ ̄〕
  = ◎――◎                      山崎渉
0717デフォルトの名無しさんNGNG
MASM32の日本語解説サイトきぼん
0718デフォルトの名無しさんNGNG
>>713
なぁ、ヌヒよ。それは、ニューロコンピューた言うんとちゃうのか?
0719デフォルトの名無しさんNGNG
沢村と会話するな!
これ、俺からのお願いだ。
0720デフォルトの名無しさんNGNG
>>717 16bitで代用すればいい。 
>>718 言わないしバカネタを重ねても面白くないし
0721708NGNG
>>709,710,711
おおお、これはこれは親切にありがとうございます。
参考にさせていただきます。
0722デフォルトの名無しさんNGNG
アセンブラでメモりに常駐して、キーボド操作で
ショートカットみたいなことをしたいんですけど、
この場合

【1文字入力】
AH = 01,06,07,08のいずれか
DL = FFh(AH=06のときのみ)
INT 21h

これ↑は使えるのですか?
0723デフォルトの名無しさんNGNG
DOSの話? DOSの場合、そのINT21かキーボードbiosをフックするんじゃなかったかな
0724デフォルトの名無しさんNGNG
>>722
アセンブラなんだからCPUとOS書いた方がいいよ
0725デフォルトの名無しさんNGNG
条件分岐はパイプラインを乱すので、できるだけ避けるべき
とよく聞きますが、では、条件分岐とは具体的に何の命令を
指しているのでしょうか?
cmp, test, jmp, jz, jge, cmov, pcmpgt, ...?
0726デフォルトの名無しさんNGNG
>>725
例に出ているのだと
jz,jge

こういうことは、アセンブラで一通り書ける様になってから考慮すれ、
0727722NGNG
>>723
お手数をかけますが、サンプルコードを書いてくれまへんか?
それか、参考になるwebページだけでもイイですから…
0728725NGNG
>>726
ここで、divの使い方を聞いて、その後にMMXのソースを書いていた者です

jz,jgeは乱すけど、その他は乱さないのですね。

cmp,testが乱さないのは、なんだか驚きました、が、
動作の意味が非破壊(とかいうヤツ)だから納得しました。

ところで、jmpは乱すのですか?無条件なのに?
ようするに、書いてある順番に実行されるかされないか、ということ?
0729デフォルトの名無しさんNGNG
間接ジャンプは乱すと思った
0730デフォルトの名無しさんNGNG
実行の流れを決定し、かつ実行時にならないと流れがわからない命令が乱すもの。
条件分岐は分岐する/しないが実行時でないと確定しない。
また、分岐先アドレスが即値ではなくレジスタが含まれる場合も同様。
「分岐予測」を参考のこと。
0731デフォルトの名無しさんNGNG
あーん?条件分岐がわからない??

日 本 語 か ら や り な お し
0732デフォルトの名無しさんNGNG
予測分岐に失敗したときと

add eax, ebx
sub eax, ecx

みたいなレジスタのストールにぶち当たった
(スケジューラでも並び替えできなかった)
場合の遅延時間はやっぱり同じなの?
0733デフォルトの名無しさんNGNG
>>732
違うものを比較してどうする?
0734デフォルトの名無しさんNGNG
>>732
試してないので想像だがレジスタリネーミング失敗のペナルティの方が
断然小さいと思われ。

条件分岐の予測失敗がおきると、並行して実行していた後の命令を
途中ですべて捨てて最初からやり直しになる。

パイプラインあたりを勉強しる!
0735デフォルトの名無しさんNGNG
すいませんアセンブラの初歩の質問させてください

push ebp   ・・・・ア
この次の行で
mov ebp,esp  ・・・・イ
こうする事になんの意味があるんでしょうか?

「ア」でebpの値(仮にA)がスタックespに保存され、
「イ」ではスタックの最新の値(つまり、A)がebpに上書きされるだけで
ebpはA→Aで何も変化しませんよね?2行目はいらないんじゃ・・・
0736デフォルトの名無しさんNGNG
>>732
細かい事は気にしないほうがいいよ
0737デフォルトの名無しさんNGNG
ebp はスタックフレームとして使います。
 ebpを基準にローカル変数や引数をアクセスするわけです。

別の関数を呼ぶと、その関数の中で新しくスタックフレームを作り
関数終了時に呼び出し前の状態に戻さなければいけません。

そこで、push ebp で ebpを保存しておいて
mov ebp,esp で現在のスタックポインタを ebpに持ってくるわけです

関数終了時は逆に esp<-esp にして pop ebp する事になります。

0738407NGNG
>>735

> 「イ」ではスタックの最新の値(つまり、A)がebpに上書きされるだけで
ここが間違っとる。
espの値がebpに入るんだよ。スタック上の値じゃない。
0739デフォルトの名無しさんNGNG
>>735
mov ebp,esp と mov ebp,[esp]の違いが分かるか?
0740725NGNG
>>730をはじめとして、説明がわかりやすかったです。

ありがとうございました。
0741735NGNG
わかりますた。ありがとうございます
0742デフォルトの名無しさんNGNG
アセンブラ最高!
0743デフォルトの名無しさんNGNG
質問お願いします。とあるソフトの、あるアドレスが持つデータを
監視したいと思っています。ところが調べてみたところ、
このデータのアドレスが、毎回変わってしまうことに気づきました。

そこでそのアドレスを保持している箇所を調べてみました。
そこが固定な数値なら良かったのですが、実際は下記の通りで詰まってしまいました。

MOV DWORD PTR DS:[ESI+32],1

はたしてこのESIの値を特定することは、がんばれば可能なのでしょうか?
当方「はじめて読む8086」を読んだ程度しか無いので、
どんな些細なアドバイスでも頂ければ嬉しいです。

0744743NGNG
自分でいうのもなんですが、これだけじゃあまりにも情報不足ですね・・・
0745デフォルトの名無しさんNGNG
デバッガでその命令にブレークをかけて、周辺コードを脳内バックトレーサに入力。
0746743NGNG
>>745
レスありがとうございます。凄い助かります。
やはり地道に追うのが一番なんですね。固定値でるまでやればいいのかな・・・。
貧弱な脳内ですが、ブレークポイント置きまくりで頑張ってみます。

しっかし難解ですねぇ(´Д⊂
0747デフォルトの名無しさんNGNG
そのコードの、その部分のソースを持ってはいないの?
0748デフォルトの名無しさんNGNG
> 毎回変わってしまう
これが何の毎回かわからないけど、
その命令にブレークかけて、その時点のレジスタの値でデータのアドレスは
算出できるから、変わってしまうまではそのアドレスで監視できないの?
0749743NGNG
皆さん、おつき合いありがとうございます。

>>747
はい、残念ながら無いみたいなのです…(一応うちの専用ツールみたいですが)

>>748
言葉足らずですいません。毎回=対象ツールを起動する毎にです。

748さんの仰る通りにできる技術が、私にあれば良いのですが(´Д⊂
実際はReadProcessMemoryで、そのツールの指定アドレスを監視するのが精一杯でして・・・。
(Win環境で、監視ツール自体はC&WinAPIで書いてます)

しかしレジスタの値を、読めれば本当に一発ですね。
読むタイミングは問題無さそうなので、レジスタの読み方を勉強してみます。感謝です。
0750743NGNG
> 読むタイミングは問題無さそうなので

これは失言でした・・・そんな単純じゃないですね。
0751デフォルトの名無しさんNGNG
>>749
Windowsなのか
だったらHookを使ってDLLを読ませてコード自体にパッチを当てるのが楽
0752743NGNG
>>751
馴染みのある言葉が、出てきてホッとしたのも束の間、
理解できる頭がなかったりで・・・。DLLの置き換えや
グローバルフックの事では無いですよね。

ちょっと検索したくらいじゃ分からなくて(レジスタの方も)・・・、
折角良いアドバイス頂いたのに、生かせなくて情けないやら不甲斐ないやら。
もう少し修行して出直してきます。方向示唆、ありがとうございました。
(それでもアセンブラ、面白いですねぇ)
0753デフォルトの名無しさんNGNG
最近、気がついたのですが…
以下のアセンブラコードを出力させると
#include <windows.h>

extern int f(int x);

void g()
{
  f(0);

  GetDC(0);
}

f()については、push/popが組になっているのですが
GetDC()についてはpushだけでpopがなく、
組になっていないのですが…なぜでしょうか?
なんか怖いのですが
0754デフォルトの名無しさんNGNG
APIはpascalスタイルだからですよ。
0755753NGNG
>>754
ごめんなさい、これだけではよくわかりません…

もう少し詳しくお願いします
0756デフォルトの名無しさんNGNG
>>755
MSDN読めってことですよ
cdecl
stdcall
で検索
0757デフォルトの名無しさんNGNG
754じゃないけど、スタックを元に戻すのが「呼び側の担当」か
「呼ばれ側の担当」かっていうルールが、言語毎にあるんでしょ?
0758デフォルトの名無しさんNGNG
規定している言語もあるし、規定していない言語もある
0759753NGNG
なるほど、呼び側/呼ばれ側のどちらが
引数についてのスタック管理権を持つか、
ということか…

Win32APIは、全部が__stdcallなのでしょうか?
http://msdn.microsoft.com/library/en-us/vclang/html/_core___stdcall.asp?frame=true
の最初に
The __stdcall calling convention is used to call Win32 API functions.
とあるけど…
0760デフォルトの名無しさんNGNG
> Win32APIは、全部が__stdcallなのでしょうか?

注意書きがない場合はすべてそうです。
0761753NGNG
なるほど、わかりました。
解決できて、すっきりしました。
どうもありがとう
0762デフォルトの名無しさんNGNG
今68000アセンブラとCVME-680マイコンを使って
モニターの機能を作りました(単に打った文字を表示するだけw)
そんでその機能をつかって簡単なタイピングを作ろうと思うのですが
バックスペース、エンター、カーソールキーを押すことでいろいろな
動作を行いたいのですがマイコンの方でどのようにこれらのキーを
押したことを判定すればいいのでしょうか?たとえばAという文字を
打つならマイコンの方でAにあたるアスキーコードで判定できるわけですが
これらのキーにもアスキーコードなりなにか割り当てられているのでしょうか?
0763デフォルトの名無しさんNGNG
>>762
機種依存なのでなんとも言えない。
エコーバックするプログラムが組めるんなら、
文字コードを表示するプログラムでも組んで確かめてみたら?
0764デフォルトの名無しさんNGNG
>>763
そうっすかー
地道に調べてみます・・・
0765デフォルトの名無しさんNGNG
>>751
ちとオレも詳細キボンしていいかな
アプリやゲーム起動するごとに、それを感知してコードを書きかえるってこと?
違うか…
0766デフォルトの名無しさんNGNG
>>765
いやその通り

MOV DWORD PTR DS:[ESI+32],1
と前後の命令をサーチしてCALL命令なりに書きかえれば
ESIが得られるのではないかという話
0767765NGNG
>>766
のるほど、なるほど、いや凄いやり方があるもんだな
一つ賢くなったよ、レスサンクスです
0768デフォルトの名無しさんNGNG
MIPSのR系のCPUのLinuxでアセンブラなんですが、cからソースを
吐かせると擬似命令で.cploadや.cprestoreが使用されてるんです。
デバッガで見ると擬似命令のところにレジスタに値を入れてるような
コードが・・・このcpload等の擬似命令がなんのものかご存知ないで
しょうか?

PIC(position-independent code)には必要とかなってて、どうも外部
ライブラリを呼び出す時に必要らしい?ところまではわかったのです
が、正確にはわからないでいます。ライブラリを呼び出さないサブルー
チン自身でも上記擬似命令で使用していないレジスタ操作をして、上
位にリターンして他の関数にはいったらまた破壊され・・・となんの役に
も立ってないように見えるんです。実際に削ってコードかいても一応
動作したりするのでより混乱してます。
0769デフォルトの名無しさんNGNG
『MIPSpro Assembly Language Programmer’s Guide』に書いてない?
Webからpdfが落とせるはず。
0770デフォルトの名無しさんNGNG
gpレジスタ相対で変数をアクセスするためのコードだったと思う。
gpレジスタ使うシステム(libraryが使ってるとか)じゃなければ必要ないので、
gcc -mno-abicalls すればよろし。出力されないよ。
0771768NGNG
>769
早速落として読んでみます。

>770
たしかにデバッガでみてみるとgpレジスタを更新してたような気がします。

正確にはマニュアルを読んで確認となるんでしょうが、教えていただいてgpレ
ジスタ相対のためのものって言うのがわかってかなりすっきりしました。
お二方ありがとうございました。
0772デフォルトの名無しさんNGNG
計算結果として例えば17が返って来て
それを表示するにはどうすればいいっすか?
アスキーコードしか使えない場合のみでお願いします
1を表示するには数値0x31、7を表示するには数値0x37
を入力するようにすればいいのですが17をどうやって
その二つに分ければいいのやらわからないっす
0773デフォルトの名無しさんNGNG
アセンブラに関係ないような・・・
10の桁・・・10で割った数値に0x30足す
1の桁・・・10で割ったあまりに0x30足す
0774772NGNG
確かに関係ありませんね
すみませんです・・・
68kアセンブラで割り算ができないのですが
その場合は地道に引き算しかないですか?
0775デフォルトの名無しさんNGNG
>774
>68kアセンブラで割り算ができないのですが

意味が分からない。
本当にアセンブラが割り算命令を解釈できないなら
命令コードを直接数値で書いてしまえばいい。
0776デフォルトの名無しさんNGNG
Z80って、まだ現役ですか?
0777772NGNG
>>775
できました!どうもありがとうございました
確かにアセンブラでやる必要ナッシングですね(w

まったくアセンブラに関係ない質問すいませんでした
0778デフォルトの名無しさんNGNG
>>774
これこれ、嘘はいけません。
divs/divu命令ありますがな。

68kのアセンブラなら、ぐぐれば過去の遺産が大量に引っかかるはず。

0779デフォルトの名無しさんNGNG
>>778
むちゃくちゃ遅いがナ
0780デフォルトの名無しさんNGNG
divって、フラグに影響がでる(変更される)けれど、
その値は不定なのでしょうか?

なんだか妙な感じにみえるのですが
0781780NGNG
あ、直前で68kの話題がでてるけど…

私のは関係無くて、Intel系の話です
0782デフォルトの名無しさんNGNG
>781
8086とか最初のころに未定義としてしまったから、以降もわざわざ
定義せずにいるほうがプロセッサの実装が楽になるかもとかあった
のではないでしょうか?
最近だとちゃんと命令順に実行されないので更に複雑怪奇なフラグ
反応になってるか、NOPのように無反応とかかも・・・
0783772NGNG
>>778
あ、検索にひっかかりましたね・・・
日本語のサイトばっか探してたんでダメだったみたいです(w
これからはそれをつかってやります(やっぱ見にくいし)

引き続き駄レスすみませんでした
0784デフォルトの名無しさんNGNG
>>782
つまり、不定ということですか?

歴史的な理由があったのですか…しらんかった

フラグを使えないのは不便だな〜
0785デフォルトの名無しさんNGNG
>>776
本家ザイログ製のZ80はだいぶ前に製造中止だが、
互換チップは何種類か生産されていて現役。
Z80プログラムの需要もある。
0786デフォルトの名無しさんNGNG
アセンブラコードを出力すると、関数の先頭で、
以下のようなコードをよくみます
push ebp
mov ebp,esp

この時点でebpとespが同じ値を持ってますが…

アセンブラがわざわざmovしているのだから、
ebpにespの値をセットしておくことは重要だ
(プログラマはebpレジスタを破壊してはいけない)
と思いました。

それでは、もともとその値を保持していたespレジスタは、
もはや破壊してよい
(プログラマはespレジスタを自由に使ってよい)
といことなのでしょうか?

つまり、関数の中で
自由に使ってよい...eax,ebx,ecx,edx,esi,edi,esp
使えない...ebp
ということでしょうか?
0787デフォルトの名無しさんNGNG
>>786
> それでは、もともとその値を保持していたespレジスタは、
> もはや破壊してよい

まあこれはいいとして (よくないけど) ...

> 自由に使ってよい...eax,ebx,ecx,edx,esi,edi,esp

なんでこんな結論に至るんだ ?
eax, ... edi は保存されて無いだろ。
0788デフォルトの名無しさんNGNG
>>787

>なんでこんな結論に至るんだ ?
>eax, ... edi は保存されて無いだろ。

保存しておけば、自由に使っていいのですね?

これらのレジスタを使ったら、保存するコードを
プログラマが書かなくても、アセンブラが自動的に
追加してくれているようでした(ありがたいことだ)

ところで、

>> それでは、もともとその値を保持していたespレジスタは、
>> もはや破壊してよい

>まあこれはいいとして (よくないけど) ...

これは、どういうことでしょうか?
いい?わるい?
どっちでしょうか?
espもebpも、そのまま触れないでおくのでしょうか
0789デフォルトの名無しさんNGNG
あまりにもくだらなすぎるしつもんのためまじめにこたえる
きがおきまへん。
0790デフォルトの名無しさんNGNG
マジレスするならコンパイラ依存
0791デフォルトの名無しさんNGNG
>>790
> マジレスするならコンパイラ依存

わかりました。

スレを汚して失礼しました。

あ〜
0792デフォルトの名無しさんNGNG
しょうもない質問で非常に申し訳無いんですけど
特定の値に序所に近づけていくためのコードを究極にまで高速化したいんですけど
良い方法ないですかね?、3ヶ月ほど悩んでるんで。
無かったら放置でお願いします、
まぁ微妙にスレ違いですけどほかに適所がみつからなかったんで、
C言語か86アセンブラでお願いします

int value = xxx;
int value_target = 5120;

void func(){
  if(value < value_target)value++;
  if(value_target < value)value--;
}
0793デフォルトの名無しさんNGNG
そんなに何度も呼ばれるのか?
0794デフォルトの名無しさんNGNG
サウンドプログラミングでつ。
秒間41000かいよばれます
0795デフォルトの名無しさんNGNG
間違え、44100
0796デフォルトの名無しさんNGNG
こんなもんCでもアセンブラでもかわらん。意味ない
0797デフォルトの名無しさんNGNG
Pen3ぐらいあれば44100回/secぐらい余裕だと思うけど
0798デフォルトの名無しさんNGNG
これらを変数10*16個に対して行うんで、
まぁ結局条件分岐つかうしかないんですかね…
0799796NGNG
あえて書くなら(value>0 を仮定)

MOV EAX,[value]
MOV ECX,[value_target]
CMP EAX,ECX
ADC EAX,0
CMP ECX,EAX
SBB EAX,0
 
value<0もあるなら普通に汁
0800デフォルトの名無しさんNGNG
>>798
ADC r/m,0
SBC r/m,0
0801デフォルトの名無しさんNGNG
サウンドだから負もあるだろうよ
0802デフォルトの名無しさんNGNG
かぶった
しかもSBCはZ80だった
0803デフォルトの名無しさんNGNG
>>799 800
なるほど、サンクス。
しかしこれ、変化量1以外だと無理っす…

ようするにあきらめて条件分岐しろってことですかね
0804デフォルトの名無しさんNGNG
SBB EAX,EAX
AND EAX,任意
ADD 何か,EAX
とか

クリッピングがレアケースなら
分岐予測に任せた方が速い場合もあるよ
0805796NGNG
value_target>0も仮定しなきゃいかんのか

>>803
MOV EAX,[value]
MOV ECX,[value_target]
CMP EAX,ECX
SBB EDX,EDX
AND EDX,-変化量
ADD EAX,EDX

後半は自分で考えて
0806796NGNG
おっと今度は俺がかぶった・・・まあ定番テクだな
ちったは勉強汁!>>803
0807デフォルトの名無しさんNGNG
勉強不足を実感しますた、もっと勉強します。

どうもありがとうござました。
0808デフォルトの名無しさんNGNG
っていうか1ヶ月前、CMPでどうやってフルビットたてたり消したりするか
ずっと悩んでたんだけどまさかSBBを使うとは…

こういうのってアセンブラやってる人にとっては常識っぽいけど
どうやって勉強してるんですか?

まぁそれを調べるのからして
自分でしなきゃダメって言われたらもうそのとおりなんですけど。
0809デフォルトの名無しさんNGNG
>>808
99%の努力(人のソースを読む、コンパイラの出力を読む、gccのソースを読む)、
そして1%のひらめき。
0810デフォルトの名無しさんNGNG
嫌いな言葉:努力
0811デフォルトの名無しさんNGNG
>>788
> これは、どういうことでしょうか?
> いい?わるい?

いいか悪いか自分で判断できないなら使うなよ。
0812デフォルトの名無しさんNGNG
AXレジスタの値によってキャリーフラグを設定したいのですが
AX == 0 -> CF = 0
AX != 0 -> CF = 1
とするにはどうすればいいのでしょうか?
0813デフォルトの名無しさんNGNG
>>812
CMP AX,1
無理してアセンブラ使わないほうが良いんじゃない?
0814デフォルトの名無しさんNGNG
>>812
これって AX == 2 のときでもキャリーフラグが立つのでしょうか?
0815デフォルトの名無しさんNGNG
0のときに立つからCMCで反転して
0816デフォルトの名無しさんNGNG
>>815
あぁ、なるほど!

どうもありがとうございました
0817デフォルトの名無しさんNGNG
AXが壊れていいなら -1 を加算
0818デフォルトの名無しさんNGNG
void main() {
   register short int a = 100;
   register short int b = -200;
   a = b / 2;
   if ( a > b )   a = 1;
   else       a = 0;
}
上のCソースに対してgcc -Sを使って吐かせると、
a = b / 2の部分が以下のように出力されました。
movl   $-200, %edx
movl   %edx, %eax
sarw   $15, %ax
shrw   $15, %ax
leal   (%eax,%edx), %eax
sarw   %ax
私は、この部分は、算術右シフト命令のsarだけで終わると
予想していたのですが・・・。
なぜ上のようになるのでしょうか?
どなたか教えてください。
0819デフォルトの名無しさんNGNG
負数の割り算はsarじゃすまないヨー
0820818NGNG
やっと分かりました!つまり、
符号を表す最上位ビットを取り出して、
それを加算することによって0の方向に丸められるようにする
これで、あってますか?
これで一応解決しましたが、気になる所が・・・
先ほどのアセンブラの
sarw   $15, %ax
shrw   $15, %ax
この部分は、なぜ算術右シフトをした後に、シフトしているのでしょうか?
シフトだけで良いような気がするのですが・・・。
0821デフォルトの名無しさんNGNG
MSBをLSBに持ってくるだけだから、論理シフトだけでいいという事だね
0822818NGNG
>>821
そういうことです。論理が抜けてましたね。
算術右シフトをしないと何か困ることでもあるのでしょうか?
0823デフォルトの名無しさんNGNG
確かにsarwは不要だと思うよ。
たぶんさ、short にしてるでしょ? だからそこまで最適化されてないんじゃないの?
コンパイラにしては頑張ってるコードだと思うよ。

自分なら符号付1/2は 左シフトして Add With Carry して算術シフトかな
0824818NGNG
>>823
> 確かにsarwは不要だと思うよ。
> たぶんさ、short にしてるでしょ? だからそこまで最適化されてないんじゃないの?
> コンパイラにしては頑張ってるコードだと思うよ。
なるほど。
> 自分なら符号付1/2は 左シフトして Add With Carry して算術シフトかな
おぉ、そういう方法もありますね。
16ビットシフトして最上位ビットがキャリーフラグに入るのを利用する、ということですね。

いろいろと勉強になりました。最後にひとつ。
sarw %axはsarw $1, %axと同等ですよね?
0825デフォルトの名無しさんNGNG
シフト回数を省略したら普通1だよね。

他に sar 15bit して 元から引くという方法もあるね
0826818NGNG
>>825
な、なんと。-1を引いて、+1の加算ってことですか。
高級言語なら1行ですけど、その1行の部分に
様々な発想が生まれますね。
アセンブラはおもしろいですね。
0827デフォルトの名無しさんNGNG
-O3 くらいにしたらもっとマトモなコード出さねーか?
0828812NGNG
>>817
> AXが壊れていいなら -1 を加算

これもスゴイ!

どうもありがとうございます
0829786NGNG
>アセンブラコードを出力すると、関数の先頭で、
>以下のようなコードをよくみます
>push ebp
>mov ebp,esp

786でこんな質問をしました。

なんとなく意味がわかってきた気がするのですが、
以下であっていますか?

ebpはこの関数でこれから使うスタックの先頭を指し、
espはスタックの最後を指す。
スタックの最後とは、この関数で使うスタックの最後でもあるし、
プログラム全体で使っているスタックの最後でもある。

C++のコンテナクラスのbegin(),end()に似ている。
0830786NGNG
>>829続き

文字列でたとえると、
|      ↓ebp    ↓esp
|■■■■□□□□□
|
←メモリの後方   メモリの前方→

ebpの値を保存し、ebpにespの値をいれる事で
部分文字列の先頭をセットする。
この先頭の位置を基準にして文字を追加していく。
追加するたびに最後の位置を表すespが進む。

関数の最初でebpとespが同じ値になっているのは
まだなにも追加していないからだ。

push eax と書いてある場合、espはここに表示されてないが
espの値は変更される。

ebp,espともに大事な値を管理しているので
破壊してはならない。
0831デフォルトの名無しさんNGNG
push ebp
mov ebp,esp
とするのは、そのようにした方が関数の引数やローカル変数が扱いやすいから。
引数やローカル変数はスタック上に置かれるが、espを基準にアクセスすると
push/popするたびに基準の位置が変わってしまって面倒。そこで、関数に
入った時点のespの値をebpに入れて、以降はebpを基準にアクセスする。
最近はめったに使われないが、これのための命令としてenter, leaveというものもある。
0832デフォルトの名無しさんNGNG
コンパイラによっては、全てESPでスタックを見る最適化を
する。この場合、EBPはレジスタ変数として使える。

EBPを使う場合は命令長が短くなるのがメリット、なんだけど、
Pentium以降のコードキャッシュが大きいCPUでは殆ど意味が
ないんじゃないかと思う。
0833デフォルトの名無しさんNGNG
>>829
gcc だと omit-frame-pointer あたりで抑制可能。
それやっておくと、ebp+4 が常にreturn address となって色々ハッピーなのだよ。
0834デフォルトの名無しさんNGNG
( ゚∀゚)
0835デフォルトの名無しさんNGNG
(A) mov edi, offset global_x

offsetってアセンブラがアセンブル時に
解決してくれるのでしょうか?
(global_xは大域変数です)

(A)は「レジスタに即値を転送」ですか?

(B) mov edi, offset global_x+4
この例もそうですか?足し算をしてますが…
0836デフォルトの名無しさんNGNG
実際にアセンブルすりゃすぐわかるでしょーが

どいつもこいつも質問する奴は手を動かさないカスばかり
0837デフォルトの名無しさんNGNG
そういう低級労働者特有の発想はやめてくれない?
0838( ´-`)y-~~~NGNG
あっそ
0839デフォルトの名無しさんNGNG
寂れてるな・・・
0840MMX初心者NGNG
大量データのコピーに、MMXを使うとrep movsdより遅くなるみたいなんです。
自前でループする時のコストが高いのかな。
0841( ´-`)y-~~~NGNG
>>840
アラインメントはok?
>>414 でも参照しれ
0842MMX初心者NGNG
>>841
ありがとう。
アラインメントは16バイト、アンロールは1回行なっています。
もう少しディープにやってみまつ。
0843デフォルトの名無しさんNGNG
>>840
とりあえず、ソースさらせ
話はそれからだ
0844840携帯NGNG
>>843
PC壊れた(涙
どうもグラフィックカードが曲がった感じです。
ケーブル抜かずに引っ張り出したのがいけなかったみたい。
修理後、ベンチやり直して今回の謎(漏れだけか?)を解明したいと思います。

という訳で次の方どうぞ。
0845デフォルトの名無しさんNGNG
 ヴぁ
0846デフォルトの名無しさんNGNG
Linux上でx86系アセンブラの勉強を始めたいのですが、
何かいい書籍orサイトありますか?

アセンブリ言語はほとんど未経験なので、本当に初心者向けのものがいいです。
0847デフォルトの名無しさんNGNG
$gcc −S
が一番じゃね?
0848デフォルトの名無しさんNGNG
答えられる人だけでいいです...
0849デフォルトの名無しさんNGNG
しかたねえな
http://www.nk.rim.or.jp/~jun/lxasm/asm_idx.html
http://www.geocities.com/SiliconValley/Ridge/2544/asm/assembler.html
0850デフォルトの名無しさんNGNG
THX!!!
0851デフォルトの名無しさんNGNG
Linuxのフレームバッファを使ったメガデモって無いの?
0852デフォルトの名無しさんNGNG
浮動小数点命令を使いたいのですが、汎用レジスタから浮動小数点レジスタへ
値を直接転送することはできないのでしょうか?

汎用レジスタで計算したあと、いちいちメモリに書きこんで、
それをロードする形式をとっているのですが、もどかしく感じます。
(特に、関数を呼び出して、その返り値を使うとき)
0853デフォルトの名無しさんNGNG
>>852
ああ? CPUは何かね?
0854840 MMX初心者NGNG
自己解決しました。
movntq[MMX2]なんてあったんですね。

また質問お願いします。
PIIIからP4に変えたのですが、
P4で正確に実行クロック数を測定するのは無理ですか?
いろいろやってみたのですがダメでした。
HTは無効にしてあります。
宜しくお願いします。
{PIIIの時のソース}
xor eax,eax
cpuid
rdtsc
mov start,eax
mov start+4,edx
xor eax,eax
cpuid
[テストしたいコード]
nop
nop
xor eax,eax
cpuid
rdtsc
mov end,eax
mov end+4,edx

テストしたいコードがある時と無い時の差を実クロックとしています。
0855852NGNG
>>853
Pentium2です

それから、実は
movd mm0, eax
って、内部では
レジスタ→メモリ→レジスタ
という動作をしているのだろうか…?
0856デフォルトの名無しさんNGNG
なんども繰り返したときの平均値しかわからんねえ。
0857デフォルトの名無しさんNGNG
>>855
は?なんでそう思うんだよ
0858855NGNG
その…
・汎用レジスタと浮動小数点レジスタは直接やりとりできない(?)
・MMXレジスタと浮動小数点レジスタは同じもの
と思ったからです。

そんなことはなく、汎用レジスタとMMXレジスタは
直接やりとりできるのか
0859デフォルトの名無しさんNGNG
妄想はダメyo
0860デフォルトの名無しさんNGNG
のもるあ
0861デフォルトの名無しさんNGNG
あるもの
0862デフォルトの名無しさんNGNG
>>858
そうかもしれない。
0863デフォルトの名無しさんNGNG
>・MMXレジスタと浮動小数点レジスタは同じもの
ソフトウェアから見たら同じに見えるだけで、内部的には別物じゃなかったか。
0864デフォルトの名無しさんNGNG
>>863
命令上、別のレジスタに見えるけど、内部は同じもの
じゃないの?
0865デフォルトの名無しさんNGNG
IA-32の仕様では同じもののはずだけど
PenIIから内部的に別レジスタになったんじゃなかったかな
仕様との辻褄あわせをどうやってるかは知らない
(ペナルティが発生する?)
0866デフォルトの名無しさんNGNG
byte p[4]; とした時、
  movd mm0, p
  pxor mm1, mm1
  punpcklbw mm0, mm1
  movq mm2, mm0
  punpcklwd mm0, mm1
  cvtpi2ps xmm0, mm0
  punpckhwd mm2, mm1
  cvtpi2ps xmm1, mm2
  movlhps xmm0, xmm1
で、p を xmm0 に入れることができたのですが、もうちょっと簡単な(効率が良い)やり方があったら教えてください。
同様に
  cvtps2pi mm0, xmm0
  packssdw mm0, mm1 //packusdw が何故か無い・・・
  shufps xmm1, xmm1, 78
  cvtps2pi mm2, xmm0
  packssdw mm2, mm1 //packusdw が何故か無い・・・
  packuswb mm0, mm2
  movd p, mm0
で、xmm0 を p に戻すことができたのですが、もうちょっと簡単な(効率が良い)やり方があったら教えてください。
0867デフォルトの名無しさんNGNG
拡張命令のニモニックってなんか滅茶苦茶だよな
0868デフォルトの名無しさんNGNG
上の方
L2:

下のほう
movl$1,%eax
addl%eax,%ebx
movl%ebx,-16(%ebp)
movl$100000,%eax
cmpl%eax,%ebx  ←ここについて突っ込み無用(w
movl-16(%ebp),%eax
movl-8(%ebp),%ebx
jlL2:
な感じしたんですけどjlでL2のアドレス(004010CB)に飛ばず
おかしなアドレス(003FDECB)に飛んでSegmentation faultが
発生するんです。

何かご存知の方がいたらご教授ください。
お願いします。
0869デフォルトの名無しさんNGNG
>868
標準語でおながいします。
0870デフォルトの名無しさんNGNG
0,7秒間隔で信号をだすには
どう組めばいんでしょか?
0871_NGNG
http://homepage.mac.com/hiroyuki44/jaz09.html
0872_NGNG
http://homepage.mac.com/hiroyuki44/
0873デフォルトの名無しさんNGNG
>870
スレ違いの悪寒
0874デフォルトの名無しさんNGNG
デバッグ中に、
0040128E 8B 8D 50 E5 F9 FF mov ecx,dword ptr [ebp-61AB0h]
00401294 29 C7 sub edi,eax
00401296 01 F7 add edi,esi
00401298 8D B5 54 E5 F9 FF lea esi,[ebp-61AACh]
0040129E 89 7D D4 mov dword ptr [ebp-2Ch],edi
004012A1 8B 7D F4 mov edi,dword ptr [ebp-0Ch]
004012A4 B8 01 00 00 00 mov eax,1
004012A9 01 C3 add ebx,eax
004012AB 89 5D F0 mov dword ptr [ebp-10h],ebx

というコードが、0040129Eのmov命令を実行すると

0040128E 8B 8D 50 E5 F9 FF mov ecx,dword ptr [ebp-61AB0h]
00401294 29 C7 sub edi,eax
00401296 01 F7 add edi,esi
00401298 8D B5 54 E5 F9 FF lea esi,[ebp-61AACh]
0040129E 89 db 89h ←変わってる
0040129F 7D db 7dh ←変わってる
004012A0 D4 8B aamb 8Bh ←変わってる
004012A2 7D F4 jge 00401298 ←変わってる
004012A4 B8 01 00 00 00 mov eax,1
004012A9 01 C3 add ebx,eax
004012AB 89 5D F0 mov dword ptr [ebp-10h],ebx

ようになってしまうんです。
何かご存知の方がいたらご教授ください。
お願いします。
0875デフォルトの名無しさんNGNG
>>874
IDEのバグじゃないの?
なに使っているか位書かないと。
0876デフォルトの名無しさんNGNG
>$-1
そんな現象出会ったことないよ。
デバッガのバグか、自分のプログラムが悪いと思う。
0877876NGNG
>875
寂れたスレだと思ってゆっくり書いたら・・・


割り込まれた!
0878デフォルトの名無しさんNGNG
せめて前後のレジスタの値とかもうちょっと情報を
0879875NGNG
>>877
すまそ。
漏れも結構時間かけたんだが。

バイナリは変わってないから、バグだと思うけどねえ。
0880>>874NGNG
>>875-879
レスありがとうございます。
すいません、IDEはVisual Studio.net(vc7)です。
レジスタ値は、mov前が
EAX = 0000000F EBX = 00000000 ECX = 00000004 EDX = 0000000D ESI = 007AE2F4
EDI = FFFFFFF4 EIP = 0040129E ESP = 007AE297 EBP = 0080FDA0 EFL = 00000282
CS = 001B DS = 0023 ES = 0023 SS = 0023 FS = 0038 GS = 0000
OV = 0 UP = 0 EI = 1 PL = 1 ZR = 0 AC = 0 PE = 0 CY = 0

mov後が
EAX = 0000000F EBX = 00000000 ECX = 00000004 EDX = 0000000D ESI = 007AE2F4
EDI = FFFFFFF4 EIP = 004012A0 ESP = 00000004 EBP = 0080FDA0 EFL = 00000282
CS = 001B DS = 0023 ES = 0023 SS = 0023 FS = 0038 GS = 0000
OV = 0 UP = 0 EI = 1 PL = 1 ZR = 0 AC = 0 PE = 0 CY = 0

となっています。

元々、Visual Studio6が入っていたのですが、.netを少し使うために、
余計なことを考えずに済むようvmware上にVisual Studio.netを
入れたのですが、VS6上ではこのような現象がおきていないため
vmwareが何か関係しているのかな?と、今は考えています。
もちろんVS7のバグの可能性もあるのですが。。。

>>868ではないのですが、868のようなジャンプ先アドレスの
異常もあったりしました。vmware上での開発で何か不具合が発生する等
ご存知の方がいればぜひ教えてください。

ありがとうございました。
0881デフォルトの名無しさんNGNG
EIPが2しか進んでいないし
ESPがとんでもない値になってるな

まあVMwareのバグだろうね
0882山崎 渉NGNG

 __∧_∧_
 |(  ^^ )| <寝るぽ(^^)
 |\⌒⌒⌒\
 \ |⌒⌒⌒~|         山崎渉
   ~ ̄ ̄ ̄ ̄
0883デフォルトの名無しさんNGNG
80x86系でModR/Mバイトがさっぱりわからないのですが、
このあたりの事について初心者向けに詳しく説明した
HPはありませんか?
0884デフォルトの名無しさんNGNG
>>883
HPは知らんが
http://pc2.2ch.net/test/read.cgi/tech/1035288252/
のスレで詳しく騙ってた香具師がいるよ
0885883NGNG
読んでみましたが、難しすぎました。
http://pc2.2ch.net/test/read.cgi/tech/1035288252/173-
0886デフォルトの名無しさんNGNG
>>883
取り敢えず、そこのMODRMの説明で分からなければ
もう1度、最初から勉強した方が良い
0887883NGNG
ちょっと解りました。

例えば、
MOV EAX,EBX // 89 D8
は MOV r/m32,r32 なので、OPコードは 89 /r になる。

/r は、命令のModR/Mバイトにレジスタオペランドとr/mオペランドが
入っている事を示す。 ここが??です。

機械語なら俺に質問しろ!スレで、両方がレジスタの時は mod は 11 とあったので、
次の3ビットが転送元のレジスタ(EBX→011)
その次の3ビットが転送先のレジスタ(EAX→000)
合わせて 11 011 000 = 0xD8

という事ですか? 答えから過程を導き出していますが…。

MOV AX,BX // 66 89 D8
0x66 はアドレスサイズのプリフィックスだそうです。 ここも??。

MOV [EAX],EBX // 89 18
0x18 = 00 011 000

つまり、
MOV r/m32,r32 において、転送元r32は常にレジスタなので、
ModR/Mバイトの真ん中3bitで転送元のレジスタ(8種類)を指定する。
上位2bitと下位3bitで転送先を指定する。
0888デフォルトの名無しさんNGNG
(*´Д`*)ハァハァ
美少女のくっきりワレメが見れるサイトがあった…
http://plaza16.mbn.or.jp/~satchel/idolno_omanko/
0889デフォルトの名無しさんNGNG
ついでに即値の転送もやってみました。

MOV EAX,0x12345678
の場合は、OPコードが B8+rd 。

+rd
単一のオペコードバイトを形成するために、プラス符号の左に与えられた
16進バイトに追加される0から7までのレジスタコード。

B8 にレジスタEAXを表す 000 を足せばいいのかな?

よって、
B8 78 56 34 12

MOV ECX,0x12345678 なら、レジスタECXは001なので
B9 78 56 34 12
0890デフォルトの名無しさんNGNG
>>889
よく出来ました。
足すというのはちょっと違うだろと思うけど結果は同じだしな…
ちなみに0x66は32bitの代わりに16bitレジスタ/アドレスを使うということ。
0891デフォルトの名無しさんNGNG
何となく、Vectorに登録されている、アセンブリ言語で開発された
Windows用ソフトを探してみた。

下の他にはHSPの拡張モジュールくらい。
意外に少ない。探し方が悪かったのかも。

CPUID&クロック周波数チェッカー
http://www.vector.co.jp/soft/win95/hardware/se171927.html

CDプレイヤー
http://www.vector.co.jp/soft/win95/art/se210568.html

汎用プロセスメモリエディタ兼デバッガ
http://www.vector.co.jp/soft/win95/hardware/se254476.html

メモリ解放ソフト
http://www.vector.co.jp/soft/win95/hardware/se221932.html
0892無職 ◆jIL7Zh6bTU NGNG
_asm{
mov a,1
}

cout a << endl;
0893無職 ◆jIL7Zh6bTU NGNG
この_asmってVC限定なんでしょうか?
0894デフォルトの名無しさんNGNG
>>892-893
OpenWatcom ではVCと同じく _asm
BorlandやDigital Marsでは asm か _asm または __asm
0895デフォルトの名無しさんNGNG
char c;
_asm mul c

とやった場合、AXレジスタに値が入るのですが、16ビットの変数がないため型が合わず、値を受け取れません
どうすればいいのでしょうか?
0896デフォルトの名無しさんNGNG
>>895
int ans;
char c;
_asm {
  mul c
  and eax, 0FFFFh
  mov ans, eax
}
とか。
0897デフォルトの名無しさんNGNG
movzxかmovsxでもいいぞ。

それよりも符号付きだからimulつかわんといかんはずだが。
0898デフォルトの名無しさんNGNG
bcc32(5.5.1)を使っているのですが、オプション-rdって機能してますか?

コンパイラに、うまく私の気持ちが伝わらず、registerキーワードを使って
どの変数をレジスタに割り振って欲しいかをはっきり言おうと思ったのですが
この-rdすら無視します(?)

switch文のcaseの偏りが見えているので、それを考慮して
割り振らせたいのです…が、特殊な例(case)のところが
どうしても他と比べて長くなりがちで、たぶんそれで、
特定の変数の使用回数が増えて、だからレジスタに
割り振っているのだと想像しました

その特殊な例の部分を別の関数に掃き出すようにしようかとも
思いましたが…
0899デフォルトの名無しさんNGNG
最近の最適化コンパイラはみんな、プログラマよりも自分のほうが頭がいいと思ってるよ。
0900デフォルトの名無しさんNGNG
そうそう、この前なんか
「( ´,_ゝ`)プッ タブのつもりですか?」
だって。あいつら絶対俺たち舐めてるよ。今度締めなきゃな。
0901898NGNG
ダメポなのか…
0902デフォルトの名無しさんNGNG
( ´Д`)/ <先生! 8086系のLOOP命令遅いんですが
何か使いみちあるんでしょうか?
0903デフォルトの名無しさんNGNG
>>902
過去の遺物です。
命令長短いのでメモリをけちる時はそれなりに便利。
0904デフォルトの名無しさんNGNG
たしかPentium以降では命令長とか意味無くなったな
0905デフォルトの名無しさんNGNG
μopに変換するPentiumPro以降でもデコードとキャッシュで多少は意味があるかもしれん
トレースキャッシュ搭載のPentium4以降ではほとんど意味が無い
0906902NGNG
>903〜905 アリガ�d
0907デフォルトの名無しさんNGNG
SSE2で「整数の」内積演算のプログラミング
をしたいのですが、本がなくてさっぱりわかりません。
例えば、unsigned char a[8] b[8]との内積の和
a[0]*b[0]+a[1]*b[1]+....
をSSE2で書くと、どのようになるのでしょうか。
よろしくお願いします。(_o_)
また、MMXで書いたものはあるのですが、
SSE2に直すことでさらなる速度アップは望めるのでしょうか。
0908_NGNG
http://homepage.mac.com/hiroyuki44/jaz09.html
0909デフォルトの名無しさんNGNG
>>907
マルチイクナイ(・Α・)
http://pc2.2ch.net/test/read.cgi/tech/1056280510/475
0910デフォルトの名無しさんNGNG
>>909 ごめんなさい。
もうひとつのC++版でも聞いてしまいました。
そしたら、アセンブラ版に行けばどうかと、アドバイス
もらったもので。
0911_NGNG
http://homepage.mac.com/hiroyuki44/
0912デフォルトの名無しさんNGNG
開店セール500円より来てーーーー!アダルトDVDを見ようー!
▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼
開店セール1枚 500円より→→→http://www.dvd-exp.com 
最短でご注文いただいた翌日にお届け!→→→http://www.dvd-exp.com 
セルビデオ店の人気商品が24時間お買い物が出来ます。
見やすい画面・注文簡単・時間をかけてゆっくり選んでください!
          http://www.dvd-exp.com←へGO!
0913デフォルトの名無しさんNGNG
版じゃねーよ
0914デフォルトの名無しさんNGNG
「アセンブラ板」でした。すみません。
>>907 です。
誰か助けてください。お願いします。
0915デフォルトの名無しさんNGNG
「スレッド」だろアホ
0916デフォルトの名無しさんNGNG
「アセンブラスッドレ」でした。すみません。
0917デフォルトの名無しさんNGNG
ノルウェーの外注プログラマさんが書いてきたWindowsアプリ、
大部分がアセンブラだった(;´Д`) スゲー

別のCPUのエミュレーションソフトだから、アセンブラで書いた方が
いい部分がたくさんあることは確かなんだが・・・・
(一応アセンブラの他にVC++とVBも使ってましたが・・・

やっぱり向こうの人は凄いんだなぁ。。。

0918デフォルトの名無しさんNGNG
>>917
カコイイ
0919デフォルトの名無しさんNGNG
>>917
VBとアセンブラ併用するなんて面白いな
0920デフォルトの名無しさんNGNG
>>916
nasmのマニュアルに全部書いてあるよ。







英語で。
0921デフォルトの名無しさんNGNG
というかインテルの日本語マニュアルは基本だな >>65 >>710あたりの
0922デフォルトの名無しさんNGNG
>>920 >>921
わお!ありがとうございます。
しばらくマニュアルと格闘してみます。

Visual Studio でSSEを使おうとするだけで、悪戦苦闘でした。
MMXはそのまま使えるのに、SSEは、プロセッサパックなるものを当てなければ
ならない上に、そいつはサービスパック4にしか対応してません。
サービスパック5を当てていた私は、VSのインストールからやり直す羽目に(涙

また、泣きつくこともあるかもしれませんが、よろしくお願いします。
0923デフォルトの名無しさんNGNG
>>922
オイオイ
VS6SP5用のVCPPもあるぞ
0924デフォルトの名無しさんNGNG
>>922
ちゃんと調べろよ
0925デフォルトの名無しさんNGNG
まじっすか?
ttp://www.microsoft.com/japan/msdn/vstudio/downloads/
ここにあるVCPPだと、だめだったんですが…
0926デフォルトの名無しさんNGNG
The Processor Pack requires that you have already installed Microsoft Visual C++ version 6.0 with Service Pack 4 「or greater」.
0927デフォルトの名無しさんNGNG
>>925
ああ?英語サイト見ろよ
0928 NGNG
>>926

それウソだよ。SP5 環境へは適用できない。
SP5 用に vcpp5.exe ってのが別にあります。
0929デフォルトの名無しさんNGNG
お前ら!FFオンラインにひろゆきが来てるぞ!!
直ぐにお前らもこい!!


【遂に!?】ひろゆきがFFオンラインにキター【登場!】
http://game2.2ch.net/test/read.cgi/game/1059577730/2-
0930926NGNG
>>928
あぁ、そうなのか。スマソ
んじゃ、お詫びにこっち貼っておきまつ。
http://msdn.microsoft.com/vstudio/downloads/tools/ppack/download.aspx
0931デフォルトの名無しさんNGNG
みなさん。ありがとうございました。
なんとか、徐々に動き出しました。
また、よろしくお願いします。
0932デフォルトの名無しさんNGNG
ご希望の方は下記のURLをクリックしてください。
開店セール500円より来てーーーー!アダルトDVDを見ようー!
▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼
開店セール1枚 500円より→→→http://www.dvd-exp.com 
最短でご注文いただいた翌日にお届け!→→→http://www.dvd-exp.com 
セルビデオ店の人気商品が24時間お買い物が出来ます。
見やすい画面・注文簡単・時間をかけてゆっくり選んでください!
          http://www.dvd-exp.com←へGO!
0933_NGNG
http://homepage.mac.com/hiroyuki44/
0934_NGNG
http://homepage.mac.com/hiroyuki44/jaz03.html
0935デフォルトの名無しさんNGNG
未だにincが早いと信じてるアフォども!
intelの最適化マニュアルもう一度よく嫁
0936デフォルトの名無しさんNGNG
Pentium4がもっさりなだけだから、心配しなくていいよ
0937デフォルトの名無しさんNGNG
>>935
もしかしてLEAの方が速いとか?
0938デフォルトの名無しさんNGNG
INCはuv命令で1clock命令
LEAが早くなるケースはありえない

lea reg1,[reg2+1]とかの状況依存のケース
があるとでも言いたいのだろう。

0939デフォルトの名無しさんNGNG
おっと、前提条件がなかったので勝手に
Pentiumの話としました
0940938NGNG
当然ながらPentiumProなら著名例がある

INC reg
JC adr

JCでストールする。
0941デフォルトの名無しさんNGNG
Cマガで最適化の特集をやってたとき、Pen4ではincはどんなときでも避けろと
いってたような気がする
0942デフォルトの名無しさんNGNG
↑なんでですの?
コードが短いしバリバリ使ってますが・・・
0943デフォルトの名無しさんNGNG
Pen4なんてクロックまかせに速いんだから
最適化なんて興味おきない
0944山崎 渉NGNG
(^^)
0945デフォルトの名無しさんNGNG
Pentium4 は add 推奨だっけ。
0946デフォルトの名無しさんNGNG
P4のinc/dec命令ではキャリーを保存するために余分な処理が増えるらしい
0947デフォルトの名無しさんNGNG
PenProと違い、Pen4では inc reg は2μOPS。
add reg,1 ならもちろん1μOPS。
Pen4にとってinc/dec命令はトレースキャッシュや実行ユニットを
無駄に消費する長い命令だ。
0948デフォルトの名無しさんNGNG
なんでそんなアホな設計にしたんですか?
0949デフォルトの名無しさんNGNG
アホだから
0950デフォルトの名無しさんNGNG
incも過去の遺物なんだよ。
ワザワザ使う方がアホ。
0951デフォルトの名無しさんNGNG
アセンブラなんか過去の遺物なんだよ。
時代はBASIC。
0952デフォルトの名無しさんNGNG
アセンブラなんか過去の遺物なんだよ。
時代はCOBOL。
0953デフォルトの名無しさんNGNG
アセンブラなんか過去の遺物なんだよ。
時代はPASCAL。
0954デフォルトの名無しさんNGNG
アセンブラより速いといわれるFORTH
これからの時代はこれですよ
0955デフォルトの名無しさんNGNG
じゃFORTRANということで
−−−−−−−−−−−−修了−−−−−−−−−−−−
0956デフォルトの名無しさんNGNG
いやいやAdaということで
−−−−−−−−−−−−再開−−−−−−−−−−−−

0957デフォルトの名無しさんNGNG
やっぱLISPだろ。 LISPマシンならアセンブラは不要だぜ。
0958デフォルトの名無しさんNGNG
やっぱしCということで
−−−−−−−−−−−−初恋−−−−−−−−−−−−
0959デフォルトの名無しさんNGNG
わたしDしちゃった
−−−−−−−−−−−−妊娠−−−−−−−−−−−−
0960デフォルトの名無しさんNGNG
ヽ(`Д´)ノモルァ
0961デフォルトの名無しさんNGNG
このスレッドは胴なしモナーが通り過ぎます。
通り過ぎるだけです、スレには関知しません。

  ∧_∧   ∧_∧   ∧_∧         
 ( ´∀`)  ( ´∀`)  (´・∀・`)    
 (_⌒ヽ  (_⌒ヽ   (_⌒ヽ     
   ,)ノ `J    ,)ノ `J    ,)ノ `J
0962デフォルトの名無しさんNGNG
コートの中身はC++
−−−−−−−−−−−−逮捕−−−−−−−−−−−−
0963デフォルトの名無しさんNGNG
結構昔、Win3.1の人に「MacにはAPIがないから超人じゃないとプログラムが組めない」
とか言われてたのを思い出した。ありがとう。
0964デフォルトの名無しさんNGNG
LAHFって命令「初めての8086」「初めての486」
載ってないのは何で?
0965デフォルトの名無しさんNGNG
>>964
過去の遺産だから
0966デフォルトの名無しさんNGNG
>963
(´<_ ` )フーン
0967デフォルトの名無しさんNGNG
自作しなければならないコントロール類が多かったからな。今は知らんけど
0968デフォルトの名無しさんNGNG
RAD厨はコントロールも自作できないのか
0969デフォルトの名無しさんNGNG
だーれもRADの話なんかしてないし
0970デフォルトの名無しさんNGNG
RAD厨は何かとコントロールの話を出すのでRAD厨かと思ったよ
0971デフォルトの名無しさんNGNG
妄想ですか
0972デフォルトの名無しさんNGNG
3DNow!ってMMXの代替? それともSSEの代替?
0973デフォルトの名無しさんNGNG
>>972
SSEの対抗
0974デフォルトの名無しさんNGNG
3D Now!について参考になるAMDのマニュアルってどれ?
Performanceなんとかというマニュアル?
0975デフォルトの名無しさんNGNG
>>974
http://www.google.com/
0976デフォルトの名無しさんNGNG
>>975
AMDのサイトにあるマニュアルのなかでどれが参考になるのか、きいてるのだが。
0977デフォルトの名無しさんNGNG
AMDにあるとわかってるならそれ以上何を聞く必要があるのだ?
ちゃんと何のマニュアルかかいてるだろ
それでもわからないならせめて全部読むくらいの努力はしような
0978デフォルトの名無しさんNGNG
>>977
全部落とすのが面倒だから聞いてるんだよ。

まあ、聞いてもわからないなら全部落とすけどね。
0979デフォルトの名無しさんNGNG
こんなこと面倒くさがってる奴にアセンブラは無理
0980デフォルトの名無しさんNGNG
たしかにタイトルでわからん奴が内容を理解できるのか疑問

K6-2の頃にあった日本語ドキュメントはなくなってるね
まああるだけ無駄だったけど
0981デフォルトの名無しさんNGNG
         ☆ チン     マチクタビレタ〜
                         マチクタビレタ〜
        ☆ チン  〃  Λ_Λ   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
          ヽ ___\(\・∀・) < 次スレまだ〜?
             \_/⊂ ⊂_ )   \_____________
           / ̄ ̄ ̄ ̄ ̄ ̄ /|
        | ̄ ̄ ̄ ̄ ̄ ̄ ̄|  |
        |  愛媛みかん  |/
0982デフォルトの名無しさんNGNG
>>979
無理なわけないがな。w
まあ全部落とすことにするよ。
>>980
タイトルだけじゃ詳しい内容まではわからん。
0983デフォルトの名無しさんNGNG
intelみたいな数十メガバイトの日本語ドキュメントきぼん
0984デフォルトの名無しさんNGNG
IA32のアセンブラで質問ですが、
レジスタの内容を一時的に退避して、後で使う場合、

・push/popを使う場合
 push eax ;eaxにデータが格納されている
 〜eaxを使う処理
 pop eax
 〜次の処理

・あらためてメモリ上の参照元データからレジスタにロードする場合
 〜eaxを使う処理
 mov eax, DWORD PTR 元データが格納された変数
 〜次の処理

どっちが速いんでしょうか?
(push/popは2クロック掛かるから不利?)
0985デフォルトの名無しさんNGNG
計ってみても明確な差は出ませんでした。
気を使うだけ無駄でしょうか?
0986デフォルトの名無しさんNGNG
push popは2命令あわせて2byte
mov reg, [mem]は5〜6byte
0987デフォルトの名無しさんNGNG
push/popはアクセス先がスタックになる
スタックは1次キャッシュに乗ってる可能性がかなり高い

が、ベンチマークするとどっちもキャッシュに乗るから
差が出ない
0988デフォルトの名無しさんNGNG
>>985
CPUによって当然条件が違うからさ、
後5年くらいしてIA32が完全に枯れてから気を使った方がいい。
まあその頃はIA64で同じような事悩んでるんだろけどね。
レス数が950を超えています。1000を超えると書き込みができなくなります。