首页 > 编程语言 >汇编笔记(持续更新中)

汇编笔记(持续更新中)

时间:2024-11-23 16:35:32浏览次数:7  
标签:汇编 变址 MOV 更新 寻址 笔记 寄存器 AX BX

汇编笔记


寄存器register

​ 学习汇编语言,首先必须了解两个知识点:寄存器和内存模型。

​ 先来看寄存器。CPU 本身只负责运算,不负责储存数据。数据一般都储存在内存之中,CPU 要用的时候就去内存读写数据。但是,CPU 的运算速度远高于内存的读写速度,为了避免被拖慢,CPU 都自带一级缓存和二级缓存。基本上,CPU 缓存可以看作是读写速度较快的内存。

​ 但是,CPU 缓存还是不够快,另外数据在缓存里面的地址是不固定的,CPU 每次读写都要寻址也会拖慢速度。因此,除了缓存之外,CPU 还自带了寄存器(register),用来储存最常用的数据。也就是说,那些最频繁读写的数据(比如循环变量),都会放在寄存器里面,CPU 优先读写寄存器,再由寄存器跟内存交换数据。


内存模型:Heap

  • 程序运行过程中,对于动态的内存占用请求(比如新建对象,或者使用malloc命令),系统就会从预先分配好的那段内存之中,划出一部分给用户,具体规则是从起始地址开始划分(实际上,起始地址会有一段静态数据,这里忽略)。举例来说,用户要求得到10个字节内存,那么从起始地址0x1000开始给他分配,一直分配到地址0x100A,如果再要求得到22个字节,那么就分配到0x1020

  • 这种因为用户主动请求而划分出来的内存区域,叫做 Heap(堆)。它由起始地址开始,从低位(地址)向高位(地址)增长。\(Heap\) 的一个重要特点就是不会自动消失,必须手动释放,或者由垃圾回收机制来回收

img


内存模型: Stack

  • 除了 Heap 以外,其他的内存占用叫做 Stack(栈)。简单说,Stack 是由于函数运行而临时占用的内存区域

  • 系统开始执行main函数时,会为它在内存里面建立一个帧(frame),所有main的内部变量(比如ab)都保存在这个帧里面。main函数执行结束后,该帧就会被回收,释放所有的内部变量,不再占用空间。

  • 在函数内部在调用一个函数process()的时候,系统也会为该函数再新建一个帧,一般来说调用栈有多少层,就有多少帧。

  • 当函数运行结束之后,它的帧会被回收,系统回到函数中断执行的地方继续执行上一个帧的流程。通过这个机制,可实现函数的层层调用,且每一层函数都可以使用自己的本地变量

  • Stack是由内存区域的结束地址开始分配,从高位到地位分配

img


CPU指令

使用 g++ file.cpp -S out.s或者gcc file.cpp -S out.s,可用C/C++生成相应的汇编代码

#include<stdio.h>
void hello()
{
    int a=1,b=2;
    a=a+b;
    printf("hello world\n");
}
int main()
{
    int a=1,b=2;
    a=a+b;
    hello() ;

    return 0;
}
.LC0:
        .string "hello world"
hello():
        push    rbp
        mov     rbp, rsp
        sub     rsp, 16
        mov     DWORD PTR [rbp-4], 1
        mov     DWORD PTR [rbp-8], 2
        mov     eax, DWORD PTR [rbp-8]
        add     DWORD PTR [rbp-4], eax
        mov     edi, OFFSET FLAT:.LC0
        call    puts
        nop
        leave
        ret
main:
        push    rbp
        mov     rbp, rsp
        sub     rsp, 16
        mov     DWORD PTR [rbp-4], 1
        mov     DWORD PTR [rbp-8], 2
        mov     eax, DWORD PTR [rbp-8]
        add     DWORD PTR [rbp-4], eax
        call    hello()
        mov     eax, 0
        leave
        ret

push 指令

	push	rbp

pushCPU指令,rbp是该指令的算子.一个CPU指令可以有0到多个算子


寄存器

IA-32体系结构中有10个32位和6个16位处理器寄存器。寄存器分三类:

  • 通用寄存器

    • 数据寄存器

    • 指针寄存器

    • 索引寄存器

  • 控制寄存器

  • 段寄存器


指令系统

80x86寻址方式
  • 寻址:寻找操作数的地址。

  • 寻址方式:寻找操作数的方式

80x86指令格式
  • 指令助记符 +操作数1,+操作数2,+操作数3
  • 指令的操作数个数可以是0,1,2,3个
如何确定偏移地址的值
  • 与数据有关的十种方式,
    1. 立即寻址
    2. 寄存器寻址
    3. 直接寻址
    4. 寄存器间接寻址
    5. 寄存器相对寻址
    6. 基址变址寻址
    7. 相对基址变址寻址
    8. 比例变址寻址
    9. 基址比例变址寻址
    10. 相对基址比例变址寻址
  • 与转移地址有关的4种寻址方式
    1. 段内直接寻址
    2. 段内间接寻址
    3. 段间直接寻址
    4. 段间间接寻址

寻址方式

立即寻址方式

MOV AX, 5
MOV AX, 05H

把十六进制数05H 移动到通用寄存器AX

寄存器寻址方式(无EA)

  • 指令所要的操作数已存储在寄存器中或者把目标数存入寄存器
MOV AX , BX
  • 指令中可以引用的寄存器及其符号名称:

8位寄存器 AH、AL、BH、BL、CH、CL、DH、DL
8位寄存器 AX、BX、CX、DX、SI、DI、SP、BP和段寄存器等
8位寄存器 EAX、EBX、ECX、EDX、ESI、EDI、ESP、EBP。
  • DST 和SRC的字长一致

  • CS不能用MOV指令改变

直接寻址方式

  • 指令所要的操作数存放在内存中,在指令中直接给出该操作数的有效地址

  • 物理地址=\((DS)\times16d+EA\)

    • MOV AX , [2000H]

    • MOV AX, VALUE

    • MOV AX , [VALUE]

  • 物理地址=\((ES)\times16d+EA\)

    • MOV AX , ES:[2000H]

    • MOV AX, ES:VALUE

    • MOV AX , ES:[VALUE]

    • 在通常情况下,操作数存放在数据段中,所以,其物理地址将有数据段寄存器DS和指令中的有效地址直接形成但如果使用段超越前缀,那么操作数可存放在其他段中。如:

      MOV ES:[1000H],	AX
      
    • 立即寻址:1234H

    • 直接寻址;[1234H]

寄存器间接寻址方式→EA基址/变址

  • MOV AX,[BX]MOV AX,ES:[BX]

寄存器相对寻址方式→EA=基址/变址+位移量

  • MOV AX,COUNT[SI]MOV AX,3000H[SI]

  • MOV AX,[COUNT+SI]MOV AX,[3000H+SI]

  • MOV AX,ES:COUNT[SI]MOV AX,ES:[COUNT+SI]

  • 操作数在存储器中,其有效地址是一个基址寄存器(BXBP)或变址寄存器(SIDI的内容和指令中的8位/16位偏移量之和

基址变址寻址方式→EA=基址+变址

  • 操作数在存储器中,其有效地址是一个基址寄存器(BX、BP)和一个变址寄存器(SIDI)的内容之和

    • MOV AX,[BX][SI]MOV AX,[BX+SI]
    • MOV AX,ES:[BX][SI]MOV AX,ES:[BX+SI]

相对基址变址寻址方式→EA=基址+变址+位移量

  • MOV AX,COUNT[BX][SI] MOV AX,-46H[BX][SI]
  • MOV AX,COUNT[BX+SI] MOV AX,0246H[BX+SI]
  • MOV AX,[COUNT+BX+SI]MOV AX,[-56H+BX+SI]
  • MOV AX,ES:COUNT[BX][SI]MOV AX,ES:[0246H+BX+SI]

相对比例变址寻址→EA=变址×比例因子+位移量

  • MOV EBX,[EAX][EDX*8]MOV EBX,

  • [EAX+EDX\*8]MOV EBX,[ESP][EAX*2]

  • MOV EAX,TABLE[EBP][EDI*4]MOV EAX,[TABLE+EBP+EDI\*4]

​ 8位/16位/32位的位移量

注意1:比例因子只能与32位变址寄存器:EAX、EBX、ECX、EDX、EBP、ESI、

EDI联用;且比例因子只能为1、2、4或8;

注意2: 8)、9)、10)只能是32位寻址,没有16位寻址;

  • 基址比例变址寻址→EA=基址+变址×比例因子

  • 相对基址比例变址寻址→EA=基址+变址×比例因子+位移


汇编程序

  • 段结束:

    • xxx ends (xxx 即为段名)
  • 程序结束:

    • end
  • 程序返回:

    • MOV AX 4C00H
      INT 21 
      


汇编debug指令

DOSbox中输入debug 即可进入debug模式

  • -d xxxx:xxxx 即可读取相应的内存的信息。 (dump)

  • -e xxxx:xxxx aa bb cc ddaa bb cc dd写入对应的地址中。

  • -e 0000:0000 12.AB 34.CD 把内存对应的 12 修改成 AB, 34 修改成 CD

  • -a 输入汇编指令

  • -t 执行 -a输入的汇编指令。

.......回头再补吧,debug 指令先放一下。


汇编基本指令

常用指令

  • add

  • add ax ,10 , 意思就是ax +=10

  • sub

    • sub ax ,10 意思就是 ax-=10
  • mul

    • 两个相乘的数,要么都是八位,要么都是十六位.
      • 如果是8位,一个默认放在AL中 ,另一个放在8位reg 或内存字节单元中。
      • 如果是16位,一个默认放在AX中,另一个放在16位reg 或内存字节单元中。
  • div

  • shl

    • shl al ,1 左移一位。
  • shr

    • shr al ,1 右移一位。
  • rol

    • rol al ,1 循环左移。
  • ror

    • ror al ,1 循环右移
  • rcr

    • rcr al ,1 带进位的循环右移。
  • rcl

    • rcl al ,1 带进位的循环左移。
  • inc

    • inc ax 自增。
  • dec

    • dec ax 自减。
  • xchg

    • xchg ax, bx 交换。
  • mov bx , word ptr [0]

    • 位拓展。
  • OFFSET

    ​ 指定偏移地址指向的内容 [BX]。 (等价于DS:[BX])

    SEG 可以获取段地址。

  • 中断指令

    • int 0

      • 除法除以0 的中断
    • 	MOV AX , 4C00H
      	INT 21H
      
      • 退出程序
  • jmp 跳转指令

    • jmp 1000:0003 EA 1000: 0003 就是jmp的内存中显示的格式,代表跳转到 1000:0003
  • push ax :

    • 注意 若 ax : 1234H ,则它在内存里面的储存方式是: 34 12 , 从低到高的顺序, 内部顺序不变

    • 栈的储存顺序是从后往前依次储存的.

  • pop ax :

    • 将栈顶元素弹出并赋值给ax

段地址和偏移地址

​ 段地址*16 +偏移地址 = 物理地址

0000:0100

​ :前面的是段地址 , : 后面的是偏移地址。

DS 寄存器的使用

			mov  AX, [60]

​ 相当于把 DS : 60 处的两个字节存入AX 中

  • MOV DS , BX 可以把寄存器里的值赋给DS ,但不能把立即数赋值给DS。

MOV DS , 1000 (该操作是不被允许的)

  • 未声明段地址的情况下默认段地址就是 DS。

声明变量

	DATA SEGMENT 

		_DATA DB 100(?)

			;100 就是多少个? ,?代表待定

	DATA ENDS

寄存器的种类及作用

  • 8086 CPU 有14 个寄存器 , 他们的名称为: AX , BX , CX , DX , SI , DI ,SP , BP , IP , CS , SS , DS , ES , PSW , 所有的的寄存器都是16位的,可以放两个字节。

  • AX: 累加器。

    muldiv 作用有关。

  • BX : 基地址寄存器,可以储存地址并访问

    • 地址表达方式 : 240B:1001
  • AX ,BX ,CX ,DX 都属于通用寄存器,即可以把一个16位寄存器拆成两个8位寄存器使用。

段寄存器 CS : IP
  • CS:IP 即为可执行汇编指令的储存的位置
  • 汇编语言中代码和数据是不加区分的,都存在于内存里面.
栈寄存器 SS: SP:

​ 任意时刻 , SS:SP 指向栈顶元素

  • 压栈 sp -=2

  • 弹出 sp+=2

  • 当栈已空的时候, 如果继续弹出, 计算机会继续进行 把sp指向的内存弹出并进行sp+=2的操作 .

  • 栈的容量

    • 空栈:在进行堆栈操作前,为空栈。此时SP应预置一个初值。该值为堆栈空间的大小

    • SP初值=堆栈空间的最大容量

      例:SP=0008H。则最大容量为8个字节。

      SP指向当前的栈顶。

如何避免栈顶超界??

​ 只能通过人为注意栈顶是否超界的问题

标签:汇编,变址,MOV,更新,寻址,笔记,寄存器,AX,BX
From: https://www.cnblogs.com/cxjy0322/p/18564716

相关文章

  • 动态 DP 学习笔记
    1前言动态DP,简称DDP。用于处理树上带修的简单DP问题。前置知识:树链剖分线段树维护矩阵树形DP2基本做法上模板题:P4719【模板】"动态DP"&动态树分治如果不带修,就是简单的树上DP。设\(f_{i,0}\)表示不选\(i\)点的最大权值,\(f_{i,1}\)表示选\(i\)点并且......
  • 李超线段树学习笔记
    P4097【模板】李超线段树/[HEOI2013]Segment前言李超线段树并不是一种新的线段树,而是对一类题维护最值的过程做了改进,使线段树仍然有不错的复杂度。引入简要题意实现两种操作:在区间\([x_0,y_0]\)上加入一条两端为\((x_0,y_0)\),\((x_1,y_1)\)的线段。查询下标\(k......
  • 【大模型智能客服背景下】知识图谱笔记
    【背景】        在数字化飞速发展的时代,客户服务的质量和效率成为企业立足市场、赢得客户信赖的关键因素之一。随着人工智能技术的不断革新,智能客服应运而生,为企业与客户之间搭建起了更为便捷、高效的沟通桥梁。        传统的智能客服系统往往基于预设规则......
  • [数据结构笔记]从头插入链表的代码实现
    #仅供个人纪录#小白笔记细致慎入回顾思路:链表实现从头插入需要:结构体头结点结构体指针变量 实现功能的函数主函数(当然)结构体包含:data和指向下一个结构体的指针structNode{intdata;structNode*next;//c++写法可以直接Node*next;};//注意别漏掉;结构指针......
  • 【论文笔记】NeuroLM: a universal multi-task foundation model... (ICLR 2025 Under
    Code:×Data:×目录AbstractIntroductionMethodText-alignedneuraltokenizerMulti-channelautoregressivepre-trainingMulti-taskinstructiontuningResultsDownstreamdatasetsExperimentalresultsAblationonrobustnessAblationoninstructiondatasize......
  • dotnet学习笔记-专题06-过滤器和中间件-01
    1.基本概念在ASP.NETCore中,中间件和过滤器都是处理HTTP请求的重要组件,但它们在应用中的位置、作用范围以及使用方式有所不同。1.1中间件和过滤器的区别1.1.1中间件位置与作用范围:中间件位于ASP.NETCore应用程序请求处理管道的核心位置,它可以处理进入应用程序的每一个HT......
  • C++学习笔记-Cherno C++系列
    21-23.【ChernoC++】C++中的静态(static)static变量只在编译单元内部链接静态变量的作用域只在单个文件内建议:在非特殊情况下,永远使用static定义全局变量以限制作用域全局变量重复定义/*a.cpp*/intg_Variable=5;/*main.cpp*/#include<iostream>intg_V......
  • Sickos1.1 详细靶机思路 实操笔记
    Sickos1.1详细靶机思路实操笔记免责声明本博客提供的所有信息仅供学习和研究目的,旨在提高读者的网络安全意识和技术能力。请在合法合规的前提下使用本文中提供的任何技术、方法或工具。如果您选择使用本博客中的任何信息进行非法活动,您将独自承担全部法律责任。本博客明确表......
  • 【24亚太赛】2024年亚太杯A题、B题和C题思路、代码、论文持续更新
    ......
  • 【24亚太赛】2024年亚太杯A题、B题和C题思路、代码、论文持续更新
    ......