汇编条件指令总结

评价:
0
(0用户)

条件指令

1. CMP指令

  • CMP比较指令不能够引用两个内存位置,两个内存位置至少有一个需要复制到寄存器中,才能进行比较操作。
  • 高级汇编选择语句的写法
    mov eax, count
    .if eax > number
    mov flag, -1
    .endif
    
  • 程序员可以直接使用4个通用的寄存器。eflag是一个重要的寄存器,它控制着CPU的方方面面,记录了任意时刻CPU的状态。
  • 在各种类型指令执行的时候,会在eflag寄存器中用1到2个位作为flag标记。
  • 每个flag标记都指令2个字母的缩写名。BIT0  CF  无符号整数进位

    BIT2  PF  偶数位被置位

    BIT6  ZF  运算结果为0

    BIT7  SF  结果为负

    BIT10 DF  从高比特到低比特处理字符串

    BIT11 OF 溢出标志

  • 更改这些标记的方式是使用CMP指令,CMP指令来比较两个操作数并设置相应的标记。CPU完成上述比较操作,它实际上完成了一个隐性的减法操作,然后设置了相应的标记值。
  • 可以把寄存器与立即数比较,寄存器与内存比较,立即数与内存比较,两个寄存器比较。禁止两个内存位置比较

2. JE指令

  • jg  大于  jge 大于等于  jl  小于  jle 小于等于
  • 汇编与高级语言条件语句逻辑是相反的,当判断结果为真的时候,程序不执行紧接着的部分程序代码,而是跳转到其他程序分支。主要把逻辑关系对调以下。
  • 变量number 和0进行比较,如果两个值不相等,进行一个不相等的跳转操作
  • 如果两个值相等,程序控制流不变,顺序执行
IF01:            
    cmp number, 0
    jne ENDIF01
THEN01:     
    dec number
ENDIF01:     
    nop  
  • 为NOP指派一个标记是方便的,方便未来能够添加其他语句
  • IF01  THEN01  ENDIF01 都是可读性的考虑。
; if count > number
; flag = -1
; end if;

IF02:        
    mov eax, count
    cmp eax, number
    jle ENDIF02
THEN02: 
    mov flag, -1
ENDIF02: 
    nop

3. IF THEN ELSE的汇编写法

例子:

;if x>= y
;   x--
; else
;   y--
IF03:    
    mov eax, x
    cmp eax, y
    jl  ELSE03
THEN03:  
    dec x
    jmp ENDIF03
ELSE03:  
    dec y
ENDIF03: 
    nop
  • 不要忘记在Then部分结尾使用无条件跳转语句绕过ELSE语句。
  • 注意每一个IF-THEN-ELSE都有一套完整的标记。 增加可读性,便于日后维护程序。

4. 嵌套的IF结构

例子:

; if (x<50){
;     y++;
;  }
;  else if(x <= 100){
;         y = 0;
;  }
;  else{
;         y--;
;  }

IF01:  
    cmp x, 50
    jge ELSE01
THEN01: 
    inc y
    jmp ENDIF01
ELSE01: 
    nop
IF02:  
    cmp x, 100
    jg  ELSE02
THEN02: 
    mov y, 0
    jmp ENDIF02
ELSE02: 
    dec y
ENDIF02: 
    NOP
ENDIF01:

注册并通过认证的用户才可以进行评价!

admin:支持一下,感谢分享!,+10,  

发表评论