|
条件指令1. CMP指令- CMP比较指令不能够引用两个内存位置,两个内存位置至少有一个需要复制到寄存器中,才能进行比较操作。
- 高级汇编选择语句的写法
mov eax, count.if eax > numbermov 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 ENDIF01THEN01: dec numberENDIF01: nop - 为NOP指派一个标记是方便的,方便未来能够添加其他语句
- IF01 THEN01 ENDIF01 都是可读性的考虑。
; if count > number; flag = -1; end if;IF02: mov eax, count cmp eax, number jle ENDIF02THEN02: mov flag, -1ENDIF02: nop3. IF THEN ELSE的汇编写法例子:
;if x>= y; x--; else; y--IF03: mov eax, x cmp eax, y jl ELSE03THEN03: dec x jmp ENDIF03ELSE03: dec yENDIF03: 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 ELSE01THEN01: inc y jmp ENDIF01ELSE01: nopIF02: cmp x, 100 jg ELSE02THEN02: mov y, 0 jmp ENDIF02ELSE02: dec yENDIF02: NOPENDIF01:
|
|