Assembly 在该段中,与程序集代码的.L2标签关联的代码是否按过程调用?

Assembly 在该段中,与程序集代码的.L2标签关联的代码是否按过程调用?,assembly,x86,gnu-assembler,Assembly,X86,Gnu Assembler,我试图在汇编中分析以下代码 sub $48, %esp mov $56, 44(%esp) mov $3, 40(%esp) mov $0, 36(%esp) mov 44(%esp), %eax mov %eax, 32(%esp) jmp .L2 .L3: mov 32(%esp), %eax sub 40(%esp), %eax mov %eax, 32(%esp) add $1, 36(%esp) .L2: mov 32(%esp), %eax cmp 40(%esp), %eax ja

我试图在汇编中分析以下代码

sub $48, %esp
mov $56, 44(%esp)
mov $3, 40(%esp)
mov $0, 36(%esp)
mov 44(%esp), %eax
mov %eax, 32(%esp)
jmp .L2
.L3:
mov 32(%esp), %eax
sub 40(%esp), %eax
mov %eax, 32(%esp)
add $1, 36(%esp)
.L2:
mov 32(%esp), %eax
cmp 40(%esp), %eax
ja .L3
mov 36(%esp),%eax
mov 32(%esp),%edx
如果我的理解清楚的话,前6行将正常调用,然后程序跳转到.L2:并执行代码。如果R[eax]==R[40+R[esp],则代码将转到.L3

我的问题是,在此之后会发生什么。是执行.L3,然后代码转到.L2,因为它就在它后面,还是执行.L3后它会自动跳到最后两行

此外,我还可以使用一些有关读取汇编代码的技巧;我正在尝试查找eax和edx的最终值


谢谢你

你是正确的:跳转到.L3后,那里和ja.L3之间的所有6条指令都将按顺序执行,并且该过程将重复自身,直到不执行条件跳转


听起来你在阅读代码方面做得不错:)

谢谢!这让我明白了很多。不过,我还是很难理解mov$56,44(%esp)会发生什么。esp在那里会发生什么?56不是一个太大的值,不能放在5位寄存器中吗?首先,esp是32位宽。其次,它一点也没有改变。指令将值56移动到esp上方44字节的内存地址中。对不起,我的理解仍然很低。这意味着esp由其位置后面的32位表示?i。e、 mov 16(%esp),$9将从esp的第16位开始写入9?%esp是一个寄存器(与内存不同的存储器);您的“mov$56,44(%esp)”将$56的32位值移动到4个字节,从地址开始,通过将%esp的内容添加到值44。谢谢你,这非常清楚!所以最后我得到eax=0和edx=56,这开始有意义了。我一直在试图弄清楚L代表什么?层?你知道吗?谢谢。