[笔记][汇编语言 基于x86处理器]条件处理

相关指令集总结
编号命令示例解释备注
1AND destination, sourceAND reg, reg
AND reg, mem
AND reg, imm
AND mem, reg
AND mem, imm
AND指令在两个操作数的对应位之间(按位)逻辑与(AND)操作,并将结果存放到目标操作数中AND指令总是清除溢出和进位标志位。并根据值来改变符号标志位,零标志位和奇偶标志位
2OR destination, sourceOR reg,reg
OR reg,mem
OR reg, imm
OR mem, reg
OR mem, imm
OR指令在两个操作数的对应位之间进行(按位)逻辑或(OR)操作,并将结果保存在目标操作数中。OR指令总是清除溢出和进位标志位。并根据值来改变符号标志位,零标志位和奇偶标志位
3XOR destination, sourceXOR reg,reg
XOR reg,mem
XOR reg, imm
XOR mem, reg
XOR mem, imm
XOR指令在两个操作数的对应位之间进行(按位)逻辑异或(XOR)操作,并将结果存放在目标操作数中。XOR指令总是清除溢出和进位标志位。并根据值来改变符号标志位,零标志位和奇偶标志位
4NOT destinationNOT reg
NOT mem
NOT指令触发(翻转)操作数中的所有位,其结果被称为反码。NOT指令不影响标志位。
5TEST destination, sourceTEST reg, reg
TEST reg, mem
TEST reg, imm
TEST mem, reg
TEST mem, imm
TEST指令在两个操作数的对应位之间进行AND操作,并根据运算结果设置符号标志位,零标志位和奇偶标志位。与AND的唯一区别在于,不会改变目的操作数。-
6CMP destination, sourceCMP指令执行从目的操作数中减去源操作数的隐含减法操作,并且不修改任何操作数当实际减法发生时,CMP指令按照计算结果修改溢出,符号,零,进位,辅助进位和奇偶标记位。-
7STC / CLCSTC / CLC若要进位标志位置1,用STC指令,清除进位标志位,用CLC指令。-
8Jcond destinationjc/jnc/jz/jnz/je/jl/jg当状态标志条件为真时,条件跳转指令就分支到目标标号。否则, 当标志位条件为假时,立刻执行条件跳转后面的指令。-
9LOOPZ/LOOPE destinationLOOPZ/LOOPE L1LOOPZ指令的工作和LOOP指令相同,只是有一个附加条件,为零控制转向目的标号,零标志位必须置1.32位模式下,ECX是循环计数器,64位模式下,RCX是循环计数器。
10LOOPNZ/LOOPNE destinationLOOPNZ/LOOPNE L1LOOPNZ指令与LOOPZ指令相对应,当ECX中无符号数值大于0且零标志位等于0时,继续循环。-

条件控制流伪指令
伪指令说明
.BREAK生成代码终止.WHILE或.REPEAT块
.CONTINUE生成代码跳转到.WHILE或.REPEAT块的顶端
.ELSE当.IF条件不满足时,开始执行的语言块
.ELSEIF condition生成代码测试condition,并执行其后的语句,直到碰到一个.ENDIF或另一个.ELSEIF伪指令
.ENDIF终止.IF,.ELSE或.ELSEIF伪指令后面的语句块
.IF condition如果condition为真时,则生成代码执行语句块
.ENDW终止.WHILE伪指令后面的语句块
.WHILE condition当condition为真时,生成代码执行.WHILE和.ENDW伪指令之间的语句块
.REPEAT生成代码重复执行语句块,直到条件为真。
.UNTIL condition生成代码重复执行.REPEAT和.UNTIL伪指令之间的语句块,直到condition为真。
相关代码示例
  1. 三个数中的最小数
.data
V1 WORD 10H
V2 WORD 20H
V3 WORD 30H

.code
main PROC
	mov eax, 0h     ; 设置eax为0
	mov ax, V1      ; 将V1赋值给ax
	cmp ax, V2      ; 判断ax和V2的大小
	jbe L1          ; 小于,则跳转到L1,否则,继续执行
	mov ax, V2      ; 如果不小于,则表示V2小,将V2赋值给ax
L1: 
	cmp ax, V3      ; 重复同样的判断
	jbe L2
	mov ax, V3
L2: 
	INVOKE ExitProcess, 0
main ENDP
END main
相关知识点总结
  1. CPU状态标志

    • 操作结果等于0时,零标志位置1.
    • 操作使得目标操作数的最高位有进位时,进位标志位置1.
    • 符号标志位是目标操作数高位的副本,如果标志位置1,表示是负数;标志位清0,表示为正数。
    • 指令产生的结果超过了有符号目的操作数范围是,溢出标志位置1.
    • 指令使得目的操作数低字节有偶数个1时,奇偶标志位置1.
  2. 条件跳转指令类型

    • 基于特定标志位的值跳转。
    • 基于两数是否相等,或是否等于ECX的值跳转。
    • 基于无符号操作数的比较跳转。
    • 基于有符号操作数的比较跳转。
助记符说明标志位/寄存器
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
je相等时跳转-
jne不相等时跳转-
jcxz / jecxz / jrcxz分别为cx=0,ecx=0,rcx=0时跳转-
ja / jnbe无符号 大于跳转-
jb / jnae无符号 小于跳转-
jae / jnb无符号 大于或等于跳转-
jbe / jna无符号 小于或等于跳转-
jg / jnle有符号 大于跳转-
jl / jnge有符号 小于跳转-
jge / jnl有符号 大于或等于跳转-
jle / jng有符号 小于或等于跳转-
  1. 复合表达式
  • 逻辑AND运算符
; if (al > bl) and (bl > cl)
;    x = 1
; end if
; first 
      cmp al, bl
      ja L1
      jmp next
L1: cmp bl, cl
      ja L2
      jmp next
L2: mov x, 1
next:
; second
      cmp al, bl
      jbe next
      cmp bl, cl
      jbe next
      mov x, 1
next:
  • while循环
; while (val1 < val2)
; {
;     val1 ++;
;     val2 --;
; }
      mov eax, val1
beginWhile:
      cmp eax, val2
      jnl endWhile
      inc eax
      dec val2
      jmp beginWhile
beginEnd:
      mov val1, eax
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值