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