gpt4 book ai didi

c - 为什么gcc生成 "leal -8240(%ebp), %eax; cmpl $1, %eax; ja XXX"而不是jmp指令?

转载 作者:行者123 更新时间:2023-11-30 17:25:10 24 4
gpt4 key购买 nike

我正在研究gcc生成的汇编代码。但是,我发现了以下代码片段:

.LBE58:
.loc 1 178 0
cmpl $8224, %ebp
jl .L12
cmpl $8225, %ebp
jle .L19
leal -8240(%ebp), %eax
cmpl $1, %eax
ja .L12
.LVL50:
.LBB76:
.LBB77:
.loc 1 373 0
movl 60(%esi), %eax
.loc 1 374 0
cmpl $8240, %ebp
.loc 1 373 0
movl 4(%eax), %ebx

通过查看源代码,我发现这应该是一条jmp指令。为什么gcc编译器使用3条指令而不是1条指令?它是否更高效或者在X86 cpu之间可移植(我不知道有哪个x86 cpu不支持jmp指令)

我的原因:ja 的下一条指令是 .LBB77 处的 mov 指令,该 mov 指令对应于第 373 行的源代码。如果 ja 不跳转,那么这是一个跨函数执行。这是一种非常奇怪的行为,并且是意料之外的。因此我断定它一定是一个“jmp”。

最终结果:这不是 jmp。它可能会运行源代码中第373行的指令。关闭。

==============================更多信息:

 178                 switch (s->state)
179 {
180 case SSL_ST_BEFORE:
181 case SSL_ST_ACCEPT:
182 case SSL_ST_BEFORE|SSL_ST_ACCEPT:
183 case SSL_ST_OK|SSL_ST_ACCEPT:

..................


342 default:
343 SSLerr(SSL_F_SSL2_ACCEPT,SSL_R_UNKNOWN_STATE);
344 ret= -1;
345 goto end;
346 /* BREAK; */
347 }
348
349 if ((cb != NULL) && (s->state != state))
350 {
351 new_state=s->state;
352 s->state=state;
353 cb(s,SSL_CB_ACCEPT_LOOP,1);
354 s->state=new_state;
355 }
356 }
357 end:
358 s->in_handshake--;
359 if (cb != NULL)
360 cb(s,SSL_CB_ACCEPT_EXIT,ret);
361 return(ret);
362 }
363
364 static int get_client_master_key(SSL *s)
365 {
366 int is_export,i,n,keya,ek;
367 unsigned long len;
368 unsigned char *p;
369 const SSL_CIPHER *cp;
370 const EVP_CIPHER *c;
371 const EVP_MD *md;
372
373 p=(unsigned char *)s->init_buf->data;
374 if (s->state == SSL2_ST_GET_CLIENT_MASTER_KEY_A)
375 {
376 i=ssl2_read(s,(char *)&(p[s->init_num]),10-s->init_num);
377
378 if (i < (10-s->init_num))
379 return(ssl2_part_read(s,SSL_F_GET_CLIENT_MASTER_KEY,i));
380 s->init_num = 10;
381

最佳答案

乍一看,这段小代码似乎是在抓取堆栈上某个东西的地址——局部变量的地址——将其放入寄存器中,看看它是否大于1,然后执行仅当存在时才跳转。

但我不太确定为什么 gcc 想要将地址与文字 1 进行比较,因为几乎每个地址都大于 1,在这种情况下 jmp 会可能和 ja 一样有效。那么也许它使用ebp寄存器来保存堆栈地址以外的东西?

无论如何,这并不是严格意义上的简单跳转。

关于c - 为什么gcc生成 "leal -8240(%ebp), %eax; cmpl $1, %eax; ja XXX"而不是jmp指令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27100578/

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