最新の10件
ページ | 日付 |
---|---|
en:guid:febuildergba:work_support | 2023/06/08 20:25 |
guide:febuildergba:作品支援 | 2023/06/08 20:24 |
最新の10件
ページ | 日付 |
---|---|
en:guid:febuildergba:work_support | 2023/06/08 20:25 |
guide:febuildergba:作品支援 | 2023/06/08 20:24 |
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
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