xorl %eax, %eax

news/2024/11/24 22:25:48/
这是GNU的汇编
xorl    %eax, %eax(这句起什么作用)
按位异或,相同的位置为0,不同的位置为1,eax和eax的每一位都相同,所以相当于清零。
        movl    8(%ebp), %ecx
        testl   %ecx, %ecx(这句起什么作用)
    jle     .L3
8(%ebp)是第一个参数,检验它的值,若小于等于0则转

其它的,看看GNU汇编的语法吧。


在汇编代码中经常看到  

[plain]  view plain copy
  1. xorl %edx, %edx  

        这个指令可以将寄存器 %edx 设置为 0,运用了对任意x,x^x = 0 这一属性。将寄存器 %edx 设置为 0 的更直接的方法是用指令 movl $0, %edx。使用 objdump 对比发现使用 xorl 的版本只需要 2 个字节,而是用 movl 的版本需要 5 个字节。



TEST 指令是进行与运算 不保留结果 
JL  指令是有符号当选条件转移指令  含义是小于/不大于(A>B) 转移   
其标志位 是SF≠OF AND ZF=0转移
sunshine 
   [第6楼]   [ 回复时间:2007-11-14 09:39 ]   [引用]   [回复]   [ top ]
荣誉值:106 
信誉值:0 
注册日期:2007-06-26 15:10
JL  指令是有符号当选条件转移指令  含义是小于/不大于转移    
其标志位 是SF≠OF AND ZF=0转移
nekaxi 
   [第7楼]   [ 回复时间:2007-11-14 18:39 ]   [引用]   [回复]   [ top ]
荣誉值:9 
信誉值:6 
注册日期:2007-10-10 08:31
test    ebx, ebx  
jl      short 0044ABC5 ----------->摘自反汇编代码,使用应该不会有错吧? 

test    ebx, ebx一般用来判断EBX是否为0,所以上面的用法的确令人费解!!!!
cxn 
   [第8楼]   [ 回复时间:2007-11-14 22:33 ]   [引用]   [回复]   [ top ]
荣誉值:179 
信誉值:6 
注册日期:2007-07-09 19:18
这个是汇编的技巧,刚开始也很费解呵呵. 
TEST影响 C,O,P,Z,S  而JL根据 SF≠OF AND ZF=0跳转 
要想跳转至少ebx中的数不能为0 (为0了ZF就该为1了) 
而OF位没有溢出所以始终为0 所以只能是SF为 1 才跳转 
所以 条件满足SF=1 OF=0 ZF=0时也就是当ebx中的数为负数时才跳转. 
也就是如果ebx中的数为负跳到0044ABC5 

同上指令还可以写为  
AND EBX,EBX 
JL SHORT 0044ABC5 
或 
OR EBX,EBX 
JL SHORT 0044ABC5 
这两条是不是更令人费解?


http://www.ppmy.cn/news/221519.html

相关文章

lex(flex)yacc(bison)

初始配置 文法分析用Flex(Lex):将数据分隔成一个个的标记token (标示符identifiers,关键字keywords,数字numbers, 中括号brackets, 大括号braces, 等等etc.)语法分析用Bison(Yacc): 在分析标记的时候生成抽象语法树. Bison 将会做掉几乎所有的这些工作, …

Windows下安装lex(flex)与yacc(bison)

上完第一节编译原理,Mr李要求这周自己探索一下lex和yacc这两个工具。 查了一下lex与yacc是两个在Unix下的分别作词法分析和语法分析的工具,都说很强大。而他俩在linux下又有对应的东西叫flex与bison。虽然硬盘上装了ubuntu但是不怎么用,linu…

ElasticSearch7.X和ElasticSearch8.X学习记录

ElasticSearch7 倒排索引 数据写入时,建立关键字和主键的映射,查询时–>关键字–>主键–>对应文章 分片 因为ES是以检索为主的产物,为了便于查询,会将数据进行分片,例如:根据性别分片,当查询女…

【ESXi 7.x内部升级】ESXi 升级 —— 小版本升级(7.X或8.X版本内升级)

目录 4. 小版本升级(7.X或8.X版本内升级)4.1 示例 — 使用 vSphere Lifecycle Manager升级 ESXi目标:将 VMware ESXi 7.0 U2e 升级为 7.0 U3f(1)在vSphere Client 中查看需要升级的 ESXi 版本(2&#xff09…

如何使用lex

第一次在blog上粘代码时觉得很郁闷,缩进变得很短,关键字也没有颜色变化(当然这么简单的用复制粘贴也只能是这种效果)后来自己用c#做了个小程序,用来在代码里贴上html标签。折腾里一个晚上,费了不少劲。第二…

yylex使用

%{#include <stdio.h>#include <stdlib.h>int num_num 0;int num_id 0; %} INTEGER [-]?[1-9][0-9]* ID [a-zA-Z][a-zA-Z_0-9]* SPACE [ \n\t] %% {INTEGER} { num_num;printf("(num %d)\n", atoi(yytext));/*打印数字值*//*数字数加一*/ }{ID} { nu…

【ESXi 7.x 升 8.x】ESXi 升级 —— 使用 ESXCLI 升级 ESXi(Offline Bundle ZIP)

目录 3. 大版本升级 6.X 升级至 7.X3.1 示例 — 使用 ESXCLI 升级 ESXi&#xff08;Offline Bundle ZIP&#xff09;【目标&#xff1a;将 ESXi 6.5 U2 GA 升级为 7.0 U3f】&#xff08;1&#xff09;下载离线升级ZIP包&#xff08;2&#xff09;升级 ESXi① 查看离线包② 升级…

Lex 入门

Lex 入门 First! lex程序的结构是这样的&#xff01; 定义 %% 规则 %% 用户代码 一个 Lex 程序分为三个段&#xff1a;第一段是 C 和 Lex 的全局声明&#xff0c;第二段包括模式&#xff08;C 代码&#xff09;&#xff0c;第三段是补充的 C 函数。 这些段以%%来分界。 下面是一…