汇编语言全梳理(精简版)

汇编语言全梳理(精简版)

寄存器一览

  • 通用寄存器
    • ax,bx,cx,dx,(ah,al,bh,bl,ch,cl,dh,dl)
    • sp,bp,si,di
  • 指令寄存器
    • ip
  • 标志寄存器
    • FR
  • 段寄存器
    • cs,ds,ss,es

 

mov

指令 示例
mov 寄存器, 数据 mov ax, 8
mov 寄存器, 寄存器 mov ax, bx
mov 寄存器, 内存

mov ax, [0]

mov ax, [bx]

mov 内存, 寄存器

mov [0], ax

mov [bx], ax

内存地址由 段地址:偏移地址 决定,8086 选择 ds 段寄存器作为默认的段地址

由于段寄存器也是寄存器,除了硬件规定不能直接将数据 mov 到段寄存器之外,其他的和正常寄存器一样

指令 示例
mov 段寄存器, 寄存器 mov ds, ax
mov 寄存器, 段寄存器
mov ax, ds
mov 段寄存器, 内存 mov ds, [0]
mov 内存, 段寄存器 mov [0], ds

变种

  • mov ax, ‘a’:处理字符
  • mov ax, [bx + 1]:可用作数组操作
  • mov ax, [bx + si]
  • mov ax, [bx + si + 1]
  • mov word ptr [0],1:指定长度为一个字
  • mov byte ptr ds:[0], 1:指定长度为一个字节

 

add / sub

 格式同 mov 一样 

 

mul

计算:其中一个乘数放在 al 或 ax 中,另一个看指令

  • mul reg
  • mul 内存单元

结果:8位相乘结果放在 ax 中,16位相乘结果放在(高位dx 地位ax)中

 

div

  • div 寄存器
  • div 内存单元

除数为 8 位

  ax dx
  ah al  
计算时 被除数全部 16 位  
结果 余数  

 

除数为 16 位

  ax dx
计算时 被除数低 16 位 被除数高 16 位
结果 余数 

 

寻址方式总结

<span>汇编语言全梳理(精简版)</span>

 

push / pop

CPU 取 SS:SP 作为栈顶地址,我们可以自己初始化栈顶地址为 10010H

mov ax, 1000H
mov ss, ax
mov sp, 0010H
指令 步骤
push ax

SP = SP – 2

ax 内容送入栈顶的内存地址

pop ax

栈顶的内存地址的内容送入 ax

SP = SP + 2

push/pop 段寄存器

同理

push/pop 内存单元

同理

另外:pushfpopf 表示将标志寄存器的值压栈和出栈 

 

loop

mov ax, 2
mov cx, 11
s: add ax, ax
loop s

loop s 表示:

  1. cx = cx – 1
  2. 如果 cx 为 0 则继续执行下面的指令
  3. 如果 cx 不为 0 则跳转到标号 s 处

 

定义不同的段,标准示例

assume cs:code, ds:data, ss:stack

data segment
    dw 0001h, 0002h, ... 000fh
data ends

stack segment
    dw 0,0,0,0 ... 0
stack ends

code segment
    ;定义数据段
    mov ax, data mov ds, ax
    ;定义栈段
    mov ax, stack mov ss, ax
    mov sp, 20h
    ...
code ends

end

 

and / or

  • and al, 10110010B:逻辑与
  • or al, 10110010B:逻辑或

     

db dw dd dup

  • db:定义字节型数据
  • dw:定义字型数据
  • dd:定义双字型数据
  • dup
    • db 3 dup (0) 相当于 db 0,0,0
    • db 3 dup (1,2) 相当于 db 1,2,1,2,1,2

 

跳转指令

jump 类型

  • jump short 标号:根据相对位移跳转 IP = IP + 8 位位移
  • jump near ptr 标号:IP = IP + 16 位位移
  • jump far ptr 标号:CS = 标号所在段的段地址;IP = 标号在段中的偏移地址
  • jump 16位reg:转移地址在寄存器中 IP = (reg)
  • jump word ptr 内存:IP = (内存)
  • jump dword ptr 内存:CS = (内存+2);IP = (内存)
  • jcxz 标号:(cx) == 0 时,(IP) = (IP) + 8 位位移

call 和 ret / iret 类型

  • ret:形象解释相当于 pop IP
    • (IP) = ((ss) * 16 + (sp))
    • (sp) = (sp) + 2
  • retf:形象解释相当于 pop IP;pop CS
    • (IP) = ((ss) * 16 + (sp))
    • (sp) = (sp) + 2
    • (CS) = ((ss) * 16 + (sp))
    • (sp) = (sp) + 2
  • iret:形象解释相当于 pop IP;pop CS;popf
  • call 标号:形象解释相当于 push IP;jmp near ptr 标号
    • (sp) = (sp) – 2
    • ((ss) * 16 + (sp)) = (IP)
    • (IP) = (IP) + 16 位位移
  • call far ptr 标号:形象解释相当于 push CS;push IP;jmp near ptr 标号
  • call 16位reg:形象解释相当于 push IP;jmp 16位reg
  • call word ptr 内存单元:形象解释相当于 push IP;jmp word ptr

子程序标准模板

子程序中使用的寄存器入栈

子程序内容

子程序中使用的寄存器出栈

返回(ret、retf)

 

rep movsb

  • 传送的源地址:ds:si
  • 传送的目的地址:es:di
  • 传输长度:cs
  • 传输方向:cld 为正向

 

端口读取

  • in al, 20h
  • out 20h, al

如 CMOS 有两个端口,70h 是地址端口,71h 是数据端口,所以要读取 CMOS 某存储单元处(2)的数据,就要

mov al, 2
out 70h, al
in al, 71h

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/2713.html原文链接:https://javaforall.net

(0)
上一篇 2020年11月20日 下午5:16
下一篇 2020年11月20日 下午5:16


相关推荐

  • 网页刷流量软件开发中的困惑

    网页刷流量软件开发中的困惑客户要求:1.利用代理IP访问指定网页.并且点击指定位置2.代理IP获取方式最好为吸附.吸附我提供的地址.或许你有更好的方案最佳.3.如果能够控制代理访问量最好.比如我在指定的时间内10点-11点的时候需要1W的量.那么程序刷到1W的量就自动停止.4.可以用协议开发.但是协议一定要支持统计代码.也就是一定要让后台统计到具体数据.我的解决方案有二:。一是模…

    2026年4月18日
    4
  • Word中给公式加编号,编号右对齐方法

    Word中给公式加编号,编号右对齐方法这种方法的神奇之处在于纯自动 无须手动拖放 当然此方法的适用版本是 office2016 以及以后的版本 亲测 office2007 不行 office2016 百度云分享网址 链接 https pan baidu com s 1wXtXdiZL9yW 提取码 3uys 嫌弃百度云下载速度的可以到 msdn 去下载 是一样的 好的 万事俱备 方法是 公式

    2026年3月17日
    2
  • IDEA必备插件大全

    IDEA必备插件大全1 BackgroundIm 该插件支持用户自定义设置 Idea 的背景图 并且能修改背景图的透明度 效果如下 一边看美女一边写代码是不是腰也不疼了 头也不昏了 设置方法 打开 settings 找到 BackgroundIm 设置图片文件夹路径即可 可以设置循环切换背景图 查找图片路径后不显示文件夹中的图片没关系 只要文件路径对 里有图片就可以 正常可用 也可在此处设置 第一次先清除背景图片再设置 2 Translation

    2026年3月16日
    3
  • 容斥原理 数论

    容斥原理 数论文章目录原理证明例题原理 S1 S2 S3 分别代表下图三个圆 1 2 3 的面积如果我们想求下面图形构成的面积 该怎么求呢 很简单 S S1 S2 S3 S1 S2 S3 S1 S2 S1 S3 S2 S3 S1 S2 S3 拓展一下 如果是 4 个圆的面积应该是 S S1 S2 S3 S4 S1 S2 S3 S4 S1 S2 S1 S3 S1 S4 S2 S3 S2 S4 S3

    2026年3月17日
    2
  • Grok 开源项目教程

    Grok 开源项目教程

    2026年3月15日
    2
  • stringbuffer stringbuilder区别(其他和其它的区别)

    String字符串常量StringBuffer字符串变量(线程安全)StringBuilder字符串变量(非线程安全) 简要的说,String类型和StringBuffer类型的主要性能区别其实在于String是不可变的对象,因此在每次对String类型进行改变的时候其实都等同于生成了一个新的String对象,然后将指针指向新的String对象,所以经常改变内容的字

    2022年4月11日
    45

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号