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
====== 代入 ======
代入数字的时候、 使用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