gpt4 book ai didi

assembly - 了解汇编语言中的 cmpb 和循环

转载 作者:行者123 更新时间:2023-12-03 06:29:18 26 4
gpt4 key购买 nike

我有一个函数 string_length,它具有以下汇编代码

0x08048e90 <+0>:     push   %ebp
0x08048e91 <+1>: mov %esp,%ebp
0x08048e93 <+3>: mov 0x8(%ebp),%edx // assign whatever I declared into edx
0x08048e96 <+6>: mov $0x0,%eax // assign eax = 0
0x08048e9b <+11>: cmpb $0x0,(%edx) // compare edx to byte of 0 (null..?)
0x08048e9e <+14>: je 0x8048ea9 <string_length+25> // if equal, jump to +25
0x08048ea0 <+16>: add $0x1,%eax // else, add 1 to eax
0x08048ea3 <+19>: cmpb $0x0,(%edx,%eax,1) // compare byte 1*eax+edx with 0,
0x08048ea7 <+23>: jne 0x8048ea0 <string_length+16> // if not equal, back to +16
0x08048ea9 <+25>: pop %ebp // pop ebp
0x08048eaa <+26>: ret

由于函数名称是 string_length,我假设它将返回字符串中有多少个字符。

我感到困惑的是

cmpb   $0x0,(%edx)

这是将指向 edx 的任何内容与 0 的字节进行比较,而 ASCII 中的 0 为 null..?

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

正在比较(以字节为单位)1*eax+edx。如果edx是一个字符串,是否意味着edx会先转换成ascii值,然后再进行计算?

最佳答案

这个:

cmpb   $0x0,(%edx)

获取 EDX 指向的字节(即包含其地址)并将其与零进行比较。这:

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

获取 EDX+EAX 指向的字节并将其与零进行比较。 EDX作为字符串基指针,EAX作为索引。比例为 1,因为我们使用的是字节。这样考虑整个循环:for(eax=0; edx[eax] != 0; eax++)

关于assembly - 了解汇编语言中的 cmpb 和循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22801152/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com