我有一项任务是使用GDB来计算提供给我的程序的密码。我正在按照程序的汇编转储(到目前为止)做得很好,但我仍然坚持理解cmpb
指令集。我已经记录了相应寄存器中的值,但是在调用cmpb
时寄存器中的值会丢失。我已经读过其他帖子,比如understand cmpb and loops in assembly language,但仍然是我的头脑。
以下是我的终端会话的片段:
0x0804844a <+6>: mov $0x0,%eax
0x0804844f <+11>: cmpb $0x0,(%edx) // $edx has "something\n"
0x08048452 <+14>: je 0x804845d <s+25> // skipped since it's not equal to $0x0
0x08048454 <+16>: add $0x1,%eax // adding "something\n" to $0x1
=> 0x08048457 <+19>: cmpb $0x0,(%edx,%eax,1) //what is the result here???
0x0804845b <+23>: jne 0x8048454 <s+16>
现在在我上面提到的链接中,它说明了
&#34;取一个EDX + EAX指向的字节并将其与零进行比较。 EDX 作为字符串基指针,EAX是索引。比例是1 因为我们正在使用字节。以这种方式思考整个循环: for(eax = 0; edx [eax]!= 0; eax ++)。&#34;
但究竟是什么字节?
我的意思是,如果$edx
==&#34;那么\ n&#34;和$eax
== 0x1
(我知道这一点,因为当我呼吁$eax
的内容时,它指出<Address 0x1 out of bounds>
,然后比较什么字节和/或将会是什么字节结果?
答案 0 :(得分:2)
第一条cmp指令:
cmpb $0x0,(%edx)
测试string是否为空。如果为空,则不会进入循环。
下一个cmp指令
cmpb $0x0,(%edx,%eax,1)
检查0是否在edx&amp;和的总和中。 eax寄存器+ 1. eax
不包含任何地址,但表现为偏移。基地址为%edx
最后%eax
包含字符串长度。