汇编语言学习笔记

发布时间 2023-09-21 19:21:03作者: BryceAi

汇编语言

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

  • 王爽老师的《汇编语言》
  • 使用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寄存器讲解 ↩︎