HWitty 发表于 2023-7-14 12:20:35

汇编代码求解-3

问题:00401041mov eax,为啥不是mov eax,?

          00401055 mov eax, 为啥不是mov eax,?

它是把argc的值和0比较,,等于0才跳转到00401055,才把【esp+4】也就是n1的值给eax,

问题是   argc?n1:n2+3   当argc==0时,表达式为假,要执行n2+3的嘛,这就对不上啊

陶远航 发表于 2023-7-14 12:20:52

汇编代码中的mov eax,指令是将栈顶元素的值赋给eax寄存器。而mov eax,指令是将栈顶下一个元素的值赋给eax寄存器。

在这段代码中,mov eax,是将argc的值加载到eax寄存器中进行比较。这里假设esp指向了存储argc的位置。然后,它会与0进行比较,如果相等,则跳转到地址00401055。

至于为什么不是mov eax,,这涉及到栈的结构和函数调用的约定。在一些函数调用约定中,参数通过压入栈的方式传递给函数。当函数调用时,参数按照从右到左的顺序被压入栈中。所以,在这种情况下,处保存的是第一个参数argc的值,而处保存的是第二个参数n1的值。

综上所述,这段代码的意图是比较argc是否为0,如果是,就执行后续的操作,否则跳转到另一个地址。对于表达式n1:n2+3,当argc为0时,由于表达式的条件为假,所以不需要执行n2+3的操作,因此无需将n1的值赋给eax寄存器。

需要注意的是,汇编代码的具体含义和操作可能会根据上下文和编译器的实现而有所不同。以上只是对常见情况的一般解释,具体情况还需要根据代码的上下文进行分析。

sfqxx 发表于 2023-7-14 12:25:42

在给定的汇编代码中,我们可以观察到该程序正在使用堆栈来操纵值并进行比较。让我们分析一下你问题中提到的具体指令。

1. `mov eax, `:这条指令将堆栈顶部的值(即存储在``处的值)复制到`eax`寄存器中。在这种情况下,它用于获取`argc`的值。

2. `mov eax, `:这条指令将``处的值复制到`eax`寄存器中,即获取堆栈上的第二个元素。这个值对应于C++源代码中的`n1`。

关于你对`argc ? n1 : n2+3`的困惑,让我们解释一下它是如何工作的:

- `argc`表示传递给程序的命令行参数的数量。
- 如果`argc`非零(true),程序将执行语句`n1`,因为`n1`是从输入中读取的第一个值。
- 如果`argc`为零(false),程序将执行语句`n2 + 3`,因为`n2`是从输入中读取的第二个值。

因此,根据条件(`?`)和`argc`的值,程序将相应地执行`n1`或`n2+3`。

如果您对此解释有任何疑问或问题,请提供更多上下文或进一步澄清您的问题。

HWitty 发表于 2023-7-14 12:42:13

陶远航 发表于 2023-7-14 12:20
汇编代码中的mov eax,指令是将栈顶元素的值赋给eax寄存器。而mov eax,指令是将栈顶下一个元素 ...

????3目运算,,表达式条件为假,才执行n2+3,为啥你要说为假不执行呢

HWitty 发表于 2023-7-14 12:45:29

sfqxx 发表于 2023-7-14 12:25
在给定的汇编代码中,我们可以观察到该程序正在使用堆栈来操纵值并进行比较。让我们分析一下你问题中提到的 ...

为啥esp位置存放的是argc的值,,,图上argc在esp+0c的位置,咋变成argc在esp的位置了

sfqxx 发表于 2023-7-14 13:15:51

HWitty 发表于 2023-7-14 12:45
为啥esp位置存放的是argc的值,,,图上argc在esp+0c的位置,咋变成argc在esp的位置了

对不起,我之前的回答有一个错误。根据你提供的信息,`argc`确实存储在`esp+0C`的位置,而不是直接在`esp`的位置。

所以正确的代码应该是`mov eax, `,它将``处的值复制到`eax`寄存器中,这样可以获取到`argc`的值。非常抱歉给你带来的困惑。

如果你还有其他问题,请随时提问。

HWitty 发表于 2023-7-14 16:10:24

sfqxx 发表于 2023-7-14 13:15
对不起,我之前的回答有一个错误。根据你提供的信息,`argc`确实存储在`esp+0C`的位置,而不是直接在`esp ...

大哥,你认真看没哦,,,
它是把值和0比较,并不是要把给eax,而是通过比较后标志寄存器的值,在从栈中找n1或者n2的值给eax,

我的问题是:n1和n2在栈中的位置是不是有错误

你看你在说啥子

sfqxx 发表于 2023-7-14 17:59:13

HWitty 发表于 2023-7-14 16:10
大哥,你认真看没哦,,,
它是把值和0比较,并不是要把给eax,而是通过比较后标志寄 ...

回答不符合你的要求就不回答了。

真搞笑,我第一次见回复不严谨举报的{:5_101:}

编程追风梦 发表于 2023-7-15 06:44:36

根据你提供的代码片段来看,问题的关键在于理解栈(stack)的结构和操作。
在x86汇编语言中,ESP寄存器指向栈的顶部。当函数被调用时,参数和局部变量通常会被推送到栈上。栈是一个后进先出(LIFO)的数据结构,因此最新推送的数据位于栈的顶部。
对于第一个问题:
00401041mov eax,
这行代码将栈顶部的值(即``)移动到`eax`寄存器。这行代码用于将`argc`的值加载到`eax`寄存器中。因此,`argc`的值应该位于栈顶。

对于第二个问题:
00401055 mov eax,
这行代码将栈顶部偏移4个字节处的值(即``)移动到`eax`寄存器。根据你的描述,这行代码用于将`n1`的值加载到`eax`寄存器中。因此,在这个上下文中,`n1`的值应该位于栈顶的后面4个字节处。

求求给个最佳答案吧,我真的很需要,你的最佳,就是我的动力

编程追风梦 发表于 2023-7-15 09:10:12

sfqxx 发表于 2023-7-14 17:59
回答不符合你的要求就不回答了。

真搞笑,我第一次见回复不严谨举报的

是GPT,但是不是脚本,啊算啦,分不清,不知道大众是地址GPT还是脚本{:10_277:}

sfqxx 发表于 2023-7-15 10:32:15

编程追风梦 发表于 2023-7-15 09:10
是GPT,但是不是脚本,啊算啦,分不清,不知道大众是地址GPT还是脚本

让这件事情越闹越大吧,我反正就是反对楼主观点

编程追风梦 发表于 2023-7-15 19:40:20

sfqxx 发表于 2023-7-15 10:32
让这件事情越闹越大吧,我反正就是反对楼主观点

啊这,冷静啊兄弟,楼主还是个新鱼油吧

zhangjinxuan 发表于 2023-8-1 14:54:26

sfqxx 发表于 2023-7-14 17:59
回答不符合你的要求就不回答了。

真搞笑,我第一次见回复不严谨举报的

他把你当成这个论坛专门的回复人员了{:10_256:}

学习编程中的Ben 发表于 2023-8-1 15:09:12

看看
页: [1]
查看完整版本: 汇编代码求解-3