若R1=0x40000000,R2=0x40000001,R3=0x40000002,R4=0x40000003,R5=0x40000004,R6=0x40000005;存储器0x40000000字单元的内容为 0x11, 0x40000004字单元的内容为0x22,0x40000008字单元的内容为 0x33,0x4000000C字单元的内容为0x44。问指令 LDMIA R1!,{R2-R4,R6}执行完之后,R1、R2、R3、R4、R5、R6的值为多少?
时间: 2023-06-04 12:08:58 浏览: 240
经过 LDMIA R1!,{R2-R4,R6} 指令执行后,R1 的值将会加上 16(因为加载了 5 个字单元),变成 0x40000010,同时 R2-R4, R6 中的值分别是存储器中地址为 0x40000000 字单元到 0x40000008字单元的值,即 0x11、0x40000001、0x40000002、0x33、0x40000005。而由于没有加载 R5 的值,R5 的值不会改变,仍然是 0x40000004。因此,LDMIA R1!,{R2-R4,R6} 执行后,R1 = 0x40000010,R2 = 0x00000011,R3 = 0x40000001,R4 = 0x40000002,R5 = 0x40000004,R6 = 0x00000033。
相关问题
Crash reason: SIGSEGV /SEGV_MAPERR Crash address: 0xaef15000 Process uptime: not available Thread 0 (crashed) 0 libQtGui.so.4 + 0x29531a r0 = 0x00bb80b6 r1 = 0x00bb00b6 r2 = 0x00000011 r3 = 0xff000000 r4 = 0xbac6b57a r5 = 0x00d300cd r6 = 0xaef15000 r7 = 0x02380124 r8 = 0x00ff0000 r9 = 0x02380124 r10 = 0x00000000 r12 = 0xaef15011 fp = 0x0000000f sp = 0xbee2c2c0 lr = 0xaef15000 pc = 0xb64ae31a Found by: given as instruction pointer in context 1 rtm2!google_breakpad::LinuxPtraceDumper::GetThreadInfoByIndex(unsigned int, google_breakpad::ThreadInfo*) [linux_ptrace_dumper.cc : 224 + 0xa] sp = 0xbee2c2d8 pc = 0x0001ec08 Found by: stack scanning 2 0xffee9b0b r4 = 0xffee9b0d r5 = 0xffee9b0d r6 = 0xffee9b0d r7 = 0xffee9b0d r8 = 0xffee9b0d r9 = 0xffee9b0d r10 = 0xffee9b0d fp = 0xffee9b0d sp = 0xbee2c418 pc = 0xffee9b0d Found by: call frame info 3 libQtGui.so.4 + 0x28e565 sp = 0xbee2c430 pc = 0xb64a7567 Found by: stack scanning 这段是什么意思?
这段是一段程序崩溃的日志信息,其中包含了崩溃的原因、地址、进程运行时间、线程信息等。
Crash reason: SIGSEGV /SEGV_MAPERR 表示崩溃的原因是段错误,这是指程序试图访问不属于其自己的内存区域。
Crash address: 0xaef15000 是崩溃发生时程序访问的非法内存地址。
Process uptime: not available 表示无法获取进程运行时间。
Thread 0 (crashed) 0 libQtGui.so.4 0x29531a 是崩溃发生时调用堆栈中的第一个函数调用,并且这个函数在 libQtGui.so.4 库中,在 0x29531a 位置发生崩溃。
r0-r12,fp,sp,lr,pc是程序在崩溃时的寄存器值。
Found by: given as instruction pointer in context 1 rtm2!google_breakpad::LinuxPtraceDumper::GetThreadInfoByIndex(unsigned int, google_breakpad::ThreadInfo*) [linux_ptrace_dumper.cc : 224 0xa] 表示这些信息是由LinuxPtraceDumper来收集的。
总之,这段日志信息表明程序在libQtGui.so.4库中的0x29531a位置发生了段错误,导致程序崩溃。
解释这段代码MAIN: MVRD R0,0xFF ;源地址 MVRD R1,0x1FF ;目的地址 MVRR R3,R0 MVRR R4,R1 MVRD R2,5 STRR R3,R2 ;r2数据,r3地址 STRR R4,R2 INC R3 INC R4 MVRD R2,3 STRR R3,R2 ;r2数据,r3地址 STRR R4,R2 INC R3 INC R4 MVRD R2,2 STRR R3,R2 ;r2数据,r3地址 STRR R4,R2 INC R3 INC R4 MVRD R2,1 STRR R3,R2 ;r2数据,r3地址 STRR R4,R2 INC R3 INC R4 MVRD R2,6 STRR R3,R2 ;r2数据,r3地址 STRR R4,R2 INC R3 INC R4 MVRD R2,4 STRR R3,R2 ;r2数据,r3地址 STRR R4,R2 MVRR R6,R4 INC R1 MVRR R7,R1 DEC R1 BUB: MVRR R4,R1 LOOP: LDRR R8,R4 INC R4 LDRR R9,R4 CMP R8,R9 JRS CHECK STRR R4,R8 DEC R4 STRR R4,R9 INC R4 CHECK: CMP R4,R6 JRNZ LOOP DEC R6 CMP R6,R7 JRNS BUB MVRR R5,R5 MVRR R5,R5 1: JR 1B
这段代码是一段汇编代码,其功能是将源地址的数据按照一定的规则复制到目的地址中,并进行一些排序操作。具体来说,它首先从源地址中读取数据,然后将其存储到目的地址中。接着,它会多次执行以下操作:从寄存器中读取一个数据和一个地址,将数据存储到该地址中,然后将地址指针向后移动一位。最后,它会对一段数据进行排序,这里采用冒泡排序算法实现。整个程序的执行过程是比较复杂的,需要仔细分析每一步操作的含义和作用。
阅读全文