gpt4 book ai didi

c - 我在汇编中处理一个可能的数组,但我无法弄清楚起始值是多少

转载 作者:太空宇宙 更新时间:2023-11-04 02:52:32 24 4
gpt4 key购买 nike

尺寸包含数字 86。

var_10= dword ptr -10h
var_C= dword ptr -0Ch
size= dword ptr 8
push ebp
mov ebp, esp
sub esp, 28h
mov eax, [ebp+size]
mov [esp], eax ; size
call _malloc
mov ds:x, eax
mov [ebp+var_C], 0
jmp short loc_804889E

loc_804889E: ~~~~~~~~~~~~~~~~~~~~~
mov eax, [ebp+size]
sub eax, 1
cmp eax, [ebp+var_C]
jg short loc_8048887

loc_8048887: ~~~~~~~~~~~~~~~~~~~~~
mov edx, ds:x
mov eax, [ebp+var_C]
add edx, eax
mov eax, [ebp+var_C]
add eax, 16h
mov [edx], al
add [ebp+var_C], 1

我在撤消我正在进行的项目的这一部分时遇到了困难。有一部分代码将 ds:x 移动到 edx 并添加了 var_c ,我不确定该去哪里。

对我来说,程序看起来像是调用了 malloc,然后将其移入 ds:x,然后将 0 移至 var_c

之后,它只是从我的指针数组的大小中减去 1,并将该数字与 0 进行比较,然后跳转到添加 ds 的部分: xedx 中,这样它就可以将 eax 添加到 edx 中。

我在这里处理某种数组吗? loc_8048887edx 的第一个值是什么?这可能有帮助的另一种方法是查看它的 C 等价物......但这就是我想要完成的并且宁愿通过不同的方式学习解决方案。

谢谢!

最佳答案

在 x86 汇编中,存储在内存中的变量和存储在内存中的数组之间没有严格的区别。这仅取决于您访问内存区域的方式。您所拥有的只是代码和数据。不管怎样,我会说 ds:x 是一个数组,因为这里有这段代码:

mov     edx, ds:x        ; edx = [x]mov     eax, [ebp+var_C] ; eax = somethingadd     edx, eax         ; edx = [x] + somethingmov     eax, [ebp+var_C] ; eax = somethingadd     eax, 16h         ; eax = something + 0x16mov     [edx], al        ; [[x] + something ] = al . Yes, ds:x is an array!

loc_8048887edx 的值是多少?要找到它,您只需要一些非常基本的调试技能。我假设您手头有 gdb,如果没有,请尽快获取。然后用调试符号编译代码并链接它,然后用可执行文件运行gdb,在loc_8048887设置代码断点,用r运行程序>,最后检查 edx 的值。

这些是你需要的命令:

gdb myexecutable(gdb) b loc_8048887(gdb) r(gdb) info registers edx

关于c - 我在汇编中处理一个可能的数组,但我无法弄清楚起始值是多少,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20600780/

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