2015-11-08 29 views
-4

我明白这段代码是干什么的,直到它离开循环并执行指令cmpl $ 0x632,-0x4(%ebp)。 应该是什么我的输入,使得SETE%人将1个 PS:语法是AT & T,它假定第一个操作数源和第二个操作数是目标程序集x86代码,0x632代表什么?

08048862 <phase3>: 
8048862: 55      push %ebp 
8048863: 89 e5     mov %esp,%ebp 
8048865: 83 ec 10    sub $0x10,%esp 
8048868: c7 45 fc 00 00 00 00 movl $0x0,-0x4(%ebp) 
804886f: 83 45 fc 01    addl $0x1,-0x4(%ebp) 
8048873: 8b 45 fc    mov -0x4(%ebp),%eax 
8048876: 3b 45 08    cmp 0x8(%ebp),%eax 
8048879: 7e f4     jle 804886f <phase3+0xd> 
804887b: 81 7d fc 32 06 00 00 cmpl $0x632,-0x4(%ebp) 
8048882: 0f 94 c0    sete %al 
8048885: 0f b6 c0    movzbl %al,%eax 
8048888: c9      leave 
8048889: c3      ret  
+0

谢谢,我正要编辑它大声笑 –

+2

0x632是Halt and Catch Fire值。如果一台计算机在内存中看到它,它会导致计算设备的灾难性故障。你应该立即离开你的家。对于任何人来说,破坏性的力量都会让人无法忍受。这不奇怪,它出现在一个炸弹实验室;) –

回答

0

sete al(对不起,使用Intel语法)将al设置为1,必须设置零标志。这意味着[ebp - 4]必须等于0x632

您必须从这里开始工作并重新解释前面的说明。

+0

该函数接受2个参数,第1 [ebp - 4]它被设置为0,在jle之前它将[edp - 4]与第2个参数进行比较。我的问题是应该为这些参数输入什么,所以当它离开循环时,[ebp-4]等于0x632。而且我怎样才能在'char'中表示0x632,十进制数为1586? –

+0

@KevinSilva即使你声称你了解代码,你显然不知道。对于初学者来说,它只接受一个参数,“ebp-4”是一个局部变量。 – Jester

+0

好的,但不是分配4字节的函数吗?为什么它只有1个参数? –

1

这个功能要么是跛脚,要么是复杂的,我无法把握。它在[ebp-4]处以0开始本地,然后不断递增,直到它的值大于[ebp + 8]中参数的值。一旦完成循环,如果[ebp-4]处的本地值等于0x632(1586),它将返回true。在我看来,整个循环都可以避免,并且参数at [ebp + 8]可以改为与0x632进行比较。

无论如何,在你的问题“应该是我的输入”,通过“输入”我假定你的意思是[ebp + 8]的参数。那么,我会假定所有的区别在于你是否在[ebp + 8]参数中传递等于,小于或大于0x632的东西。

+1

是的,这是跛脚。它适用于刚学习装配的学生。你得到了这个部分错误:_returns如果本地在[ebp-4]小于或等于0x632_,则返回true。它必须与**相等,因为'sete'测试的是否相等。而对于地方来说,这个论点必须是一个具体的价值。 – Jester

+0

@Jester你是对的,等于它。 –

0

谢谢你的所有意见,他们是有帮助的。 它只需要1个参数,它是1585,所以当它得到的循环局部变量将是1586,这是十进制的0x632