首页 > 编程知识 正文

汇编hello world代码,mips beq指令

时间:2023-05-05 00:27:35 阅读:169303 作者:157

KDB入门和MIPS汇编1. KDB介绍和退出命令1.1 KDB介绍1. KDB介绍1. KDB进入和退出KDB 2. KDB调试2.1断点类2.2内存操作类md2.3堆栈跟踪类2.4寄存器类rd2.5其他3. MIPS汇编4.1显示参数0-$a3,函数调用的前四个参数(arguments ) 4.1.1示例1常规条目4.1.2示例2结构指针条目4.2返回值ra - v04.3引用函数的条目ra-A0

1. KDB介绍和退出命令1.1 KDB介绍

kdb: build_in kernel debugger内核调试工具可以查看内存内容、寄存器信息和跟踪调用堆栈。

kdb与GDB一样用于调试器,但区别在于GDB在用户状态下调试,而kdb在内核状态下调试。 就这样了。

kdb提供了丰富的命令,可以实现执行控制、内存操作、寄存器操作、断点设置、堆栈跟踪等多种功能,共有33个命令

1.2进入KDB和退出KDB进入KDB

echo 1 /proc/sys/kernel/kdb或sysctl kernel.kdb=1

下:按ESC

然后,依次按大写的k、d、b三个字母即可退出kdb

删除所有断点,命令: bc *

然后退出go,命令: go 2. KDB调试2.1断点类kdb具有设置断点、清除断点、启用断点、禁用断点等强大的断点功能kdb还可以设置硬件断点。

断点指示包括bp、bl、bpa、bph、bpha、bc、be和bd。

bp :设置断点bl :显示当前设置的断点bc:1清除断点1清除标签为1的断点。 bc *清除所有断点ss步骤跟踪go :继续程序运行此命令将使内核继续运行,直到找到单个断点。 如果未设置断点,命令将离开kdb调试器,然后系统恢复正常操作。 2.2内存操作系统md md :显示内存内容2.3堆栈跟踪类此类命令实现堆栈跟踪,包含bt、btp、bta三个命令。

bt )如果不指定调用栈的显示参数,则根据当前寄存器的内容显示栈btp (显示进程的栈格式)显示由BTPPIDPIDPID指定的进程的栈。 bta :显示所有进程的堆栈格式: bta 2.4寄存器类rd寄存器类命令包括显示和修改寄存器内容的rd和rm命令以及异常帧显示命令ef。 rd :显示寄存器的内容如果没有参数,rd会显示进入kdb调试器时设置的所有通用寄存器的值。 2.5其他id :指令反汇编形式:从id vaddr的vaddr开始的地址反汇编指令。

3. MIPS汇编3.1 mips寄存器MIPS有32个通用寄存器($0-$31 ),每个寄存器的功能和汇编程序中的使用条款如下。

注册用户$0$ zero将永远返回0, 常量0(constantvalue0) $1$at是汇编程序(Reserved for assembler ) $2-$3$v0-$v1函数调用返回值) valuesforresultsandexpressioneveve uments ) ) $8-$15$t0-$t7临时寄存器(或一次性的)、参数5、参数6……(保存在$ 16-$ 23 $ s0-$ S7中)或同$t0-$t7 $28$gp全局指针(Global Pointer ) $29$sp堆栈指针(Stack Pointer ) $30$fp帧指针必须至少保留一个

4 .示例参考: 4.1参数a0-$a3,函数调用的前四个参数(arguments ) a0-$a3函数调用的前四个参数(arguments )

t 0 t0- t0t7保存参数5、参数6 ……

4.1.1例1公众参与[4]kdbrd//rd :显示寄存器的内容zero=0x 0000000000000 at=0x 0000000000 v0=0xffffffff C1 d 3a 700 v1=0x 00000000006 a1=0x 00000000000002 a2=0xa 800000000000000000000000000000000000000000000000000000000000

[12]kdb> rd zero = 0x00000000 at = 0x00000008 v0 = 0xffffffffc1dad5d0 v1 = 0x00000002 a0 = 0xa8000005d9725248 a1 = 0xa8000005da8e0000 a2 = 0x00000075 a3 = 0x000063de ……cause = 0x00800024 badva = 0xa8000006d99a01e0 [12]kdb> md 0xa8000005d9725248 //md:显示内存内容 0xa8000005d9725248 a8000005da4cd700 a8000005d97f6780 .....L........g.0xa8000005d9725258 000002a400000000 0000000000000000 ................0xa8000005d9725268 0000000000000000 0000000000000000 ................0xa8000005d9725278 0000000000000000 a8000005d9723b10 .............r;.0xa8000005d9725288 a8000005d9723a10 0000000000000000 .....r:.........0xa8000005d9725298 0000000000000000 0000000000000000 ................0xa8000005d97252a8 00000c9c00000000 0000000000000001 ................0xa8000005d97252b8 6b6b6b6b6b6b6ba5 cccccccccccccccc kkkkkkk.........[12]kdb> md a8000005da4cd700 0xa8000005da4cd700 0000000000000000 016b6b6b00000008 .........kkk....0xa8000005da4cd710 000010036b6b6b6b 6b6b6b6b6b6b6ba5 ....kkkkkkkkkkk. 入参是个指针, 0xa8000005d9725248其参数类型:typedef struct test{ //其他char c1;//016b6b6b 6b6b6b是四字节对齐int i1;//8int i2;//4099 0x1003} 4.2 查看返回值 ra -> v0 [37]kdb> go Instruction(i) breakpoint #1 at 0xffffffffc1d3bdb0 (adjusted) cpu 37 0xffffffffc1d3bdb0 xxxxxx_yyyyy: daddiu sp,sp,-48 47 out of 48 cpus in kdb, waiting for the rest, timeout in 10 second(s) .All cpus are now in kdb Entering kdb (current=0xa8000007fab35358, pid 581) on processor 37 due to Breakpoint @ 0xffffffffc1d3bdb0 [37]kdb> rdzero = 0x00000000 at = 0x00000000 v0 = 0xffffffffc1d3bdb0 v1 = 0x00000006 a0 = 0x00000006 a1 = 0x00000002 a2 = 0xa80000074883c318 a3 = 0x00000003 t0 = 0xa8000005d4a6de70 t1 = 0x00000026 t2 = 0x00000000 t3 = 0x0000005a s8 = 0x00000000 ra = 0xffffffffc1ff2f7c hi = 0x00000000 lo = 0x00000001 pc = 0xffffffffc1d3bdb0 sr = 0x14109ce3 cause = 0x00800024 badva = 0xffffffff801055dc [37]kdb> bp 0xffffffffc1ff2f7c //断住 ra 返回值 Instruction(i) BP #2 at 0xffffffffc1ff2f7c ([system]xxxxxx_yyyyy2+0x13c) globally addr at ffffffffc1ff2f7c, hardtype=0, forcehw=0, installed=0, hard=ffffffff8078c410 [37]kdb> go //走到返回值 ra 处 Instruction(i) breakpoint #2 at 0xffffffffc1ff2f7c (adjusted) cpu 37 0xffffffffc1ff2f7c xxxxxx_yyyyy2 <+316>: ld v0,120(sp) // 返回值写入v0 寄存器中 44 out of 48 cpus in kdb, waiting for the rest, timeout in 10 second(s) .All cpus are now in kdb Entering kdb (current=0xa8000007fab35358, pid 581) on processor 37 due to Breakpoint @ 0xffffffffc1ff2f7c [37]kdb> rd v0 //打印返回值的值 0 v0 = 0x00000000 4.3 查看函数的出参 ra -> a0-a3/t0-t7

要看出参,先要能够断住函数执行结束的地方,其中,ra寄存器(返回地址(return address))中保存的是函数结束后返回上层调用函数的第一条指令。
我们断住这条指令,即可查看相关出参。

查看出参同 4.2 查看返回值 ra -> v0 一样,先断住 ra寄存器 go到ra,然后依次打印a0-a03 t0-t7 看哪个出参即可。

参考:

https://wenku.baidu.com/view/5ed2d89d7dd184254b35eefdc8d376eeafaa1709.html
https://blog.csdn.net/oyangyufu/article/details/6245931
https://blog.csdn.net/flyingqr/article/details/7073088

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。