概述
相关指令集总结
编号 | 命令 | 示例 | 解释 | 备注 |
---|---|---|---|---|
1 | AND destination, source | AND reg, reg AND reg, mem AND reg, imm AND mem, reg AND mem, imm | AND指令在两个操作数的对应位之间(按位)逻辑与(AND)操作,并将结果存放到目标操作数中 | AND指令总是清除溢出和进位标志位。并根据值来改变符号标志位,零标志位和奇偶标志位 |
2 | OR destination, source | OR reg,reg OR reg,mem OR reg, imm OR mem, reg OR mem, imm | OR指令在两个操作数的对应位之间进行(按位)逻辑或(OR)操作,并将结果保存在目标操作数中。 | OR指令总是清除溢出和进位标志位。并根据值来改变符号标志位,零标志位和奇偶标志位 |
3 | XOR destination, source | XOR reg,reg XOR reg,mem XOR reg, imm XOR mem, reg XOR mem, imm | XOR指令在两个操作数的对应位之间进行(按位)逻辑异或(XOR)操作,并将结果存放在目标操作数中。 | XOR指令总是清除溢出和进位标志位。并根据值来改变符号标志位,零标志位和奇偶标志位 |
4 | NOT destination | NOT reg NOT mem | NOT指令触发(翻转)操作数中的所有位,其结果被称为反码。 | NOT指令不影响标志位。 |
5 | TEST destination, source | TEST reg, reg TEST reg, mem TEST reg, imm TEST mem, reg TEST mem, imm | TEST指令在两个操作数的对应位之间进行AND操作,并根据运算结果设置符号标志位,零标志位和奇偶标志位。与AND的唯一区别在于,不会改变目的操作数。 | - |
6 | CMP destination, source | CMP指令执行从目的操作数中减去源操作数的隐含减法操作,并且不修改任何操作数 | 当实际减法发生时,CMP指令按照计算结果修改溢出,符号,零,进位,辅助进位和奇偶标记位。 | - |
7 | STC / CLC | STC / CLC | 若要进位标志位置1,用STC指令,清除进位标志位,用CLC指令。 | - |
8 | Jcond destination | jc/jnc/jz/jnz/je/jl/jg | 当状态标志条件为真时,条件跳转指令就分支到目标标号。否则, 当标志位条件为假时,立刻执行条件跳转后面的指令。 | - |
9 | LOOPZ/LOOPE destination | LOOPZ/LOOPE L1 | LOOPZ指令的工作和LOOP指令相同,只是有一个附加条件,为零控制转向目的标号,零标志位必须置1. | 32位模式下,ECX是循环计数器,64位模式下,RCX是循环计数器。 |
10 | LOOPNZ/LOOPNE destination | LOOPNZ/LOOPNE L1 | LOOPNZ指令与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为真。 |
相关代码示例
- 三个数中的最小数
.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
相关知识点总结
-
CPU状态标志
- 操作结果等于0时,零标志位置1.
- 操作使得目标操作数的最高位有进位时,进位标志位置1.
- 符号标志位是目标操作数高位的副本,如果标志位置1,表示是负数;标志位清0,表示为正数。
- 指令产生的结果超过了有符号目的操作数范围是,溢出标志位置1.
- 指令使得目的操作数低字节有偶数个1时,奇偶标志位置1.
-
条件跳转指令类型
- 基于特定标志位的值跳转。
- 基于两数是否相等,或是否等于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 | 有符号 小于或等于跳转 | - |
- 复合表达式
- 逻辑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
最后
以上就是轻松小土豆为你收集整理的[笔记][汇编语言 基于x86处理器]条件处理的全部内容,希望文章能够帮你解决[笔记][汇编语言 基于x86处理器]条件处理所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复