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

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

寄存器一览

  • 通用寄存器
    • 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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 动态数组

    动态数组什么是数据结构?线性表数组动态数组设计项目结构代码实现CybArrayList.javapackagecom.cyb;/***自定义ArrayList数组**@author

    2022年7月2日
    37
  • springboot项目启动原理_相关滤波器的基本原理

    springboot项目启动原理_相关滤波器的基本原理一、springboot启动原理及相关流程概览springboot是基于spring的新型的轻量级框架,最厉害的地方当属自动配置。那我们就可以根据启动流程和相关原理来看看,如何实现传奇的自动配置二、springboot的启动类入口用过springboot的技术人员很显而易见的两者之间的差别就是视觉上很直观的:springboot有自己独立的启动类(独立…

    2025年10月29日
    4
  • hybrid app开发教程_公司员工大会历程分享

    hybrid app开发教程_公司员工大会历程分享关于这个话题,本文并不准备详述移动开发相关的一些通用技术,例如:viewport、rem、flexbox、媒体查询等。这里主要讲述我们的hybrid产品策略、开发流程与规范、性能优化以及我们踩过的坑。而往往就是这些,网上相关的资料相对比较匮乏的,又缺少类似经验文章,所以希望通过此篇文章,跟大家分享一些魅族团队关于hybrid产品开发的经验。产品背景我们希望这一类产品具备比较强大的

    2022年9月22日
    4
  • 修改 css变量,通过CSS变量修改样式的方法示例

    修改 css变量,通过CSS变量修改样式的方法示例问题 js 怎么去修改 css 伪类样式呢 但是 js 并没有伪类选择器 那么该怎么办呢 网上有不少方法 比如通过切换元素的类 在 style 中动态插入新的样式等 那么这里再来一种方法 设置 css 变量 var 通过 js 去改变这个变量来实现 示例 改变 div 的 hover 背景色 root divHoverColo red div width 100px height 100px backgrou

    2025年9月23日
    3
  • 浙江八年级 python_如何看待浙江八年级将新增python编程以及数据结构等课程?…

    浙江八年级 python_如何看待浙江八年级将新增python编程以及数据结构等课程?…不是吧阿sir,这后浪来的有点快吧放观点:可以在教育中普及编程语言引导学生学习,但不能把它变成所有初中生的必修课你把VB这种过时东西扔掉,我举双手赞成;你让学有余力、对这方面感兴趣的同学在课余时间研习一下代码和算法,我对此是鼓励的;但是你把python拿过来强制所有人学,那这门课1)如果加入记分考试,那这在应试教育体系下纯粹是给学生增加负担(我们学校大一下刚学VB这种比python还要简单的语言,…

    2022年5月13日
    42
  • 怎么复制一台虚拟机到另外一台电脑上

    怎么复制一台虚拟机到另外一台电脑上怎么复制一台虚拟机到另外一台电脑上

    2022年4月23日
    81

发表回复

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

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