汇编--指令系统 数据传送类指令

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了汇编--指令系统 数据传送类指令相关的知识,希望对你有一定的参考价值。

(1) 数据传送类指令

通用数据传送指令:MOV 、PUSH、POP、XCHG 交换指令

累加器专用传送指令: IN、OUT 、XLAT 换码指令

地址传送指令:LEA、LDS、LES

标志寄存器传送指令:LAHF、SAHF、PUSHF、POPF

类型转换指令:CBW、CWD、CDQ、BSWAP


 

MOV指令

 

 对于存储器单元立即数同时作为操作数的情况,必须显式指明   ;byte ptr 说明是字节操作   ;word ptr 说明是字操作

 mov [bx],[si+2]  错误

 不允许立即数传送给段寄存器

 不允许直接改变CS值

 不允许段寄存器之间的直接数据传送


栈顶是地址较小的一端(低端)

 堆栈和队列都是一段存储空间。

进栈指令:PUSH

进栈和出栈只对字操作

 


交换指令:XCHG(exchange)

把两个地方的数据进行互换

 XCHG reg,reg/mem

 

寄存器与寄存器之间交换数据

寄存器与存储单元之间交换数据

不能在存储单元之间交换数据

 不能在段寄存器之间交换数据


 

二、累加器专用传送指令

 

IN      输入    OUT  输出    XLAT  换码

 

2、用法:
(1)IN AX/AL, I/O端口地址            表示从外部设备输入数据给累加器

IN AX,80H
MOV DATA_WORD,AX   ;这两条指令把端口28H的内容经过AX传送到存储单元DATA_WORD中

 

mov DX,3FCH
IN EAX,DX

 

(2)OUT I/O端口地址,AX/AL         表示将累加器的数据输出给外部设备

 

OUT 5,AL  ;从AL中输出一个字节到5端口中

 

说明:当I/O端口地址不超过8位时,则直接放在指令中,若超过8位,则用DX间址。比如:

 

MOV DX,8080H
IN AL,DX

 

换码指令:XLAT(translate)

 

 

XLAT    ;al←ds:[bx+al]

换码指令执行前: 在主存建立一个字节量表格,内含要转换成的目的代码 表格首地址存放于BX,AL存放相对表格首地址的位移量

换码指令执行后: 将AL寄存器的内容转换为目标代码

 

 

 

换码指令没有显式的操作数,但使用了BX和AL;

 

 


 

地址传送指令

 

取有效地址指令:LEA   (load EA)     将存储器操作数的有效地址传送至指定的16位寄存器中

 

 

指针传送指令:LDS

 

指针传送指令:LES 

注意不是获取存储器单元的内容,而是其有效地址

 

LEA r16,mem           ;r16←mem的有效地址EA    获得主存单元的有效地址;不是物理地址,也不是该单元的内容

 

 

 

LDS r16,mem ;r16←mem, ;DS←mem+2            

  LDS指令将主存中mem指定的字(就是地址里面的值)送至r16,并将mem的下一字送DS寄存器

 

 

LES r16,mem ;r16←mem, ;ES←mem+2    

     LES指令将主存中mem指定的字送至r16,并将mem的下一字送ES寄存器

 

 

 


 

 

标志传送类指令

 

标志寄存器传送指令:LAHF、SAHF

标志寄存器传送指令:PUSHF、POPF

 

  •   用来传送标志寄存器FLAGS的内容,方便进行对各个标志位的直接操作
  •   影响标志位

 

 

LAHF   ;AH←FLAGS的低字节

  • LAHF指令将标志寄存器的低字节送寄存器AH
  • SF/ZF/AF/PF/CF状态标志位分别送入AH的第7/6/4/2/0位,而AH的第5/3/1位任意

 

 

SAHF  ;FLAGS的低字节(5个)←AH

  • SAHF将AH寄存器内容送FLAGS的低字节
  • 用AH的第7/6/4/2/0位相应设置SF/ZF/AF/ PF/CF标志

 

 

PUSHF ;SP←SP-2 ;SS:[SP]←FLAGS

  • PUSHF 保存全部标志到堆栈

 

 

POPF ;FLAGS←SS:[SP] ;SP←SP+2

  • POPF 将堆栈内容取到标志寄存器

 


 

 

 

类型转换指令

 

 

字节转换成字指令:CBW

 

 

字转换成双字指令:CWD

 

 

双字转换成四字指令:CDQ

 

 

CBW ;AL的符号扩展至AH ;如AL的最高有效位是0,则AH=00 ;AL的最高有效位为1,则AH=FFH。AL不变

 

 

CWD ;AX的符号扩展至DX ;如AX的最高有效位是0,则DX=00 ;AX的最高有效位为1,则DX=FFFFH。AX不变

 

 

 类型转换指令常用于获得倍长的数据

 

 

注意:

  • 无操作数指令
  • 隐含对 AL 或 AX 进行符号扩展
  • 不影响条件标志位

 

 


 

 

什么是符号扩展?     

符号扩展是指用一个操作数的符号位(即最高位)形成另一个操作数,后一个操作数的各位是全0(正数)或全1(负数)。

符号扩展不改变数据大小

对于数据64H(表示数据100),其最高位D7为0,符号扩展后高8位都是0,成为0064H(仍表示数据100)

对于数据ff00H(表示有符号数-256),其最高位D15为1,符号扩展后高16位都是1,成为ffffff00H(仍表示有符号数-256)

 

mov al,80h ;al=80h

cbw ;ax=ff80h

add al,255 ;al=7fh

cbw ;ax=007fh

 

    cwd         ;DX.AX←AX

    idiv bx     ;AX←DX.AX÷BX

  • 利用符号扩展指令得到除法指令所需要的倍长于除数的被除数
  • 对无符号数除法应该采用直接使高8位或高16位清0的方法,获得倍长的被除数

 

以上是关于汇编--指令系统 数据传送类指令的主要内容,如果未能解决你的问题,请参考以下文章

汇编语言通用数据处理指令——数据传送类指令

x86汇编指令详解

16位汇编第五讲各种指令详解第一讲

汇编语言MOV指令

汇编move指令如何使用

Android 逆向x86 汇编 ( call 子函数调用指令 | jmp 跳转指令 | lea 加载指令 | mov 数据传送指令 )