汇编Case语句

Case语句

要点

  • MASM不存在case结构的汇编指令,可以使用嵌套的IF结构来替代。
  • 一旦程序中出现太多的嵌套IF语句,最终的结果是代码变得非常难以阅读和维护
  • 当Switch后面的变量值等于下面某一个常量时,程序控制流转到相应的CASE语句。
  • ==默认的CASE语句可以通过无条件跳转来实现==。 不要忘记这个无条件跳转。
  • 正如C语言每个case后面有一个break一样,使用无条件跳转语句将程序的控制流跳转到case结构的结尾处。
  • 最后一个case语句或default语句不要break一样,汇编里页不需要跳转。

例子

SWITCH01:    
    cmp w,1
    je  case11;
    cmp w,2
    je  case12
    cmp w,3
    je  case12
    jmp DEFAULT01
CASE11:      
    inc x
    jmp ENDSWITCH01
CASE12:       
    inc y
    jmp ENDSWITCH01
DEFAULT01:    
    inc z
ENDSWITCH01:

练习:请使用MASM汇编指令实现

if(a>b){
      a= a-1;
}
else if(b>=c){
      b = b*2;
}
else if(c>d){
  c = c+ d;
}
else{
  d = d/2;
}

汇编条件指令总结

条件指令

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: