条件指令
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,