简单算术运算汇编指令和CPU状态标志位介绍

数据传送指令

操作数类型

操作数中有3基本类型

  • 立即数:使用数字文本表达式
  • 寄存器操作数:使用CPU内已命名的寄存器
  • 内存操作数:引用内存位置

MOV指令

  • MOV指令将源操作数复制到目的操作数
  • 目的操作数的内容会发生改变,源操作数不会改变
MOV destination,source
  • 使用原则
  • 两个操作数必须是同样的大小
  • 两个操作数不能同时为内存操作数
  • 指令指针寄存器(IP、EIP、RIP)不能作为目的操作数
  • 单条MOV指令不能用于直接将数据从一个内存位置传送到另一个内存位置
  • 在源操作数的值赋给内存操作数之前,必须先将该数值传送给一个寄存器

针对第5条原则举例:

.data
var1  WORD ?
var2  WORD ?

.code
mov  ax,var1
mov  var2,ax

MOVZX指令(只用于无符号整数)

MOVZX指令(进行全零扩展并传送)将源操作数复制到目的操作数
注意:源操作数不能是常数

举例:

.data
val  BYTE           10001111b

.code
movzx  ax,val       ;AX=0000000010001111b

MOVSX指令(只用于有符号整数)

MOVSX指令(进行全零扩展并传送)将源操作数复制到目的操作数。
操作数在进行符号扩展时,在目的操作数上全部扩展位上重复(复制)长度较小操作数的最高位。

举例1:

.data
val BYTE 10001111b

.code
movsx  ax,val    ;AX=1111111110001111b

在这里插入图片描述

举例2:

mov    bx,0A69Bh   ;该处的0是一种方便的表示法,用于防止汇编器将常数误认为标识符
movsx  eax,bx      ;EAX=FFFFA69Bh
movsx  edx,bl      ;EDX=FFFFFF9Bh
movsx  cx,bl       ;CX=FF9Bh

LAHF和SAHF指令

LAHF(加载状态标志位到AH)指令将EFLAGS寄存器的低字节复制到AH。

被复制的标志位包括:符号标志位、零标志位、辅助进位标志位、奇偶标志位和进位标志位。使用该指令,可以方便的把标志位副本保管在变量中。

举例:

.data
saveflags   BYTE  ?

.code
lahf                         ;将标志位加载到AH
mov  saveflags,ah            ;用变量保存这些标志位

SAHF(保存AH内容到状态标志位)指令将AH内容复制到EFLAGS(或RFLAGS)寄存器低字节。

举例:

mov  ah,saveflags      ;加载被保存的标志位到AH中
sahf                   ;复制到EFLAGS寄存器

XCHG指令

XCHG(交换数据)指令交换两个操作数内容

  • 使用原则
  • 除了不适用立即数做操作数,XCHG指令操作数的要求与MOV指令操作数要求一样

举例:

xchg  ax,bx    ;交换16位寄存器内容
xchg  ah,bl    ;交换8位寄存器内容
xchg  var1,bx  ;交换16位内存操作数和BX寄存器内容
xchg  eax,ebx  ;交换32位寄存器内容

如果要交换两个内存操作数,则用寄存器作为临时容器,把MOV指令与XCHG指令一起使用

.data
val    WORD   1000h
val2   WORD   2000h

.code
mov   ax,val   ;AX=1000h
xchg  ax,val2  ;AX=2000h,val2=1000h
mov   val,ax   ;val=2000h,AX=1000h

JMP指令

在默认情况下,CPU是顺序加载并执行程序。但是当前指令的执行有可能是由条件的,它会按照CPU状态位的值把控制转向程序中的新位置

汇编语言程序使用条件指令来实现IF语句的高级语句和循环。每条条件指令都包含了一个可能的转向不同内存地址的转移。

控制转移分为两种基本类型:

  • 无条件转移:无论什么情况都会转移到新地址.新地址加载到指令指针寄存器,使得程序在新地址进行执行。使用JMP指令实现
  • 条件转移:满足某种条件,则程序出现分支。CPU根据 ECX和标志寄存器的内容来判断真/条件

JMP指令无条件跳转到目标地址,该地址用代码标号来标识,并被汇编器转换为偏移量

  • 3
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值