- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在研究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/
我正在跟踪一些 x86 代码以进行分配,我想知道“cmpl”到底做什么以及如何预测“jne”是否会得到满足。 80484bf: 83 7d f0 07 cmpl $0
是cmpl相当于movl的指令+ 比较。如果是这样,黑白有什么区别:(1) LBB1_2: cmpl $0, _data_ready(%rip) je LBB1_2 和:(2
这是我的炸弹圈问题的汇编代码,我卡在了阶段 2;炸弹实验室要求我们根据汇编代码找出正确的输入,否则它会爆炸。 从 我知道 %rbp -0x30(48) == 0 否则它会调用 并引爆炸弹;所以 %
我正在研究gcc生成的汇编代码。但是,我发现了以下代码片段: .LBE58: .loc 1 178 0 cmpl $8224, %ebp jl .L12 cmpl $8225, %ebp
我是一名优秀的程序员,十分优秀!