技术交流,DH讲解.

正式之前,我们看看寄存器和CPU的标志位:

OD中的截图,下方的CPAZSTDO就是标志位.

Delphi的FPU窗口,右边一列就是标志位.
为什么要给大家看标志位呢?因为ASM中的跳转语句都是由相应的标志位控制的.
而标志位又是由于以下的情况影响的:
1.运算结果为0,Zero Flag(ZF)被设定
2.运算结果太大或者太小,超容了,Carry Flag(CF)被设定
3.Sign Flag(SF)是运算结果的最高位发生变化的时候,结果为正SF=1,为负SF=0
4.指令无效时(al=+127, al+1爆 , al = -128 , al-1爆),Over Flag会被设定
5.运算造成结果的地位中1的个数是偶数个的时候Parity Flag会被设定

指令讲解:
具体指令之前,先说一下:reg代表寄存器,mem代表内存上的数(变量),imm代表立即数(常量)
AND,二元操作符,位与
合法形式:

AND reg , reg
AND reg , mem
AND reg , imm
AND mem , reg
AND mem , imm

标志位:总是清除OF和CF,根据结果来设置SF,ZF,PF.
来看个例子吧:

function TestAnd(a,b:Integer):Integer ;
asmand eax,edx
end;procedure TForm4.FormCreate(Sender: TObject);
vara:Integer;
begina:=$F;//00001111ShowMessage(IntToStr(TestAnd(a,1)));
end;

运算前
运算后
来个有用的函数,字符转换成大写:

function UpcaseChar(a:AnsiChar):AnsiChar;
asmand al,$DF
end;

OR,二元操作符,位或
合法形式:

OR reg , reg
OR reg , mem
OR reg , imm
OR mem , reg
OR mem , imm 

标志位:和AND一样.
例子将0~9的整数变成对应的Char形式:

function _0_9ToChar(n:Byte):AnsiChar;
asmor al,$30
end;

运算前
运算后

XOR,二元操作符,位异或(相同为0,不同为1)
合法形式:同AND
标志位:同AND
我们有时候需要将某个寄存器清零,我们有2种方式:

procedure TestXor;
asmxor eax,eaxmov eax,0
end;

反汇编看:

第一个指令:$31C0只用了2个字节.第二个指令就用了5个字节.
NOT,一元操作符,位非(1变0,0变1)
合法形式:

NOT reg
NOT mem

标志位:不影响任何标志位
TEST,二元操作符,和AND的一样,但是不改变2个操作数的值,只影响标志位.
合法形式:同AND
标志位:同AND
我们经常需要判断一个string变量是否为nil

function TestTest(const s:string):Integer;
asmtest eax,eax //if s=nil thenjz @@nExit
end;

CMP,二元操作符,比较2个数大小
合法形式:同SUB指令
标志位:
                CF ZF
目的<來源 | 0 | 1
目的>來源 | 0 | 0
目的=來源 | 1 | 0
带正负号的数比较:
目的<來源 | SF≠OF
目的>來源 | SF=OF
目的=來源 | ZF=1

常用的设置个别标志位的方法:
1 ZF

and al,0 //ZF=1,任何数和0进行与
or al,1 //ZF=0,任何数和1进行或

2 SF

or al,$80 //SF=1,最高位与1进行或
and al,$7F //SF=0,最高位与0进行与

3 CF

stc //CF=1
clc //CF=0

4 OF

mov al,$7F
inc al //OF=1
or al,0 //OF=0

跳转指令
一般跳转根据:1 标志位 2 参与运算的2个数
第一组:N代表Not,J就是Jump,然后其他字母对应相应的标志位
JZ   | 若為零則跳     | ZF=1
JNZ | 若為不零則跳 | ZF=0
JC   | 若進位則跳     | CF=1
JNC | 若不進位則跳 | CF=0
JO   | 若溢位則跳     | OF=1
JNO | 若不溢位則跳 | OF=0
JS    | 若負號則跳    | SF=1
JNS  | 若非負號則跳 | SF=0
JP    | 同位(偶)則跳  | PF=1
JNP | 非同位(奇)則跳 | PF=0
第二组:根据参与运算的2个数的值
JE     | 相等則跳(leftOp=rightOp)
JNE   | 不相等則跳(leftOp≠rightOp)
JCXZ | 若 CX = 0 則跳
JECXZ | 若 ECX = 0 則跳
无符号2个数比较时候:
JA     | 較大則跳 大于
JNBE | 不是較小或相等則跳(=JA) 大于
JAE   | 較大或相等則跳 大于等于
JNB   | 不是較小則跳(=JAE)大于等于
JB     | 較小則跳 小于
JNAE | 不是較大或相等則跳(=JB)小于
JBE   | 較小或相等則跳 小于等于
JNA   | 不是較大則跳(=JBE)小于等于
有符号2个数比较时候:
JG      | 較大則跳
JNLE  | 非較小或相等則跳(=JG)
JGE    | 較大或相等則跳
JNL    | 不是較小則跳(=JGE)
JL      | 較小則跳
JNGE | 非較大或相等則跳(=JL)
JLE    | 較小或相等則跳
JNG   | 不是較大則跳(=JLE) | 不是較大則跳(=JBE)

好我们来看下怎么写一个求2个数中较小的一个数的函数

function IntegerMin(a,b:Integer):Integer;
asmcmp eax,edxjg @@nBminret
@@nBmin:mov eax,edx
end;function CardinalMin(a,b:Cardinal):Cardinal ;
asmcmp eax,edxja @@nBminret
@@nBmin:mov eax,edx
end;

关键处的跳转指令不一样的,因为数据类型不一样.

最后来看一下循环指令
LOOPELOOPZ,一元操作符,满足条件就跳转,条件是ZF=1 and ecx>0
合法形式:LOOPE/LOOPZ 标签

LOOPNELOOPNZ,一元操作符,条件ZF=0 AND ECX>0
合法形式:和LOOPE
我们用LoopE来在一个字符串中查找一个字符

function FindChar(a:AnsiChar;const s:AnsiString):Integer ;
asmtest edx,edx   //s=niljz @@nNotFoundmov ecx,[edx - 4]//length(s)=0jz @@nNotFoundpush edxdec edx
@@nLoop:inc edxcmp al,Byte ptr [edx]loopne @@nLooppop edxtest ecx,ecxjz @@nNotFoundmov eax,[edx - 4]sub eax,ecxdec eaxret
@@nNotFound:xor eax,eax
end;

好了今天能说的就这么多了.特别感谢http://evotalk.net..都是中国人哈哈.

转载于:https://www.cnblogs.com/huangjacky/archive/2010/01/20/1652495.html

ASM - 条件判断相关推荐

  1. smali to java_Smali —— 数学运算,条件判断,循环

    通过上一篇 Smali 语法解析--Hello World 的学习,了解了 Smali 文件的基本格式.这一篇从最基本的数学运算,条件判断,循环等开始,更加详细的了解 Smali 语法. 数学运算 加 ...

  2. 已知2个整形数据a,b.不使用if,?:以及其他任何条件判断的语法,找出a跟b中数据的大者。

    已知2个整形数据a,b.不使用if,?:以及其他任何条件判断的语法,找出a跟b中数据的大者. 答案: int max(int a,int b) { return (a+b+abs(a-b))/2; } ...

  3. bash 脚本编程2 条件判断 (笔记)

    条件判断类型: 整数测试 字符测试 文件测试 条件表达式: [ exppression ] ` expression ` test expression 注意一定要加空格前后都要加 整数比较:  -e ...

  4. Python中if条件判断语句怎么用?

    俗话说"不积跬步无以至千里".学习了Python的基本语法后,接下来我们学习Python常的if条件判断语句. if语句是最简单的条件判断语句,它可以控制程序的执行流程,其使用格式 ...

  5. c#switch语句判断成绩_Go的条件判断语句

    现实时间中,我们如果想去购物,可以选择网上或者线下去购物,甚至说,要购买的物品都有许多选择,选价格便宜的,选质量好的,选不用运费等等 那么在计算机语言中,我们要怎么实现现实中,这些选择呢? Go语言支 ...

  6. R语言将多分类数据集转化为二分类数据集,使用条件判断将多分类转化为二分类(transform dataset into a dichotomous factor response dataset)

    R语言将多分类数据集转化为二分类数据集,使用条件判断将多分类转化为二分类(transform dataset into a dichotomous factor response dataset) 目 ...

  7. pandas基于条件判断更新dataframe中所有数据列数值内容的值(Conditionally updating all values in pandas Dataframe )

    pandas基于条件判断更新dataframe中所有数据列数值内容的值(Conditionally updating all values in pandas Dataframe ) 目录

  8. pandas基于条件判断更新dataframe中特定数据列数值内容的值(Conditionally updating values in specific pandas Dataframe )

    pandas基于条件判断更新dataframe中特定数据列数值内容的值(Conditionally updating values in specific pandas Dataframe ) 目录

  9. R语言switch语句语法、实战:Switch语句用来处理嵌套的if else处理起来比较困难或者麻烦的条件判断问题

    R语言switch语句语法.实战:Switch语句用来处理嵌套的if else处理起来比较困难或者麻烦的条件判断问题 目录

最新文章

  1. 自研芯片架构 ,这家中国公司发布DPU芯片计划
  2. 黯然微信小程序杂记(二):小程序最新版登录并进行缓存模块的实现 附源码
  3. python基因差异分析_差异基因
  4. python的c语言扩展方法简介
  5. unity shader 变种(多重编译 multi_compile)
  6. java避免空指针异常
  7. Linux(Centos7) 设置静态IP
  8. 计算本周是几号到几号
  9. Spring源码分析之ProxyFactoryBean方式实现Aop功能的分析
  10. Android* 4.1.1 (Jelly Bean) x86 模拟器系统映像
  11. eclipse在线安装ivy和ivyde
  12. 80X86CPU独立编址方式的两种寻址方式——直接寻址直接写和间接寻址DX
  13. 《Unity着色器和屏幕特效开发秘笈》—— 1.7 创建渐变纹理来控制漫反射着色...
  14. 控件多线程访问的问题
  15. 8086汇编语言入门-HelloWorld
  16. Powerpoint中VBA编程技巧
  17. 微信小程序微信授权登录
  18. MPLS-虚拟专用网络
  19. “黑产“识别算法(社区检测,相似度,关联关系)
  20. 三千年读史,不外乎功名利禄。九万里悟道,终归诗酒田园。

热门文章

  1. conda 基本操作
  2. map集合根据value找key,默认取第一个key
  3. Sprint(第一天11.14)
  4. 编译linux内核步骤
  5. 软件调试修炼之道之——反思
  6. verilog中如何拆分一个数
  7. Android开发之Fragment与Activity的数据交互通过回调机制实现(源代码分享)
  8. Spring 注解的作用
  9. linux动态线程池--原理,这儿的代码不完整
  10. Android:面试官死亡问答,如何优化一个网络请求?大牛多个网络优化方案帮你解决!