我是靠谱客的博主 轻松小土豆,最近开发中收集的这篇文章主要介绍[笔记][汇编语言 基于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

最后

以上就是轻松小土豆为你收集整理的[笔记][汇编语言 基于x86处理器]条件处理的全部内容,希望文章能够帮你解决[笔记][汇编语言 基于x86处理器]条件处理所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(44)

评论列表共有 0 条评论

立即
投稿
返回
顶部