ユーザ用ツール

サイト用ツール


サイドバー

zh:column:arm_asm_zh

arm汇编程序上方便的事情,总结。

调用函数

bl 相对地址跳转。但是,不跳到远处。
b  无条件跳转。但是,不跳到远处。

bl和b的区别、8086 call和jmp。
现在执行的地址保存在pc(r15寄存器)上。
pc改写jmp的实现。。

回到前面的定义、bl的情况是、堆栈而是lr(r14寄存器)利用。

如果你想跳到绝对地址、如下。

・bl置换命令

ldr		r1,=$08AABBCC    ;bl 08AABBCC 置换
mov		lr, r1
@dcw	$F800 ; 置换pc和lr寄存器,确保返回目的地,跳到执行地址.

・b置换命令

ldr		r1,=$08AABBCC  ;b 08AABBCC 置换
mov		pc, r1 ;pc被置换并跳转.

;因为生成的asm代码的第1字节是 0x00、
;复制的时候、确认开始字节、请不要忘记复制0x00字节。

条件的分支

cmp Ra,XX 的时候
BEQ(Ra==XX)
BNE(Ra!=XX)
BGE(Ra>=XX)
BGT(Ra>XX)
BLE(Ra<=XX)
BLT(Ra<XX)

代入

代入数字的时候、 使用mov。

mov r0,#0x01

取代指针的时候、使用ldr。

ldr r0,=$0202BE48

在代入指针的时候、 使用mov的话、 虽然编译成功但会生成null值的代码。

mov r0,=$0202BE48
↓
mov r0,=$00000000 ;实际生成这样的代码。危险。

汇编

反汇编

disarm -t aaa.gba > aaa.asm

汇编

goldroad aaa.asm

但是,因为数值数据的解释两者不同,所以要注意。

disarm、 mov r1,#11 、  r1在 ''0x11'' 是代入的意思、~
goldroad、 mov r1,#11 、r1在 ''11'' 成为代入的意思。~


如果搞错了的话,会变成悲惨的事情、
disarm的asm的数字数据、#0x11 和 0x 要加上十六进制。

mov r1,#11
↓
mov r1,#0x11

no$gba debugger 断点

Debug→Define Break / Condition 可以做一个断点。

详细的使用方法请参照这边
http://ngmansion.webcrow.jp/wp/2015/02/23/gba%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E6%94%B9%E9%80%A0%E3%81%AE%E6%89%8B%E5%BC%95%E3%81%8D/#nogba

08123456
0x08123456 执行代码后停止。
[0202BE48]?
0x0202BE48 读入就停止
[0202BE48]!
0x0202BE48 写入就停止
[0202BE48]=34
0x0202BE48在0x34会被写入后停止。(字节指定)
[0202BE48]=0xF0
0x0202BE48在0xF0会被写入后停止。(字节指定)
好像有错误、A-F想要使用的情况、必须作为 0xF0。
0x即使没有数、16进数的标记、不接受。
r0=01234567
r0寄存器 01234567 到了就停止
r0!=01234567
r0寄存器 01234567 除此之外就停止
r0<>01234567 相同。

方便的方法。
如果有想找的值的情况。把那个值指定到r0-r2的话,大致可以找到。
因为是寄存器机器,所以要使用的话,必须在哪里读到寄存器。

r0=1234
r1=1234
r2=1234
zh/column/arm_asm_zh.txt · 最終更新: 2018/09/09 17:50 (外部編集)