Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 有没有办法知道%esp和%ebp之间的内存地址差异?_Assembly_X86_Att - Fatal编程技术网

Assembly 有没有办法知道%esp和%ebp之间的内存地址差异?

Assembly 有没有办法知道%esp和%ebp之间的内存地址差异?,assembly,x86,att,Assembly,X86,Att,(32位汇编,所以我不能像r14那样使用寄存器) 有没有办法知道%esp和%ebp之间的内存地址差异 例如,如果堆栈中有一个小于2的元素,我想返回read_标记,它返回并等待另一个字母 因此,如果差值小于两个块(8),那么我想返回到read_token 但我发现代码如下所示: cmpl $4, (%ebp)-(%esp) jle read_token 这实际上是不可能的 我知道 “弹出一个元素/检查堆栈顶部是否为空/如果为空,则将其放回/如果为非空,则转到读取\u标记” 是可能的,但我认为这是

(32位汇编,所以我不能像r14那样使用寄存器)

有没有办法知道%esp和%ebp之间的内存地址差异

例如,如果堆栈中有一个小于2的元素,我想返回read_标记,它返回并等待另一个字母

因此,如果差值小于两个块(8),那么我想返回到read_token

但我发现代码如下所示:

cmpl $4, (%ebp)-(%esp)
jle read_token
这实际上是不可能的

我知道

“弹出一个元素/检查堆栈顶部是否为空/如果为空,则将其放回/如果为非空,则转到读取\u标记”


是可能的,但我认为这是如此复杂,可能有更简单的方法。。。有人能帮我吗?

来实现
do{}while(esp来实现
do{}while)(esp)我也试着用%ecx来计算堆栈的数量,但不知怎的我陷入了腐败,所以我正在寻找另一种方法。是
(%ebp)
(%esp)
在表达式中应该是内存操作数,或者您实际上是在检查寄存器值吗?您需要一个tmp寄存器,例如
lea-4(%ebp),%eax
/
cmp%eax,%esp
/
jbe堆栈的指针在\u ebp的正下方。(对地址使用无符号比较;堆栈可能跨越有符号溢出边界。)我正在尝试检查地址值!然后不要写入
(%reg)
-这意味着AT&t语法中的内存操作数。无论如何,最后一个注释中的LEA/CMP是您要查找的,对吗?如果(esp正在工作!!!非常感谢您的帮助!我想给您一百万美元我也尝试过使用%ecx计算堆栈数,但不知何故我被损坏了,所以我正在寻找另一种方法。是
(%ebp)
(%esp)
在表达式中应该是内存操作数,或者您实际上是在检查寄存器值吗?您需要一个tmp寄存器,例如
lea-4(%ebp),%eax
/
cmp%eax,%esp
/
jbe堆栈的指针在\u ebp的正下方。(对地址使用无符号比较;堆栈可能跨越有符号溢出边界。)我正在尝试检查地址值!然后不要写入
(%reg)
-这意味着AT&t语法中的内存操作数。无论如何,最后一个注释中的LEA/CMP是您要查找的,对吗?如果(特别是它起作用了!!!非常感谢你的帮助!我想给你一百万张选票
.loop:                          # do{
   ...

   lea -4(%ebp), %eax                  # eax = ebp-4
   cmp %eax, %esp                      # AT&T means compare mnemonics are backwards
   jbe .Lloop                   # }while(esp <= ebp-4)
   mov   %ebp, %eax
   sub   %esp, %eax

  # cmp   $4, %eax
  # j??  somewhere