cmpb使用GDB,需要帮助理解预期的响应

时间:2017-10-29 20:32:33

标签: c debugging gdb

我有一项任务是使用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>,然后比较什么字节和/或将会是什么字节结果?

1 个答案:

答案 0 :(得分:2)

第一条cmp指令:

cmpb   $0x0,(%edx)

测试string是否为空。如果为空,则不会进入循环。

下一个cmp指令

cmpb   $0x0,(%edx,%eax,1)

检查0是否在edx&amp;和的总和中。 eax寄存器+ 1. eax不包含任何地址,但表现为偏移。基地址为%edx

最后%eax包含字符串长度。