16位汇编 03

>> 数据传送类指令

 

1:传送指令MOV(move)

把一个字节或者操作数从原地址传送到目的地址。

 

注意:

 

1.立即数不能作为目的操作数,如mov 110H,AX

 

2.立即数不能直接传给段寄存器,如mov DS,110H // 翻译成机器码很长

 

2.两个操作数不能同时为段寄存器,如mov ES,DS // 可通过Ax寄存器间接传递

 

3.两个操作数不能同时为存储单元,如mov [0x1245],[0x1312] // 翻译成机器码很长

 

5.代码段寄存器CS不能为目的操作数,但可为源操作数 // CS为存放代码段的段地址,是代码段寄存器。它与IP共用,以指示下一条要执行的指令,不能随意更改!

 

6.指令指针IP不能作为mov指令的操作数





 


 

mov指令参考资料:

 

mov是汇编中的传送指令。

 

mov 位宽 目的操作数,源操作数

 

在mov传送指令中的目的操作数或源操作数,只要涉及内存地址的都是逻辑地址,汇编程序中的每一条指令地址都是一个相对于代码段头部的偏移地址,这个地址叫做汇编地址。当程序加载到内存后就会有一个真实的起始地址,这个地址会给CS段寄存器。CPU执行指令就是会按CS:IP去寻找指令,此时你会发现IP偏移地址跟汇编地址是一样的,因为它们都是相对于程序起始位置的偏移。

 

位宽:目的操作数和源操作数的位宽要一致。否则程序会有问题。

 

 

这里的位宽是一个字节,位宽可以是一个字节,单字(2个字节),双字(4个字节),四字(8个字节)。有些mov的传送指令没有指定位宽,因为有些位宽是显而易且一致的。如通用寄存器之间的传送,就可以不指定位宽。但要切忌要保证两个寄存器的位宽一致。

 

目的操作数必需是一个容器,如内存单元、寄存器。

源操作数可以是一个立即数,也可以是一个容器。

 

容器有内存单元、通用寄存器(AX、BX、CX、DX等)、段寄存器(CS、DS)

立即数就是指令中指定的长度为16位的2的补码,如0xb800

 

立即数只能用作源操作数,也就是它只能传给容器,如内存单元目的操作数,通用寄存器。但是,不能传给段寄存器,原因也很简单,段寄存可是记录记录代码段或数据段的起始地址,岂能随便修改。立即数不能作为目的操作数。

段寄存器虽然不能直接用立即数来设置,但是可以通过通用寄存器或内存单元业间接设置,同时段寄存器中的内容也可以传送到这两个地方。段寄存器之间不能互相传递,即mov cs,ds是错的,且这样设置也是没有意义的,因为两个都是记录某个段的起始位置的,不可能在一块,且它们都有专门的用途。

通用寄存器除了不能传递给立即数,它可向内存单元和寄存器传值。通用寄存器之间可以互相传,它还可接受段寄存器和内存单元的内容。

内存单元可以接受来自立即数、通用寄存器、段寄存器的内容,但是内存单元虽然是容器,但是mov传送指令不能够将一个内存单元的内容传送到另一个内存单元。












 

>> 交换指令XCHG(exchange)

 

情形:

1:寄存器与寄存器之间交换

2:寄存器与存储器之间交换

3:不能在存储器与存储器之间交换数据

 

效率:

XCHG优于MOV, 因为xchg使用了内部暂存器

 

举例:

1:AH, AL 高低位交换

2:存储器【2040】与【2050】交换

 

>> 换码指令XLAT

作用:将BX指定的缓冲区中, AL移出一个字节取出赋给AL.

即:al <--ds:[bx + al]

该指令无操作数

 

用途:键盘的扫描码, 需要转为ASCII码,

可以将扫描码做成表, 扫描码作下标可以查到对应的ASCLL码

 

这条指令也叫累加器专用指令

 

>> 堆栈操作指令

 

1:压栈push reg)把一个操作数存入栈中,该操作数从寄存器中或者内存中取,操作数必须是16位2字节

每次往栈中存入一个值, 栈顶上升, sp(堆栈指针寄存器)中存的值减2, ss(堆栈段寄存器)中存了栈底的地址(堆栈段基址)

 

2:弹栈(pop reg)把栈中从栈顶开始的数, 弹到指定地址, 可以是寄存器,也可以是内存, 弹出一个数, sp中的值加2

 

3:保存所有寄存器环境

16位: pusha / popa

32位:pushad / popad

 

 

>> 标志寄存器传送指令

 

四条指令

 

 

 

 

 

 

 

 

 

>> 地址传送指令

 

** 将存储单元的EA送至指定寄存器

 

——有效地址传送指令LEA(load EA)

 

注意: 不是获取存储单元的内容

 

一般用作2个以上数值的加法

 

——指针传送指令LDSLES

 

 

>> 算数运算类指令

 

>> 加法

 

add

adc

 

 

>> 减法

 

sub

sbb

 

>> 求补指令

 

NEG

 

>> 比较指令

 

CMP:

两个操作数相减, 结果不存储, 但是影响标志位

操作数不变

posted @   冷酷的国度  阅读(234)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示