汇编--指令系统 数据传送类指令
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的方法,获得倍长的被除数
以上是关于汇编--指令系统 数据传送类指令的主要内容,如果未能解决你的问题,请参考以下文章
Android 逆向x86 汇编 ( call 子函数调用指令 | jmp 跳转指令 | lea 加载指令 | mov 数据传送指令 )