首页 > 编程语言 >汇编语言学习笔记

汇编语言学习笔记

时间:2023-09-21 19:22:30浏览次数:53  
标签:操作数 汇编语言 寄存器 笔记 学习 指令 DX ax AX

汇编语言

主要知识点来自《汇编语言》速成指南(全程敲代码),配套材料:

  • 王爽老师的《汇编语言》
  • 使用DOSbox模拟运行8086CPU汇编语言

如有错误,欢迎指正!

1. 入门

简单引入关于8086CPU的知识。

CPU内部主要由运算器、控制器、寄存器三大部分组成[1]
运算器: 负责算术运算(+ - * / 基本运算和附加运算)和逻辑运算(包括 移位、逻辑测试或比较两个值等)。
控制器: 负责应对所有的信息情况,调度运算器把计算做好。
寄存器: 它们可用来暂存指令、数据和地址。既要对接控制器的命令,传达命令给运算器;还要帮运算器记录处理完或者将要处理的数据。

8086 CPU 中寄存器总共为 14 个,且均为 16 位[2]。它们分为:

通用寄存器

  • AX,BX,CX,DX称作为数据寄存器:

    • AX (Accumulator):累加寄存器,也称之为累加器;
    • BX (Base):基地址寄存器;
    • CX (Count):计数器寄存器;
    • DX (Data):数据寄存器;
  • SP和BP又称作为指针寄存器:

    • SP (Stack Pointer):堆栈指针寄存器;
    • BP (Base Pointer):基指针寄存器;
  • SI和DI又称作为变址寄存器:

    • SI (Source Index):源变址寄存器;
    • DI (Destination Index):目的变址寄存器;

控制寄存器:

  • IP (Instruction Pointer):指令指针寄存器;
  • FLAG:标志寄存器;

段寄存器:

  • CS (Code Segment):代码段寄存器;
  • DS (Data Segment):数据段寄存器;
  • SS (Stack Segment):堆栈段寄存器;
  • ES (Extra Segment):附加段寄存器;

其中,通用寄存器和段寄存器是我们最常用的寄存器。8086CPU可以使用H和L来表示寄存器的高8位和低8位,如AX寄存器的高8位为AH,低8位为AL。但是这只针对于AX、BX、CX、DX这四个寄存器,其他的寄存器没有这样的表示方法。

挂载DOSBox的C盘到本地的D:\masm目录

mount c d:\masm\

切换到C盘

c:

查看文件

dir

1.1 使用Debug

debug

R D E U T A

  • R: 显示或更改寄存器的内容
  • D: 显示内存内容
  • E: 修改内存内容
  • U: 汇编指令,将机器码转换为汇编指令
  • T: 单步执行
  • A: 以汇编指令的格式显示内存内容

记忆方法:ture ad
R: read
D: display
E: edit
U: unassemble
T: trace
A: assemble

R 表示显示或更改寄存器的内容

显示:

R

更改

R [寄存器名]

D 表示显示内存内容

D

D指令默认显示内存中的128个字节,从0000开始,每行显示16个字节,每个字节用两个十六进制数表示,每行的最后显示这16个字节对应的ASCII码。

D [地址]
D [地址] [长度]

E 表示修改内存内容,修改内存中的数据

E [地址] [数据]

连续修改内存中的数据,从某个地址开始,修改多个数据

E [地址]

A 表示以汇编指令的格式在内存中写入指令

A [地址]

T 表示单步执行(搭配A使用)

T

U 表示将机器码转换为汇编指令

U [地址]

2.1 常用指令

mov add sub

mov: move,移动,赋值

mov ax, 1

表示将1赋值给ax寄存器,然后ax寄存器的值为1

mov ax, bx

表示将bx寄存器的值赋值给ax寄存器

add: 加法

add ax, 1

表示将ax寄存器的值加1,然后将结果赋值给ax寄存器

add ax, bx

表示将ax寄存器的值加bx寄存器的值,然后将结果赋值给ax寄存器

sub: 减法

sub ax, 1

表示将ax寄存器的值减1,然后将结果赋值给ax寄存器

sub ax, bx

表示将ax寄存器的值减bx寄存器的值,然后将结果赋值给ax寄存器

mul div and or乘除指令及所有寄存器英文名

mul: 乘法

mul [源操作数]

mul指令进行乘法运算有两种形式:

若操作数为8位,则乘数在AL中,被乘数在指定的源操作数中,乘积在AX中。

\[AL \times [源操作数] = AX \]

若操作数为16位,则乘数在AX中,被乘数在指定的源操作数中,乘积在DX:AX中。

\[AX \times [源操作数] = DX:AX \]

mul [源操作数]

div: 除法

div [源操作数]

div指令进行除法运算有两种形式:

除数为8位,被除数为16位,默认在AX中存放。结果的商在AL中,余数在AH中。

\[AX \div [源操作数] = AL \ldots\ldots AH \]

除数为16位,被除数为32位,默认在DX和AX中存放,DX存放高16位,AX存放低16位。结果的商在AX中,余数在DX中。

\[DX:AX \div [源操作数] = AX \ldots\ldots DX \]

and: 与运算

and [目的操作数], [源操作数]

or:或运算

or [目的操作数], [源操作数]


参考与注释:


  1. CPU运算器、控制器、寄存器 ↩︎

  2. x86汇编之——8086寄存器讲解 ↩︎

标签:操作数,汇编语言,寄存器,笔记,学习,指令,DX,ax,AX
From: https://www.cnblogs.com/BryceAi/p/17720742.html

相关文章

  • STM32学习——缩写记录
     GPIOGeneralPurposeInputOutput通用输入/输出端口每个GPIO端口可通过软件分别配置成输入或输出;输出又分为推挽式(Push-Pull)和开漏式(Open-Drain)USARTUniversalSynchronous/AsynchronousReceiver/Transmitter通用同步/异步串行接收/发送器支持全双工操作;可设置波特......
  • HeadFirst设计模式学习之责任链模式
    【一】介绍引入当你想要让一个以上的对象有机会能够处理某个请求的时候,就使用责任链模式(ChainofResponsibilityPattern)。【二】场景引入自从推出Java版本的糖果机之后,万能糖果公司收到的电子邮件数量已超出他们所能处理的范围。据他们自己分析,所收到的电子邮件有四类:......
  • sift特征提取--笔记
    1)采用高斯差分金字塔,来近似高斯拉普拉斯算子,是为了在平滑滤波后依然保持尺度不变性,即在不同尺度下的特征不变。2)采用不同的尺度下的高斯差分图像,是为了在不同尺度下,比较图像之间的特征点。如果一张图像比另一张放大了或缩小了,那么可以比较它们的不同尺度下的特征点。3)特征点的要......
  • 集合学习
    1.集合的框架  2.Collection集合常用功能  1packageCollectionTest;/*2*@Author:lcc3*@Date:2022/4/25-04-25-22:244*@Description:CollectionTest5*@version:1.06*/78importjava.util.ArrayList;9importjava.util.Collection;1011public......
  • 数组初学习
    数组创建数组是相同类型的有序组合//创建命令int[]nums=newint[个数]下图为实践计算数组中所有数的和三种初始化和内存分析数组被声明时会存在栈中,真正创建时数组才会存在堆中,我们无法调用超过数组最大下标的数组,会报错java.lang.ArrayIndexOutOfBoundsException意思是......
  • 工作流程优化 - 总结笔记
    一、一个忙碌的上午(现实中的工作流问题)小张已经忙了一个早上了,她觉得自己还是很有条理的,这种有条理的忙碌感让他觉得内心充实。她会把每件工作按照紧急程序进行一个大致的排序,一件件处理,但是判断依据呢?只是自己的一个感觉而已。(问题:没有对瓶颈环节设计紧急的分流方案)老王的......
  • VideoChat笔记
    https://arxiv.org/pdf/2305.06355.pdf一个理解视频的大语言模型,跟视频里面内容可以随便问模型.还是老方法直接第三章走起.3.VideoChat: 直接看图: VideoChat分2个部分,一个是VideoChat-Text一个是VideoChatEmbedVideoChat-Text是把视频里面内容转化......
  • Linux持续学习者的必备工具:文本处理神器awk
    Linux持续学习者的必备工具:文本处理神器awk原创 运维家 运维家 2023-09-0215:09 发表于北京收录于合集#awk1个#linux52个引言作为一名Linux持续学习者,我们经常需要处理各种各样的文本文件,例如日志文件、配置文件等。而对于大规模的文本数据,手动处理往往效率......
  • 异常的学习
       把可能有异常的代码放到try里面去,然后要是被catch成功抓到,就运行catch括号里的东西,然后trycatch会让下面其他代码继续走下去 第一问  遇到多个问题,就写多个catch,也可以写“或(|)“     灵魂四问总结     这些是方法,然后记一下第三个......
  • 打工笔记--------------------------SugarColumn特性
    IsIdentity是否创建自增标识IsPrimaryKey是否创建主键标识ColumnName创建数据库字段的名称(默认取实体类属性名称)ColumnDataType创建数据库字段的类型IsIgnoreORM不处理该列IsOnlyIgnoreInsert插入操作时不处理该列ColumnDescription备注Length长度IsNullable......