トップページ⇒tech
1001コメント276KB

アセンブラ… (;´Д`) ハァハァ

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
アセンブラ全般に関するスレッドです。

【前スレ】
アセンブラ… (*´д`*)アハァ…
http://pc5.2ch.net/test/read.cgi/tech/1076157613/l50
0232デフォルトの名無しさんNGNG
分岐予測ミス
0233デフォルトの名無しさんNGNG
>>201からの説明書いてた者ですが
キャッシュが絡むとどうなるのか分からないんで
「この説明でいいのかなぁ」等と思いながら書いてました。
キャッシュを持たない16bit外部バスのイメージで書いてました。

キャッシュなしで32bit外部バスで、2byte目と3byte目を
組み合わせた16bitを取ってくる場合などを考えてみると
奇数バイトから始まってはいても
境界をまたいでないから
ペナルティーはつかないだろうと思います。
0234デフォルトの名無しさんNGNG
>>231
> 内部外部の区別そのものがなかった
これ間違ってたので訂正。
8086の廉価版である8088は内部16bitで外部8bitだから、内部外部の概念は昔からあったんだった。
16bit(1word)読むのに8bit x 2でやってたらしいけど、それでも速度低下は2割くらいだったらしいから、
いかに昔のCPUのロジックが遅い(クロックペナルティがでかい)かが分かる。
0235デフォルトの名無しさんNGNG
台形公式を求めるプログラムが書けたら神だよな…
0236デフォルトの名無しさんNGNG
http://www.google.com/search?num=50&hl=ja&lr=lang_ja&safe=off&ie=SJIS&oe=SJIS&q=%91%e4%8c%60%8c%f6%8e%ae
023768K + 68881/2NGNG
step equ 512    ;分割数(可変)
 entry
 fmove.b #0,fp1  ;result := 0

 fmove.b #0,fp0  ;result := result + f(0.0) / 2.0
 bsr myfunc    ; 両端は半分にして最初に足す
 fdiv.b #2,fp0
 fadd.x fp0,fp1

 fmove.b #1,fp0  ;result := result + f(1.0) / 2.0
 bsr myfunc
 fdiv.x #2,fp0
 fadd.x fp0,fp1

 move.l #step-1,d0 ;for x := step-1 downto 1
loop:
 fmove.l d0,fp0   ;result := result + f(x/step)
 fdiv.l #step,fp0  ; 中間は関数値をそのまま加えあげる。
 bsr myfunc
 fadd.x fp0,fp1
 subq #1,d0
 bne loop
 fdiv.l #step,fp0  ;result := result / step. 最後に幅で割る。結果はfp0に残る。
 rts

myfunc:      ;積分する関数本体 exp(-(x^2))
 fmul.x fp0,fp0 ;x^2  
 fneg.x fp0   ;-x
 fetox.x fp0   ;exp(x)
 rts
0238台形公式NGNG
× fdiv.l #step,fp0  ;result := result / step. 最後に幅で割る。結果はfp0に残る。
 ↓
○ fdiv.l #step,fp1

か。レジスタ間違えた。
“幅で割る”じゃなくて、幅をかける、若しくは分割数で割る、だね。
最終結果はfp0じゃなくてfp1に入ってる、です。
0239デフォルトの名無しさんNGNG
GJだマイスター。
これで>>227の宿題もバッチリだね( ´ー`)b
0240デフォルトの名無しさんNGNG
      -‐-   
  , ´,     ヽ
  ! ! !リノ从ハ.〉
  l r! krェ rァ|.|  <又吉イエス!!又吉イエス!!
  | | l、 ー .ィ!l
  | /'\V/、ヽl.|
  ! i  く小>  リ
0241デフォルトの名無しさんNGNG
それは「台形公式のプログラム」であって、「台形公式を求めるプログラム」
ではないと思う。
0242デフォルトの名無しさんNGNG
最適化の手法がいくつかある場合
実際にベンチマークとって最適なコードを選択・出力するコンパイラとかできないのかね。
0243デフォルトの名無しさんNGNG
>>242
Java の JIT コンパイラではわりとふつーではないかと。

0244デフォルトの名無しさんNGNG
      _ 〃´─≠⌒Yミ/∧_/(⌒∧//∧ミ
    //´≠`ヾ彡三=三≠=・/=三=・∀\
   //彡ヽヾ)))三=.ノ─ヽ、─=≠三 ミ ミ i
   |/(/UUし彡’               ミミ\ヽヾ !
  /i||iシ/      ∧_∧          \!l |l|| i
  ソli・∀/       ( ;´Д`)        !i li i|l・∀|l
 ||i l |||lつ     (U_U )つ      li  li ((l|lil
 ヽヽ_/|ノ        モナクロサンボ     / //|Y l|/
 \ミミ\ヽ                 / //|/彡
  ミヽ・\ヾ゙、三 ─ = _ __   _≠/// ゴロゴロゴロゴロゴロ…
   ヽとと\≠=( ̄))∧_∧//´(((((三彡∨彡ノ/
    (__ト(((ト三 =》∩ _)≠─=つつ三彡彡
        ─二三__,三二  ,.≫三=三彡
0245デフォルトの名無しさんNGNG
x86でページエントリがTLBに読み込まれるとき、(バーストモードで)複数の
エントリが読み込まれるのか、それとも1つだけ読み込まれるのか?
どうなんでしょう。
0246デフォルトの名無しさんNGNG
バーストモードで複数のエントリがデータキャッシュに読み込まれ、
そのうちの1エントリがTLBに読み込まれる、じゃないかな??
0247246NGNG
データキャッシュじゃなくて2次キャッシュかな?
0248デフォルトの名無しさんNGNG
>>245
メモリアクセスのストライドを4、8、12KB・・・と、それぞれ時間を計測して
みれば分かるんじゃない?
0249デフォルトの名無しさんNGNG
俺の勘としては、TLBに連続ページエントリを一気に入れても、
メリットほとんどないから、そんなことしないと思う。
4Kおきに連続してアクセスするような稀なアプリの性能上げても無意味。
他のページにアクセスに行ったりしたら、
エントリを余計につぶしておいても損する可能性大。
それより、x86じゃ広すぎ。
0250デフォルトの名無しさんNGNG
>>246に同意。
メモリから直接TLBに値が入るということはないとおもう。
AMDはL2にTLB用のキャッシュがあったような。
0251デフォルトの名無しさんNGNG
TLBはアドレス解決時に参照するのでキャッシュアクセスとはそもそもタイミングが違うんじゃないか?
0252デフォルトの名無しさんNGNG
>>251
といっても外から見りゃ普通のメモリアクセスと区別出来ないのでは?
このへんはデータシートに書いてあると思うが。
0253デフォルトの名無しさんNGNG
TLBだけキャッシュスルーしてたら性能にえらい影響が出ると思うが
0254デフォルトの名無しさんNGNG
ttp://www.intel.com/technology/itj/q12001/pdf/art_2.pdf

これの4,5ページを見ると、命令用のTLBはL2からデータをもらっている
ようですね。

P4のデータ用TLBってこの図から見られないんだけど、L1と共用なのかな?
0255デフォルトの名無しさんNGNG
>>254
ftp://download.intel.co.jp/jp/developer/jpdoc/vol6iss1_art01_j.pdf

DTLB はアドレスを物理アドレスに変換します。
DTLB には完全にアソシアティブな64のエントリが
用意されており、各エントリは4K または4MB の
ページのいずれかをマッピングできます。
0256デフォルトの名無しさんNGNG
http://www5c.biglobe.ne.jp/~ecb/assembler/assembler00.html
のHPを見ながらアセンブラの勉強させてもらってるんですが
http://www5c.biglobe.ne.jp/~ecb/assembler/2_5a.html
の練習問題のところで

moval,[si+1]
mov[di+1],al
moval,[si+2]
mov[di+2],al
moval,[si+3]
mov[di+3],al

と書いてあるのですがこれはどういう意味なのでしょうか?
レジスタにoffsetでdata1や2の格納アドレスを代入し
そのアドレス行をずらしたモノをまた代入してると思うのですが
一体なんの意味があるんでしょか?

私的には
movsi,offset DATA1
movdi,offset DATA2
moval,[si]
mov[di],al
これだけでコピーはできているハズだからそれでいいのではないかと思うのです。

後の行のラベルやシステムコールなどについてはいろいろなHPをみたり
して理解できたのですがここの部分だけがどうしてもわかりません。
どうかお力添えをお願いします。

;アセンブラ本って凄く少ないのですね・・本屋を歩き回って見つけたのが4冊・・
0257デフォルトの名無しさんNGNG
最初からやりなおせ
0258デフォルトの名無しさんNGNG
上
al = si[1];
di[1] = al;
al = si[2];
di[2] = al;
al = si[3];
di[3] = al;

下
al = si[0];
di[0] = al;
て事でいいですか?

movsb×3でいいんじゃないかと思うが。
0259デフォルトの名無しさんNGNG
4byte
0260デフォルトの名無しさんNGNG
>>256オメ

mov  eax,[si]
mov [di],eax

の間違いじゃなくて。
関係ないけど、そのページ、内容が古すぎてあまり役に立たないと思う・・・
この前ここに張って有った入門�nより多少ましな感じはするが、どっこいどっこい。
0261デフォルトの名無しさんNGNG
>>257
練習問題までのページを5回、他HPも読み返しているのですがマジでアホでごめんなさい。

>>258
はい。字詰め表示になってしまいました。その通りです。

>>259
4バイトだから4バイト分づらす?う〜んどういうことだろ・・
0262デフォルトの名無しさんNGNG
>>260
ぇ
そうなのですか。
確かにdosのシステムコールなんてもう使わないような気もします
32bitではなく16bitCPU用に書いてあるとも思うのですが
アセンブルに関する資料がネット、書籍ともに少なくて。
0263デフォルトの名無しさんNGNG
DATA1の内容(ABCD)をDATA2にコピーして、DATA2を表示するプログラムを作りたい。

DATA1db'ABCD',24h
DATA2db'0000',24h
              ↓
DATA1db'ABCD',24h
DATA2db'A000',24h
              ↓
DATA1db'ABCD',24h
DATA2db'AB00',24h
              ↓
DATA1db'ABCD',24h
DATA2db'ABC0',24h
              ↓
DATA1db'ABCD',24h
DATA2db'ABCD',24h

0264デフォルトの名無しさんNGNG
DATA1の内容(ABCD)をDATA2にコピーして、DATA2を表示するプログラムを作りたい。

DATA1   db    'ABCD',24h
DATA2   db    '0000',24h
              ↓
DATA1   db    'ABCD',24h
DATA2   db    'A000',24h
              ↓
DATA1   db    'ABCD',24h
DATA2   db    'AB00',24h
              ↓
DATA1   db    'ABCD',24h
DATA2   db    'ABC0',24h
              ↓
DATA1   db    'ABCD',24h
DATA2   db    'ABCD',24h
0265262NGNG
>>264
ご説明ありがとうございます。
dbというニモニックは1バイトの文字を
メモリアドレスのどこかに一行目A 二行目B 三行目C 4行目Dのような形で
順次連番アドレスで一つ一つ格納していくものである。

ラベルはそのdbで定義されたデータの先頭アドレスを示すものである。

よってABCDを求めたいのであればラベルの示す行から3行目、全部で4行を
指定してやる必要がある。

こう言う解釈でよろしいでしょうか?
0266デフォルトの名無しさんNGNG
lodswとstoswがいいな
0267デフォルトの名無しさんNGNG
まあ32ビットでロードストアすれば2命令で済むのは確かだが。
0268デフォルトの名無しさんNGNG
はじめて読むPentium マシン語入門編
ttp://www.ascii.co.jp/books/detail/4-7561/4-7561-4466-7.html
0269デフォルトの名無しさんNGNG
486じゃなくて8086の方のリメークだったか
0270デフォルトの名無しさんNGNG
そもそも真面目に勉強してるのか? この質問者は
0271ぽろじょあ ◆niBmDfC40k NGNG
 <ω>
  |・ ・|
ノ( 。3。)ヽ エルァー ボクちょっとしか真面目じゃないYO
0272ほんたまNGNG
おみゃ〜らよ、おれは名無し@沢村よ。
おみゃ〜らよ、おれはほんたまよ。
おみゃ〜らよ、おれがほんたまになった件わかるか?
おみゃ〜らよ、「Visual E++」が「Slim de Can」になった件わかるか?
「Slim de Can」は限りなくマシン語に近いアセンブラよ。
疎いな…おみゃ〜らは…詳しくはここだ↓

http://hp.vector.co.jp/authors/VA015412/

自分じ見ちみれ♪
0273デフォルトの名無しさんNGNG
u
0274デフォルトの名無しさんNGNG
ストリング命令が分からないです。
NASMの16bit exe形式なんですが、これで上手くいきません。
どうすれば上手くいくのでしょうか?

;worldの最初の'a'を'H'にしたい
;省略
mov si,hello
mov di,world
movsb

mov dx,hello
mov ah,09h
int 21h

mov dx,world
int 21h

;省略
segment data
hello: db 'Hello World',13,10,'$'
world: db 'aaaaaaaaaaaaaaa','$'
0275デフォルトの名無しさんNGNG
;省略
の直後に

mov ax,data
mov ds,ax
mov es,ax

とか?
0276デフォルトの名無しさんNGNG
っぽいね。movs[bwd]はds:si→es:diだから。
こないだから質問してる人かな? CPUのマニュアルもっとよく読んだほうがいいよ。
高級言語と違って「よしなに」はやってくれないからね。
0277デフォルトの名無しさんNGNG
>>275
mov ax, SEG data
では?
0278274NGNG
>>275さんのやり方で上手くいきました、ありがとうございます。

あと、名誉のために言っておきますが、>>256さんと私は別人です。
0279デフォルトの名無しさんNGNG
OS使わずにディスクから起動してほかの
0280デフォルトの名無しさんNGNG
>>279
考えまとまってから書けよ
0281デフォルトの名無しさんNGNG
>>279
お前には無理だ。
0282デフォルトの名無しさんNGNG
>>278
物理的には別かも知らんけど、な。
わかるやろ?
0283デフォルトの名無しさんNGNG
>>282
スルーしなって。
この手の人にはいくら言っても無駄だから。
0284デフォルトの名無しさんNGNG
インラインアセンブラオンリーユーザなんだど、
コンパイラってなに使うのx86系で。
Cとかとリンカで混合して使うのそれともフルアセンブラ?
0285デフォルトの名無しさんNGNG
>>284
聞きたいことがわからん。もう一度整理してくれ
0286デフォルトの名無しさんNGNG
>>.284
用語と日本語文法の勉強して出直せ。
0287デフォルトの名無しさんNGNG
古本屋でプログラムはなぜ動くのか、って本があったから
買ったけど意味不明
0288デフォルトの名無しさんNGNG
>>284の訳(多分)
私はx86系でインラインアセンブラを使っているのですが、
皆さんはソフトウェアを作るときアセンブラをどのように使っているのですか。
(例えば一部Cなどで書いて、それとアセンブラのコードとはリンカで1つにリンクしているなど)
それとも全てアセンブラだけで書き上げたりするものなのでしょうか?
0289デフォルトの名無しさんNGNG
>>284の訳(英文)
it is an INRAIN assembler-only user -- ど
and KOMPAIRA って -- what -- the x86 system of 使う
C -- と -- using by RINKA, mixing, or a full assembler
0290デフォルトの名無しさんNGNG
いや単にNASMとか聞いてるんじゃなかろうか・・・
0291デフォルトの名無しさんNGNG
>>284 の文意を想像するスレ
0292デフォルトの名無しさんNGNG
ここは日本語も読めない低学歴プログラマーのすくつですか?
0293デフォルトの名無しさんNGNG
>>284=>>292必死だな、と。
0294デフォルトの名無しさんNGNG
日本語理解するの難しいよ。書くのはもっと難しい。
アセンブラの方がよっぽど簡単。いざとなったら動かして試せるし。
0295デフォルトの名無しさんNGNG
>>294
この業界で仕事してると、ほんとそう思うよ名
「プログラムって簡単!」
0296デフォルトの名無しさんNGNG
日本語が読めなかったら低学歴なんだ・・
よくあるけれど、既出をがいしゅつと読んだり、
巣窟をすくつと読んだりするの、やめよう・・ね?
0297デフォルトの名無しさんNGNG
ネタをネタと(ry
0298デフォルトの名無しさんNGNG
りゅうせき
0299デフォルトの名無しさんNGNG
日本語に精通した並のプログラマ>>>>>>>>>日本語アレでも天才プログラマ
0300デフォルトの名無しさんNGNG
読み方間違えたら即ネタとして誤魔化す。これいかに
0301デフォルトの名無しさんNGNG
そんなもんだろ
0302デフォルトの名無しさんNGNG
こまったもんだ
0303デフォルトの名無しさんNGNG
お前しか困らん
0304ほんたまNGNG
おみゃ〜らよ、おれのスリムドカンはある意味アセンブラよ。
スリムドカンはおれのページにあるから見ちみれ?

http://hp.vector.co.jp/authors/VA015412/
おみゃ〜らよ、おれはいまリソースエディタをつくってるのよ。
スリムドカンに装備させるためよ。
おみゃ〜らよ、アセンブラをつくるのはいいが、リソースエディタのないアセンブラはアセンブラとはいわんぞ!
自分じわかるかな?
0305デフォルトの名無しさんNGNG
教えてください!! Bit scan を Intel 系で(数%でもいいから)高速に
行いたいのです.しかも,僕は C以外の言語を知りません... Cコンパイ
ラに bsr を使わせる事は出来るのでしょうか? もしくはインラインア
センブラを使うならばどう書けばよいのでしょうか? とりあえず,素
人なりに VC inline asmembly 書いてみました.これってどうなのでしょ
う...

int scan_three_integers( int i1, int i2, int i3 )
{
__asm { bsr edx, dword ptr i1
mov eax, 31
jnz l1
bsr edx, dword ptr i2
mov eax, 63
jnz l1
bsr edx, dword ptr i3
mov eax, 95
l1: sub eax, edx }
}
0306デフォルトの名無しさんNGNG
edxはどこから出てきたの?
0307306NGNG
すまん寝ぼけてたようだ…忘れてくれ
0308デフォルトの名無しさんNGNG
>>305
>これってどうなのでしょう...

何をする関数なのか仕様を書いておかないと
ソースから仕様を分析せなならんので俺はスルーしたくなる。
0309305NGNG
> 何をする関数なのか仕様を書いておかないと

上記の関数 scan_three_integers() は,3つの int 引数からなる 96 bit 列
を左から走査し,ビットの立っている位置 {i|0,1,...,95} を返すようになっ
ている筈です.但し,引数 96 bit のうち,少なくとも 1 つのビットは立って
いることを仮定しています.

パイプライン・条件分岐等のことは一切考えず(いや,むしろ考えられず),
ただただ動くように命令を並べただけです(汗).
0310デフォルトの名無しさんNGNG
確率が高いほうから調べるくらいしかやりようがないような
0311デフォルトの名無しさんNGNG
まずバイト単位で0じゃないバイトを探してからビットを探すってのはどう?
0312デフォルトの名無しさんNGNG

(1)下記、1次元8点DCTのCPU命令によるプログラムの実行サイクル数を求めよ。
ただし、MUL Ri,Rjについては演算はEステージ、結果格納はSステージで行うとする。
(2)このプログラムの最内ループのパイプラインステージを描け。
(3)MULのEステージが2サイクルかかるとした場合、実行サイクルはどうなるか?
MOV #8,R13 MOV.W aStart,R5 MOV.W Sstart,R6 L2:MOV.W sStart,R4
SUB R10,R10 #r10:accumulater MOV #8,R12 L1:MOV.W@R4+,R8 MOV.W@R5+,R9
MUL R8,R9 ADD R9,R10
DT R12 #r12 –1,if r12=0 then T=1
BF L1 MOV.W R10,@R6+
DT R13 #r13–1,if r13=0 then T=1
BF L2
End:
メモリ(URAM)
R4 S(0) S(1) S(2)::
R5 a(0,0) a(1,0) a(2,0) ::
R6 S(0) S(1) :
7
ΣS(x) a(x,y) 1次元8点DCT
x=0
0313デフォルトの名無しさんNGNG
宿題はスレ違いです
0314デフォルトの名無しさんNGNG
SHだかなんだか知らないが情報不足でいずれにしろ解けないな
0315デフォルトの名無しさんNGNG
alpha21364のアセンブラをやらないといけない事になったのですが
役に立つ書籍等があれば教えてください
0316デフォルトの名無しさんNGNG
教えるクンがいるとすぐ意味不明の質問スレになるな
お約束だが
0317デフォルトの名無しさんNGNG
>>315

21364は、SMPとメモリコントローラ周りの統合がメインで、
コアは、21264からほとんど変更無いから
英語本で良ければ21264の文献はいくつか見つかる。
0318ほんたまNGNG
おみゃ〜らよ、おみゃ〜らさーん♪
おりはよ、「Slim de Can」を使ってやっとメインウィンドウにコントロールをつけるサンプルの作成に成功したぜ。わはは♪
「Slim de Can」ってすげ〜な〜、イベントドリブンプログラムが作成できるとこまでついに進化したよ。
おりはもう神だね♪どうよ?

http://hp.vector.co.jp/authors/VA015412/
0319305NGNG
お返事ありがとうございます.

> 確率が高いほうから調べる

なるほど.どの bit が立っている確立が高いか考えて順番を入れ替えて
見ます.


> まずバイト単位で0じゃないバイトを探してからビットを探すっての
> はどう?

C でプログラムを書く場合,上記のような方法も考えました.8 bit 単
位で bit の立っている位置,もしくはどこも立っていないという情報を
格納した 256 要素からなるテーブルを参照する方法です.しかし,
inline assembly で bsr 命令を使うと,32 ビット単位の bit scan
をしつつ,どの bit もたっていなければフラグを立ててくれるのです.
0320デフォルトの名無しさんNGNG
>>319
bit scan命令が遅いのは知ってる?
0321305NGNG
> bit scan命令が遅いのは知ってる?

知りませんでした.情報ありがとうございます.ただ,bit scan 命令より
も速い手法を知らないのです.

Inline assembly での bsr 命令使用以外で試したのが,bit が見つかるまで
ループさせる方法と,テーブルを数回参照する方法です.

テーブル参照の方法で試したのは,要素数 256 のテーブル 12回参照と,要素数
65536 のテーブル 6回参照の2通りです.

PentiumIII では bsr 命令のほうが効率が良かったです.
0322デフォルトの名無しさんNGNG
>>320
bit scan命令が遅いって
いつの時代のCPUですか?
0323デフォルトの名無しさんNGNG
安土桃山ごろ?
0324おばかさんNGNG
>>305
もしまず0チェックすることによって bsrをただ3回やるより速くなるのならばこんなのどうかな?1000万回くらいループしてベンチとんないと最近のはキャッシュがあるから性能はわかんないね。
int scan_three_integers( int i1, int i2, int i3 )
{
__asm {
 mov ecx, dword ptr i1
 jecxz NEXT1
 bsr edx, ecx
 mov eax, 31
 jmp DONE
NEXT1: mov ecx, dword ptr i2
 jecxz NEXT2
 bsr edx, ebx
 mov eax, 63
 jmp DONE
NEXT2: bsr edx, dword ptr i3
 mov eax, 95
DONE: sub eax, edx }
}
0325おばかさんNGNG
すまん、バグ発見。
int scan_three_integers( int i1, int i2, int i3 )
{
__asm {
 mov ecx, dword ptr i1
 jecxz NEXT1
 bsr edx, ecx
 mov eax, 31
 jmp DONE
NEXT1: mov ecx, dword ptr i2
 jecxz NEXT2
 bsr edx, ecx
 mov eax, 63
 jmp DONE
NEXT2: bsr edx, dword ptr i3
 mov eax, 95
DONE: sub eax, edx }
}
0326デフォルトの名無しさんNGNG
前スレで、WinXP上でAMDの64bitモードに切り替えたという話があったと思います。
モード切り替えには物理アドレスと仮想アドレスが同じとなるメモリ領域を確保する
必要があると思うのですが、どのようにしたのでしょうか? 
お願いします。
0327デフォルトの名無しさんNGNG
bsr/bsfはathlonでvectorpath+latency10前後..
微妙に重いね
0328デフォルトの名無しさんNGNG
32ビットbsrはi486で6〜103クロック。
P5で7〜71クロック。
0329デフォルトの名無しさんNGNG
P6のbsrのレイテンシはわずか2クロック
0330デフォルトの名無しさんNGNG
_scan_three_integers PROC
MOV EAX,[ESP + 4] ' EAX = p1
ADD EAX,-1
SBB EAX,EAX 'EAX = (p1 != 0) ? -1 : 0
ADD EAX,EAX 'EAX = (p1 != 0) ? -2 : 0
MOV ECX,[ESP + 8] 'ECX = p2
ADD ECX,-1
SBB ECX,ECX 'ECX = (p2 != 0) ? -1 : 0
AND ECX,EAX 'ECX = (p1 != 0) ? -2 : ((p2 != 0) ? -1 : 0)
MOV EAX,ECX
SHL EAX,5
ADD EAX,95 'EAX = (p1 != 0) ? 31 : ((p2 != 0) ? 63 : 95)
BSR EDX, [ESP + 12 + ECX * 4]
SUB EAX,EDX
RET
_scan_three_integers ENDP
速いかどうかはわからんがこういう方向もあり
0331デフォルトの名無しさんNGNG
AMD64はレジスターレジスタオペランドで11clock。
VectorPathだから一番いい状態のときのものだと思う。
■ このスレッドは過去ログ倉庫に格納されています