汇编语言入门(二)

article/2025/10/11 17:30:19

汇编语言入门(一)

文章目录

  • 寄存器【内存访问】
    • 内存中字的存储
    • DS和【address】
    • 字的传送
    • mov、add、sub指令
    • 数据段
    • 栈顶越界的问题
    • PUSH和POP指令
    • 栈的综述
    • 栈段【栈的综述】

寄存器【内存访问】

内存中字的存储

在这里插入图片描述
4E20是两个字节构成一个字。

上图中0地址单元中存放的字节型数据是20
0地址字节单元中存放的字型数据是4E20
2地址字单元中存放的字节型数据是12
2地址单元中存放的字型数据是0012
1地址单元中存放的字型数据是124EH

结论:任何两个地址连续的内存单元,N号单元和N+1号单元,可以将它们看成两个内存单元,也可以看成一个地址为N的字单元中的高位字节单元和低位字节单元。

DS和【address】

  • CPU要读取一个内存单元的时候,必须先要给出这个内存单元的地址。
  • 8086CPU中,内存地址是由段地址和偏移地址组成。
  • 8086CPU中有一个DS寄存器,通常用来存放要访问的数据的段地址。
  • 8086CPU有4个段寄存器:CS【代码地址】、DS【数据地址】、SS【堆栈地址】、ES 【前面不够放这个寄存器】。
  • 下面三条指令将10000H【1000:0】中的数据读到AL中。
mov bx,1000H
mov ds,bx
mov al,[0]  //偏移地址为0的内存单元送入寄存器,[]表示一个内存单元,其中的数字0表示内存单元的偏移地址
  • 已知的mov指令可完成两种传送功能:(1)将数据直接送入寄存器;(2)将一个寄存器中的内容送入另一个寄存器中;(3)将一个内存单元中的内容送入一个寄存器。
  • 从哪个内存单元到哪个寄存器?
    mov指令的格式:mov 寄存器名,内存单元地址
  • 执行指令时,8086CPU自动取DS中的数据为内存单元的段地址。
  • CS:IP读取到的东西会被CPU认为是指令,而DS读取到的东西会直接被CPU认为是数据。
  • CSDS都是段寄存器,一个程序往往被分为好几个段,DS保存的是数据段的基地址,而CS保存的是代码段的基地址,IP中保存的是要执行的下一条指令的地址。
  • 如何用mov指令从10000H中读取数据?
  1. 10000H表示从1000:0【段地址:偏移地址】
  2. 将段地址1000H放入DS
  3. mov al,[0]完成传送【mov指令中的[]说明操作对象是一个内存单元,[]中的0说明这个内存单元的偏移地址是0,它的段地址默认放在DS中。】
  • 8086CPU不支持将数据直接送入段寄存器的操作,如mov ax,1可以,但是mov ds,1000H不可以。
  • 数据 -> 通用寄存器 -> 段寄存器
  • 如何将数据从寄存器送入内存单元?将al中的数据如何送入到内存单元10000H中?
mov bx,1000H
mov ds,bx    //前两句是确认数据的段地址
mov [0],al //这里的al是题目的要求

字的传送

  1. 因为8086CPU16位结构,有16根数据线,所以可以一次性传输16位的数据,也就是一个字。
mov bx,1000H
mov ds,bx    //前两句是确认数据的段地址
mov ax,[0]   //1000:0处的字型数据放入ax中,ax为16位数据
mov [0],cx      //cx中的16位数据送到1000:0

mov、add、sub指令

  1. mov指令的几种形式

mov 寄存器,数据
mov 寄存器,寄存器
mov 寄存器,内存单元
mov 内存单元,寄存器
mov 段寄存器,寄存器
mov 寄存器,段寄存器

  1. addsub指令同mov一样,都有两个操作对象。

在这里插入图片描述

  1. sub:左边=左边-右边

  2. 要用mov指令要访问内存单元,可以在mov指令中只给出内存单元的偏移地址,此时,段地址默认在DS寄存器中。

数据段

  • 我们可以将一组长度为NN<=64K】,地址连续、起始地址为16的倍数的内存单元当作专门存储数据的内存空间,从而定义了一个数据段。
  • 比如,我们用123B0H~123B9H这段空间来存放数据,段地址:123BH,长度:10字节。
  • 如何访问数据段中的数据呢? 将一段内存中当作数据段,是我们在编程时的一种安排,我们可以在具体操作的时候,用DS存放数据段的段地址,再根据需要,用相关指令访问数据段中的具体单元。
    在这里插入图片描述

  1. 栈是一种具有特殊的访问方式的存储空间。它的特殊性在于,最后进入这个空间的数据,最先出去。【LIFO
  2. 栈的基本操作:入栈、出栈。
  3. 现今的CPU中都有栈的设计。
  4. 8086CPU提供相关的指令以栈的方式访问内存空间,这意味着,我们在基于8086CPU编程的时候,可以将一段内存当作栈来使用。
  5. 入栈:PUSH,出栈:POP
push ax  //将寄存器ax中的数据送入栈中
pop ax  //从栈顶取出数据送入ax
  1. 8086CPU的入栈和出栈操作都是以为单位进行的。
  2. CS:IP cpu认为是指令,DS:偏移地址 cpu认为是数据。
  3. 8086CPU中,段寄存器SS:存放栈顶的段地址,寄存器SP:存放栈顶的偏移地址。
  4. 任意时刻,SS:SP指向栈顶元素。当栈为空的时候,栈中没有元素,也就不存在栈顶元素。
  5. 所以,SS:SP只能指向栈的最底部单元下面的单元,该单元的偏移地址为栈最底部的字单元的偏移地址+2
    在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

  1. 字型数据用两个内存单位存放,高地址放高8位,低地址放低8位。

栈顶越界的问题

  • 8086CPU在工作过程中只考虑当前的情况:当前栈顶在何处?当前要执行的指令是哪一条?
  • 如何保证入栈、出栈时栈顶不会超出栈空间? 我们在编程的时候要自己操心栈顶超界的问题,要根据可能用到的最大栈空间来安排栈的大小,防止入栈的数据太多而导致的超界。执行出栈操作的时候也要注意。

PUSH和POP指令

  1. pushpop指令是可以在寄存器和内存之间传送数据的。
  2. 【段寄存器以s结尾,通用寄存器用x结尾】

push 寄存器:将一个寄存器中的数据入栈
pop 寄存器:用一个寄存器接受出栈的数据。

push 段寄存器:将一个段寄存器中的数据入栈
pop 段寄存器:用一个段寄存器接受出栈的数据

push 内存单元:将一个内存单元处的字入栈
pop 内存单元:出栈,用一个内存字单元接收出栈的数据

push[0]

指令执行时,CPU要知道内存单元的地址,可以在pushpop指令中给出内存单元的偏移地址,段地址在指令执行时,CPU从DS中取得。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

mov ax,1000H
mov ss,ax
mov sp,0010H
mov ax,001AH
mov bx,001BH
push ax
push bx
sub ax,ax   // mov ax,0 或者 xor ax,ax[相同则为0, 不同则为1]
sub bx,bx   // mov bx,0
pop bx
pop bx

在这里插入图片描述

mov ax,1000H
mov ss,ax
mov sp,001H
mov ax,002AH
mov bx,002BH
push ax
push bx
pop ax    //用寄存器ax接受出来的bx的数据,即可实现交换
pop bx

在这里插入图片描述
另一种写法:

mov ax,1000H
mov ss,ax
mov sp,2    
mov ax,2266H
push ax     //push指令会先执行 sp = sp -2,把栈顶指针指上去,所以sp = 2 而不是 0

栈的综述

  • 栈空间当然也是内存空间的一部分,它只是一段可以以一种特殊的方式进行访问的内存空间。
  • push指令的执行步骤:
  1. sp = sp - 2
  2. SS:SP指向的字单元中送入数据
  • pop指令执行步骤:
  1. SS:SP指向的字单元中读取数据;
  2. sp = sp + 2
  • 8086CPU只记录栈顶,栈空间的大小我们要自己管理。
  • 可以用栈来暂存以后需要恢复的寄存器的内容。
  • 栈顶的变化范围最大为 0~FFFFH

栈段【栈的综述】

  1. 对于8086PC机,在编程时,我们可以根据需要,将一组内存单元定义为一个段。

  2. 我们可以将长度为NN<= 64K】的一组地址连续,起始地址为16的倍数的内存单元,当作栈来用,从而定义了一个栈段。

  3. 将一段内存当作栈段,仅仅是在编程时的一种安排,CPU不会由于这种安排,就在执行pushpop等栈操作指令时就自动将我们定义的栈段当作栈空间来访问。CPU只能看见栈顶。

  4. 栈段的最大可以设为:2的16次方,64KB

  5. 从栈操作指令所完成的功能的角度来看,pushpop指令在执行的时候只修改SP

  6. 我们可以将一段内存定义为一个段,用一个段地址指示段,用偏移地址访问段内的大暖,这完全是我们自己的安排。

  7. 对于代码段,我们将它的段地址放在CS中,将段中的第一条指令的偏移地址放在IP中,这样CPU就将执行我们定义的代码段中的指令。

  8. 对于栈段,我们将它的段地址放在SS中,将栈顶单元的偏移地址放在SP中,这样CPU在需要进行栈操作的时候,比如pushpop指令等,就将我们定义的栈段当作栈空间来用。

  9. CPU将内存中的某段内存当作代码,是因为CS:IP指向那里;CPU将某段内存当作栈,是因为SS:IP指向了那里。

  10. 一段内存,可以既是代码的存储空间,又是数据的存储空间,还可以是栈空间,也可以什么都不是,关键在于CPU中寄存器的设置。


http://chatgpt.dhexx.cn/article/FufWGIwn.shtml

相关文章

汇编语言学习入门+亲自实操+图形并茂

汇编器 汇编器是将汇编语言转化为机器码的程序。或许你会以为汇编转化到机器码没什么大不了的&#xff0c;毕竟几乎是一对一的转换。但nasm存在的意义在于它可以很好的适应多种处理器平台&#xff0c;让编写汇编这件事都变得可移植了。nasm可以在Ubuntu下汇编&#xff0c;使用…

ARM 汇编语言入门

[翻译]二进制漏洞利用(二)ARM32位汇编下的TCP Bind shell&#xff1a;https://bbs.pediy.com/thread-253511.htm ARM汇编语言入门 From&#xff1a;ARM汇编语言入门(一)&#xff1a;https://zhuanlan.zhihu.com/p/109057983 原文地址&#xff1a;https://azeria-labs.com/writi…

基础汇编语言编程

目录 什么是汇编语言&#xff1f; 工程搭建 新建工程 环境设置 测试是否成功 正式学习汇编语言 数据处理指令 填充&#xff0c;加&#xff0c;减&#xff0c;乘 思考&#xff1a;我们可以看到R0寄存器可以存放8位十六进制数&#xff0c;那么0x12345678能不能用mov存入&am…

汇编入门学习

学自狂神&#xff1a;最通俗易懂的计算机底层教学&#xff0c;二进制到汇编学习&#xff01; 1、概述 学习路线&#xff1a; 语言 进制 进制如何运算 二进制 数据宽度 有符号数和无符号数 原码反码补码 位运算 位运算计算 汇编 寄存器 内存 汇编指令 内存复制 …

【学习笔记】汇编语言入门

汇编语言入门 概述 指令格式&#xff08;最多包含4个区段&#xff09;&#xff1a;各区段之间用规定的分隔符分开 [标号&#xff1a;] 操作码 [操作数] [;注释]标号区段&#xff08;当前指令行的符号地址&#xff09;操作码区段&#xff08;指令的操作行为&#xff0c;由操作…

关于汇编语言入门的几个案例

哈喽&#xff0c;大家好呀~这篇呢我们来看看汇编语言的几个入门小案例。 &#x1f947;个人主页&#xff1a;个人主页 &#x1f948;系列专栏&#xff1a;日常解决的问题 &#x1f949;与这篇汇编相关的文章&#xff1a; …

什么是汇编语言

汇编语言&#xff08;assembly language&#xff09;是一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言&#xff0c;亦称为符号语言。在汇编语言中&#xff0c;用助记符&#xff08;Mnemonics&#xff09;代替机器指令的操作码&#xff0c;用地址符号&#…

汇编语言系列教程之基础入门 (一)

汇编语言系列教程之基础入门 &#xff08;一&#xff09; http://www.cnblogs.com/flyor/p/7208948.html 机器字长 机器字长是指CPU一次运算所能处理的数据的位数&#xff0c;一般来说这个数的和CPU的通用寄存器长度、数据总线的宽度等相等&#xff0c;在8086中为16bit。由于历…

快速入门汇编语言

这篇是我在先后学习了《汇编原理》、《CSAPP》第三章和《x86 data sheet》&#xff0c;以及经历了大量google后写出的总结性文档&#xff0c;用于自查和复习。若能有所助益&#xff0c;不胜荣幸。如有错漏&#xff0c;烦请不吝赐教。 1. 从C到汇编 在初学C语言时&#xff0c;…

汇编语言(一)

一、编程语言 1&#xff09;机器语言 机器语言是机器指令的集合。在计算机中是一串0、1二进制数&#xff0c;计算机转变为高低电平&#xff0c;器件受到震动&#xff0c;进行运算。由于硬件设计和内部结构的不同&#xff0c;需要不同的电平脉冲来控制使它工作&#xff0c;所以…

汇编语言程序设计入门

前言&#xff1a;公号 「编程有料」后台回复 “大礼包” 即可获取近1000本助力你编程之路的电子书 汇编语言程序设计 一&#xff0c;汇编语言程序设计概述1&#xff0c;程序设计语言2&#xff0c;汇编语言源程序3&#xff0c;汇编语言程序开发过程 二&#xff0c;汇编语言基本语…

手把手教你学习汇编语言——从入门到起飞

专接本交流群&#xff1a;1051749714 &#xff08;有什么问题欢迎进群讨论&#xff09; 关于这篇博客&#xff0c;笔者会尽量用最简单的方式教会大家汇编语言以便应付各种考试 有什么不足的忘大佬评论或私信指出。 汇编环境安装 汇编运行调试 汇编指令 希望大家看完这些找一些…

小白的入门之——汇编语言程序设计教程

目录 第一章 基础知识 1.1汇编语言的特点 1.2计算机中数据表示的特点 【BCD码表示法&#xff08;Binary Coded Decimal&#xff09;】 【定点数】 —原码表示法— —反码表示法— —补码表示法— 浮点数 1.3 ​​​​​​计算机的数据存储 寄存器 存储器 数据在主…

汇编入门基础

1.什么是汇编语言&#xff1f; 汇编语言就是低级语言&#xff0c;直接描述/控制 CPU 的运行&#xff0c;我们知道&#xff0c;CPU 只负责计算&#xff0c;本身不具备智能。你输入一条指令&#xff08;instruction&#xff09;&#xff0c;它就运行一次&#xff0c;然后停下来&…

汇编语言入门教程

一、汇编语言是什么 ​ 汇编语言是二进制指令&#xff08;操作码&#xff09;的文本形式&#xff0c;与指令是一一对应的关系。比如加法指令00000011写成汇编语言就是ADD 二、前置知识——寄存器 ​ 1、寄存器不依靠地址区分&#xff0c;而依靠名称&#xff0c;CPU通过名字去…

南邮《汇编语言程序设计》期末复习 CH3: 汇编语言指令集

本文转载自厉害的 孔姐姐 的 博客 。 由一只孔姐姐的小迷弟负责排版和整理~ 一、基本概念 1.指令&#xff1a;单个的 CPU 操作&#xff0c;通知 CPU 执行某种操作的 “命令” 指令集&#xff1a;所有指令的集合 机器指令&#xff1a;用二进制序列&#xff08;0、1&#xff09…

汇编语言程序格式

1 逻辑段 汇编语言源程序由一个或多个逻辑段组成。 ❖ 一个程序中可以有几个同一类型的逻辑段。 ❖ 必须至少有一个代码段。 &#xff3b;注&#xff3d;源程序分段的目的在于程序结构清晰、便 于内存分配&#xff0c;寻址方便&#xff0c;一个源程序需要设置 几个段应根据具体…

汇编常用指令

通用寄存器及使用 IA-32系列有8个32位通用寄存器&#xff0c;名称分别为&#xff1a;EAX,EBX,ECX,EDX,ESP,EBP,ESI,EDI&#xff0c;如图&#xff1a; 简单传送指令 指令中文名格式解释备注MOV传送指令MOV DEST,SRCDEST<SRCXCHG交换指令XCHG OPER1,OPER2把操作数oper1的内容…

第一章 汇编语言和汇编指令

【用最少的指令来实现功能】 自用 文章基于《计算机体系结构新讲》&#xff08;中国地质大学出版社&#xff09; 目录 一、汇编指令 &#xff08;1&#xff09;MIPS汇编指令示例解析 &#xff08;2&#xff09;MIPS指令集 二、汇编指令中的操作数 &#xff08;1&#xff0…

pic单片机汇编 c语言,PIC单片机汇编语言指令详解

PIC单片机汇编语言指令详解 pic单片机为最常用单片机之一&#xff0c;许多程序均基于pic单片机进行开发。因此&#xff0c;熟练pic单片机编程尤为重要。为保证大家能准确、熟练掌握pic单片机的使用&#xff0c;本文特带来pic单片机的各种汇编语言指令的讲解。 一、pic的指令系统…