【ARM】DQ9で学ぶARMアセンブル【逆汗】

このエントリーをはてなブックマークに追加
97名無しさん@お腹いっぱい。
横から失礼します
> :020A7AEC 00861106 addeq r1,r6,r6,lsl #0x2←r1=最大転生回数×4
r1 ← r6+r6*4 = 最大転生回数×5
 じゃないの?
それとも解釈が間違ってます?
98名無しさん@お腹いっぱい。:2009/09/01(火) 03:15:37 ID:J4qdZ0nv
>>97
たしかにそうですね
地図ランク生成の式、間違えてますね
(主人公の最大レベル+主人公の最大転生回数*5+もぐった地図レベル)+10%〜-10%
ですね
99名無しさん@お腹いっぱい。:2009/09/01(火) 03:54:34 ID:J4qdZ0nv
間違った式がすでに広まってしまって恥ずかしいです
他にも間違えているところがあるかも知れません
+10%〜-10%のあたりの私の解釈を書いておきます

それまでの計算結果をbaseとします
base=最大レベル+最大転生回数*5+地図レベル

:020A7B4C EBFD928A bl 0200C57C ; 整数→浮動小数点への変換
:020A7B50 E1A01000 mov r1,r0 ; r1にそれまでの計算結果の浮動小数点表現
:020A7B54 E59F0054 ldr r0,[r15, #+0x54] ; r0=0.1(0x3dcccccd)
:020A7B58 EBFD92CE bl 0200C698 ; 浮動小数点での乗算 base*0.1
:020A7B5C E1A05000 mov r5,r0 ; 結果をr5に退避
:020A7B60 EBFD9256 bl 0200C4C0 ; 浮動小数点→整数への変換
:020A7B64 E1A04080 mov r4,r0,lsl #0x1 ; 2倍する r4 = |base*0.1|*2
:020A7B68 EBFD7030 bl 02003C30 ;rand()
:020A7B6C E2841001 add r1,r4,#0x1 ; r1 = |base*0.1|*2+1
:020A7B70 EBFD94A4 bl 0200CE08 ; r1 = rand % (|base*0.1|*2+1)
:020A7B74 E1A00001 mov r0,r1
:020A7B78 EBFD926D bl 0200C534 ; 整数→浮動小数点への変換
:020A7B7C E1A01005 mov r1,r5 ; 020A7B5Cで退避していた結果(浮動小数点表現)をr1に復帰
:020A7B80 EBFD9378 bl 0200C968 ; 浮動小数点での引き算 rand % (|base*0.1|*2+1) - base*0.1
:020A7B84 EBFD924D bl 0200C4C0 ; 浮動小数点→整数への変換
:020A7B88 E0860000 add r0,r6,r0 ; base + |rand % (|base*0.1|*2+1) - base*0.1|

この解釈で+10%から-10%になると思います
浮動小数点の計算ルーチンの中身はざっとしか見てないので、間違ってるかも知れません
整数との変換が複数あるのは、符号付、符号なしなどの違いだと思います
100名無しさん@お腹いっぱい。:2009/09/01(火) 06:40:35 ID:xcNoxHh4
ARM7とARM9ってどう違うの?
教えてえろいひと!
101名無しさん@お腹いっぱい。:2009/09/01(火) 13:47:00 ID:801uMyiX
>>99

なるほど! float でしたかっ!

> :020A7B54 E59F0054 ldr r0,[r15, #+0x54] ; r0=0.1(0x3dcccccd)

ここ↑がポイントですね。

   0x3dcccccd = 0 0111 1011 100 1100 1100 1100 1100 1101

だからっとw

仮数:13421773(×2^-23) 指数:-4

だから、ショボい電卓で計算してもw

   0x3dcccccd = 0.100000001490116

ですね。着眼点がすごいなぁ・・・
102名無しさん@お腹いっぱい。:2009/09/01(火) 13:48:25 ID:801uMyiX
同じ伝で、

 0x3fc00000=float(1.5)
 0x40a00000=float(5.0)

だから、これで未解明の部分がわかるかな?
103名無しさん@お腹いっぱい。:2009/09/01(火) 13:59:31 ID:801uMyiX
:020A7AFC番地で、「beq 020A7B38」しなかった場合の実行コード

この段階のレジスタ状況: r0=最大レベル、r6=最大転生回数

:020A7B00 EBFD929D bl 0200C57C ←r0(最大レベル:整数)をfloat
:020A7B04 E1A01000 mov r1,r0  ←して、r1に待避
:020A7B08 E3A005FF mov r0,#0x3FC00000 ← float(1.5);
:020A7B0C EBFD92E1 bl 0200C698 ←かけ算(レベル×1.5)
:020A7B10 E1A04000 mov r4,r0 ←の結果をr4に待避

:020A7B14 E1A00006 mov r0,r6 ←今度はr6を
:020A7B18 EBFD9297 bl 0200C57C ←floatして
:020A7B1C E1A01000 mov r1,r0 ←r1へ

:020A7B20 E59F0084 ldr r0,[r15, #+0x84] ←r0=定数0x40a0000=float(5.0)
:020A7B24 EBFD92DB bl 0200C698 ←最大再生回数×5.0
:020A7B28 E1A01000 mov r1,r0 ←をr1に

:020A7B2C E1A00004 mov r0,r4 ←さきほどの最大レベル×1.5をr0へ
:020A7B30 EBFD8F52 bl 0200B880 ←float足し算(r0=r0+r1;)
:020A7B34 EBFD926E bl 0200C4F4 ←r0=int(r0);

「最大レベル+最大転生回数*5+地図レベル」組とここで合流(jumpポイント)
→:020A7B38 E1A00800 mov r0,r0,lsl #0x10 ←計算結果r0の上位16ビットをクリアして
:020A7B3C E1A06820 mov r6,r0,lsr #0x10 ←なぜかr6に待避
:020A7B40 E3A01000 mov r1,#0x0 ←r1をゼロクリア(ストア準備)
:020A7B44 E1A00006 mov r0,r6     ← r0=r6; なんのために待避したんだ?www
:020A7B48 E5C51009 strb r1,[r5, #+0x9] ←[r5, #+0x9]をゼロクリア。なんのフラグだろう
以下、:020A7B4C番地以下は、>>99 のとおり

・どうやら、こちらは、floatで最大レベル×1.5+最大再生回数×5.0 を計算しているらしい(なので、max198.5)
・[r5, #+0x9]が2か否かで分岐する。他分岐は整数演算でr0=最大レベル+最大転生回数×5+地図レベル
・[r5, #+0x9]は必ずゼロクリアされる。


あと少しなんだけどなー。壁はデータ構造・・・特に、[r5, #+0x9]???
同[r5, #+0x7]は99氏の解析によれば、地図レベルらしいのだが・・・
104名無しさん@お腹いっぱい。:2009/09/01(火) 14:14:02 ID:801uMyiX
ああ、なるほど、

  最大レベル(max99)+最大転生回数×5(max50)+地図レベル(max99) = max248

だから、マップランクは最大でF8(十進248)になってるのか



レベル99で地図99とすると、それだけで 0xc6
加えて

 転生1回×5=0xcb
 転生2回×5=0xd0
 転生3回×5=0xd5
 転生4回×5=0xda
             ←0xddの壁w
 転生5回×5=0xdf

実際はさらに乱数要素が±10%つくわけかー
105名無しさん@お腹いっぱい。:2009/09/01(火) 14:20:14 ID:+48qcfBw
mapSEEDに対してRANKで用いる乱数が固定されるとすると
最大レベル+最大転生回数×5+地図レベル
が2〜248をとっても生成できないRANKとか出てくるんだろうか
106名無しさん@お腹いっぱい。:2009/09/01(火) 14:48:10 ID:801uMyiX
>>105
おもしろそうなので、計算してみましたw
題材は例によって川崎ロッカー(B7-3CA2)です。

中断秒数は、2B3A(3時間4分27秒)とわかってるので、ランク用乱数計算すると、361Aですね。

下記ペアは (最大レベル+最大転生回数×5+地図レベル:10進数 、 ランク:16進)です

(2 02) (3 03) (4 04) (5 05) (6 06) (7 07) (8 08) (9 09) (10 0b) (11 0c) (12 0d)
(13 0e) (14 0f) (15 10) (16 11) (17 12) (18 13) (19 14) (20 12) (21 13) (22 14)
(23 15) (24 16) (25 17) (26 18) (27 19) (28 1a) (29 1b) (30 1f) (31 20) (32 21)
(33 22) (34 23) (35 24) (36 25) (37 26) (38 27) (39 28) (40 2c) (41 2d) (42 2e)
(43 2f) (44 30) (45 31) (46 32) (47 33) (48 34) (49 35) (50 2e) (51 2f) (52 30)
(53 31) (54 32) (55 33) (56 34) (57 35) (58 36) (59 37) (60 3b) (61 3c) (62 3d)
(63 3e) (64 3f) (65 40) (66 41) (67 42) (68 43) (69 44) (70 44) (71 45) (72 46)
(73 47) (74 48) (75 49) (76 4a) (77 4b) (78 4c) (79 4d) (80 54) (81 55) (82 56)
(83 57) (84 58) (85 59) (86 5a) (87 5b) (88 5c) (89 5d) (90 63) (91 64) (92 65)
(93 66) (94 67) (95 68) (96 69) (97 6a) (98 6b) (99 6c) (100 65) (101 66)
(102 67) (103 68) (104 69) (105 6a) (106 6b) (107 6c) (108 6d) (109 6e) (110 67)
(111 68) (112 69) (113 6a) (114 6b) (115 6c) (116 6d) (117 6e) (118 6f) (119 70)
(120 6c) (121 6d) (122 6e) (123 6f) (124 70) (125 71) (126 72) (127 73) (128 74)
(129 75) (130 8f) (131 90) (132 91) (133 92) (134 93) (135 94) (136 95) (137 96)
(138 97) (139 98) (140 8f) (141 90) (142 91) (143 92) (144 93) (145 94) (146 95)
(147 96) (148 97) (149 98) (150 9f) (151 a0) (152 a1) (153 a2) (154 a3) (155 a4)
(156 a5) (157 a6) (158 a7) (159 a8) (160 a7) (161 a8) (162 a9) (163 aa) (164 ab)
(165 ac) (166 ad) (167 ae) (168 af) (169 b0) (170 b2) (171 b3) (172 b4) (173 b5)
(174 b6) (175 b7) (176 b8) (177 b9) (178 ba) (179 bb) (180 ae) (181 af) (182 b0)
(183 b1) (184 b2) (185 b3) (186 b4) (187 b5) (188 b6) (189 b7) ←★ (190 b0) (191b1)
(192 b2) (193 b3) (194 b4) (195 b5) (196 b6) (197 b7) (198 b8) (199 b9) (200 d5)
(201 d6) (202 d7) (203 d8) (204 d9) (205 da) (206 db) (207 dc) (208 dd) (209 de)
(210 c1) (211 c2) (212 c3) (213 c4) (214 c5) (215 c6) (216 c7) (217 c8) (218 c9)
(219 ca) (220 e9) (221 ea) (222 eb) (223 ec) (224 ed) (225 ee) (226 ef)
(227 f0) (228 f1) (229 f2) (230 ef) (231 f0) (232 f1) (233 f2) (234 f3) (235 f4)
(236 f5) (237 f6) (238 f7) (239 f8) (240 f8) (241 f8) (242 f8) (243 f8) (244 f8)
(245 f8) (246 f8) (247 f8) (248 f8)

なので、この地図ゲットしたときは、最大レベル+最大転生回数×5+地図レベル=189 だった
189といえば、レベル99+地図90台だよゆうでクリアできますから=つまり川崎ロッカーは正規版!

確かにトビトビなので、「あり得ないランク」も・・・また新たなチート地図疑惑騒動がw
本スレには、ナイショにしときましょう
107名無しさん@お腹いっぱい。:2009/09/01(火) 15:12:26 ID:+48qcfBw
B5〜C8の範囲でみるとBC,BD,BE,BF,C0がないですね

大半が抜け落ちるようならチート判定に使えそうだけど
抜ける可能性の方が低いとなると役にはたたなそうか
108名無しさん@お腹いっぱい。:2009/09/01(火) 21:07:43 ID:kUq3CMn5
まとめると、
つまり、ランクのbase(最後はbase±10% 乱数つきになる)は

 @ floatで最大レベル×1.5+最大再生回数×5.0 
 A 最大レベル(max99)+最大転生回数×5(max50)+地図レベル(max99)

っであって、[r5, #+0x9]が分岐フラグ


[r5, #+0x9]が何を意味するのは今のところ unknown


==2で、Aになるところからすると、0=ツェ浜まで、 1=船入手、 2=箱船ゲットという
あたりだろうか?
109名無しさん@お腹いっぱい。:2009/09/01(火) 21:26:26 ID:kUq3CMn5
ndis2のバグ?みつけちゃたw
たとえば、メモリイメージ:0200C4DC (ファイル:0000C4DC) で、

× > :0200C4DC E1A00231 mov r0,lsr r1

とか逆汗されるけと、E1A00231解析すると

1110 00 0 1101 0 0000 0000 0010 0 01 1 0001
cond 00↑ mov s src  dst shiftR LSR ↑ R1
   オペランドはレジスタ      シフト長はレジスタ

となるから、

○ :0200C4DC E1A00231 mov r0, r1, lsr r2

なのでは?(そもそも、mov r0,lsr r1 て意味不明w)
110名無しさん@お腹いっぱい。:2009/09/03(木) 09:25:33 ID:VYpdj7p0
良スレAGE!
111名無しさん@お腹いっぱい。:2009/09/03(木) 14:39:05 ID:C58TvsLk
検索サイト人です。

ややスレ違いですがw  ttp://dq9.hustle.ne.jp/mapsearch.cgi にjavascript版を用意したのですが、
乱数計算がうまくできず結局(ソースみていただければわかりますけど)

   var low=SEED & 0xffff; //javascriptは馬鹿なので16bitずつ分解
   var hi=SEED>>16;


   for(j=0;j<boxNum;j++){//おなじみの乱数関数(0〜32767)×自宝箱序列数(1〜3いずれか固定)
      low=low * 1103515245 + 12345;
      carry=low >> 16; low=low & 0xffff;
      hi=(hi * 1103515245 + carry) & 0xffff;
      rand =(hi & 32767);
   }

こんな不細工なコードになってます。なんでも javascript内部では浮動小数点になっていて、ビット演算
するときだけ整数に倒すという謎しようのようで、32bitでやってると符号とかメチャクチャになってしまいまうので。

なんかもっとスマートな解決方法ないんでしょうかねー > 詳しい方
112名無しさん@お腹いっぱい。:2009/09/03(木) 18:15:22 ID:1QIxqiSW
>>111
内部的に倍精度(有効桁53bit)なので、32bit*32bitで下位32bitを取り出すのはどうしてもむりですね
検索サイト人さんが実装されてるように16bit*32bitを2回するしかないと思います
113名無しさん@お腹いっぱい。:2009/09/03(木) 22:08:10 ID:3MBuzb1w
>>7に挙げられている本ってARMの命令エンコーディングについても解説してる?してるなら買おうと思うんだけど
114名無しさん@お腹いっぱい。:2009/09/04(金) 01:21:33 ID:zJ+Lnsx7
>>111
関係ないレスで申し訳ないです。ここでしか聞くことができないもので

末尾が-A以外でも、たまに場所候補がひとつも現れない地図があるのですがこれは何故でしょうか?

例:あらぶる神々の火口 Lv70 魔剣神レパルド 火山 0B8F-L

その場合、地図自体は存在するが実際には場所候補がないため正規の手段では入手不可なのか、
あるい計算結果からは導き出されない(表示されない)別の場所候補があるということなのでしょうか
もし後者なら、場所候補に表示されないから黒、とは言い切れないのではないかと思いまして
115名無しさん@お腹いっぱい。:2009/09/04(金) 06:27:06 ID:Jj12jPgc
111ではないですが…

>>114
RANK,SEED,場所についてそれぞれ独立に乱数を振るのではなくて
経過時間から乱数の組を作ってそこから計算している仕様

経過時間は0000〜FFFFでSEEDは0000〜7FFFなので
平均すると1つのSEEDを生む乱数組は2通りになるのだが
均等分配ではなく0通りのものから3通りのものまであった

@乱数組が3通りのものについてはRANKを決めた時に場所候補が3箇所までありえる
A乱数組が2通りのものについてはRANKを決めた時に場所候補が2箇所までありえる
B乱数組が1通りのものについてはRANKを決めた時に場所候補が1箇所までありえる
C乱数組が0通りのものは地図そのものがありえない

0B8FはCに該当するので場所候補がない

地図の構造はRANKがどの範囲[02〜37(末尾がAに相当),38〜3C,3D〜4B,…]に入っているかで決まる
RANKを決めてしまえば場所を決める関数は1通りで場所候補は3通りまでと言えるんだけど
場所を決める関数の分岐が02〜32,33〜50,51〜F8となっているため
末尾がAのものは場所候補が02〜32について3箇所まで&33〜37について3箇所までとなり
場所候補が3箇所以上出てくる可能性があるので割愛

検索で表示されないというのは同じでも事情はだいぶ異なります



経過時間から乱数の組を作るという処理をせずに地図を生成すれば0B8Fもできると思うので
そういう地図が存在するかと問われるとどう答えたらいいかわかりませんが