无敌汇编
任天堂不给力
级别: 注册会员
编号: 111299
精华: 0
发帖: 61
威望: 0 点
配偶: 单身
火 花 币: 8106 HHB
注册时间:2010-12-03
最后登陆:2011-02-11
|
gba汇编新手入门
先说明下汇编的一般用处,大部分情况下,汇编是用来调试程序的,即后期的改动,包括各种软件的破解都需要使用汇编完成,所以大家不要指望用汇编去写个程序50kb的小程序都能把人累残疾。废话就到这里。
直接进入指令介绍,只介绍一些在gba系统上用到的一些常用指令。
LDR{条件} Rd, <地址> STR{条件} Rd, <地址> LDR{条件}B Rd, <地址> STR{条件}B Rd, <地址> ldr为读取指令,str是存储指令,衍生出来的读取和存储指令还有很多种,如ldrh,ldrsb,strh,等等。。。以下做个指导,ldr指令格式同str。
STR Rd, [Rbase, Rindex] 存储 Rd 到 Rbase + Rindex 所合成的有效地址。
STR Rd, [Rbase, #index] 存储 Rd 到 Rbase + index 所合成的有效地址。 index 是一个立即值。例如,STR Rd, [R1, #16] 将把 Rd 存储到 R1+16。
STR Rd, [Rbase, Rindex]! 存储 Rd 到 Rbase + Rindex 所合成的有效地址,并且把这个新地址写回到 Rbase。
STR Rd, [Rbase, #index]! 存储 Rd 到 Rbase + index 所合成的有效地址,并且并且把这个新地址写回到 Rbase。
STR Rd, [Rbase], Rindex 存储 Rd 到 Rbase 所包含的有效地址。把 Rbase + Rindex 所合成的有效地址写回 Rbase。
下面是add和sub指令,太简单了,不解释了。 ADD 将把两个操作数加起来,把结果放置到目的寄存器中。操作数 1 是一个寄存器,操作数 2 可以是一个寄存器,被移位的寄存器,或一个立即值: ADD R0, R1, R2 ; R0 = R1 + R2 ADD R0, R1, #256 ; R0 = R1 + 256
SUB 用操作数 one 减去操作数 two,把结果放置到目的寄存器中。操作数 1 是一个寄存器,操作数 2 可以是一个寄存器,被移位的寄存器,或一个立即值: SUB R0, R1, R2 ; R0 = R1 - R2 SUB R0, R1, #256 ; R0 = R1 - 256 加法和减法不止这两个,还有如adc,rsb等指令,用的不多,所以不介绍了。
传送指令,MOV 讲到这个,很多人都会犯晕,你可以简单的把它理解为数学上的赋值。 如: mov r0,14h 则r0寄存器的值为14 mov r0,r1 则r0=r1
比较指令cmp,除了这个还有三个,gba中只用了这一个。 CMP{条件}{P} <op 1>, <op 2>
status = op_1 - op_2
CMP 允许把一个寄存器的内容如另一个寄存器的内容或立即值进行比较,更改状态标志来允许进行条件执行。它进行一次减法,但不存储结果,而是正确的更改标志。标志表示的是操作数 1 比操作数 2 如何(大小等)。如果操作数 1 大于操作操作数 2,则此后的有 GT 后缀的指令将可以执行。执行后并不影响结果,具体效果需要后面的指令来确定。 bge Branch if Greater than or Equal 大于等于 bgt Branch if Greater Than 大于 ble Branch if Less than or Equal 小于等于 blt Branch if Less Than 小于 beq Branch if EQual 等于 bne Branch if Not Equal 不相等 bvs Branch if oVerflow Set bvc Branch if oVerflow Clear bhi Branch if HIgher 高于 bpl Branch if PLus bmi Branch if MInus bleq Branch with Link if EQual bllt Branch with Link if Less Than bcs Branch if Carry Set bcc Branch if Carry Clear bls Branch if Lower or the Same
几个逻辑判定 AND,ORR,EOR AND{条件}{S} <dest>, <op 1>, <op 2>
dest = op_1 AND op_2
AND: 将在两个操作数上进行逻辑与,把结果放置到目的寄存器中;对屏蔽你要在上面工作的位很有用。 操作数 1 是一个寄存器,操作数 2 可以是一个寄存器,被移位的寄存器,或一个立即值: AND R0, R0, #3 ; R0 = 保持 R0 的位 0 和 1,丢弃其余的位。
AND 的真值表(二者都是 1 则结果为 1): Op_1 Op_2 结果
0 0 0 0 1 0 1 0 0 1 1 1 这个指令在gba中用的不太多,大部分情况下,可以直接用cmp代替。
ORR:将在两个操作数上进行逻辑或,把结果放置到目的寄存器中;对设置特定的位有用。操作数 1 是一个寄存器,操作数 2 可以是一个寄存器,被移位的寄存器,或一个立即值: ORR R0, R0, #3 ; 设置 R0 中位 0 和 1
OR 真值表(二者中存在 1 则结果为 1): Op_1 Op_2 结果
0 0 0 0 1 1 1 0 1 1 1 1
EOR :将在两个操作数上进行逻辑异或,把结果放置到目的寄存器中;对反转特定的位有用。操作数 1 是一个寄存器,操作数 2 可以是一个寄存器,被移位的寄存器,或一个立即值: EOR R0, R0, #3 ; 反转 R0 中的位 0 和 1
EOR 真值表(二者不同则结果为 1): Op_1 Op_2 结果
0 0 0 0 1 1 1 0 1 1 1 0
逻辑移动 主要用到的有lsl,lsr这两个,还有其他很多,这里只简单说下lsl和lsr。 lsl 左移 lsr 右移 通常用来代替一些乘法指令。gba中几乎找不到mul指令的。。。
分支指令 分支有b和bl两个,具体的差别为 b指令一旦执行则强制跳到其他位置继续执行,如b 802b542,则强制转移到802b542地址处向下执行。 bl则不同,bl相当与执行一个子程序,原程序同样运行而不受影响。
以上如果不清楚的话,可以找些例子对照着看,应该很容易就能懂的。 大概常用的就这些了,还有一些比如push,bx,swp这些指令虽然gba中很多,但我们没有这方面的改动需要,这里要强调一点,学习汇编切勿追根溯源,汇编的作用主要用来修改破解的,仅用于部分,要知道gba在最初可是由C语言写出来的。只不过后来经过了转换而已。 以上内容希望能够对觉得汇编是天书的新手有所帮助。其实这东西比任何语言都简洁,只不过一眼看上去没啥样子可说,本人也未经专业学习,完全自己摸索,技术不太高,无聊之士还在这里的话,我还要请教他的。。。
|
想做gba版多拉基亚,外加20章的扩充。剧情数据尚未解析。。。
|
[楼 主]
|
Posted:2010-12-16 16:41| |
顶端
| |