资讯详情

[汇编]包含多个段的程序,定位内存地址

刚刚学markdown,为适应语法,以下格式包括 成分,看着难受也不关我事

文章目录

  • 包含多段程序
    • dw:数据存储在哪里
    • 定义多个段
    • 当我们谈论多个段落时,我们谈论什么?
  • 内存地址的灵活定位
    • 何谈灵活
    • AND OR的介绍
      • AND
      • OR
    • 字符形式的数据
    • ASCII码
  • 关于数据处理的两点
    • 数据位置
    • 寻址方式
      • 直接寻址 - 立即数
      • 间接寻址 - 数据寄存器
      • 相对寻址 - 基址寄存器 立即数
      • 寻址基址 - 基址寄存器 变址寄存器
      • 相对基址变址寻址 - 基 变 idata
    • 数据长度

包含多段程序

dw:数据存储在哪里

该程序需要其他存储数据的空间,这必须是安全的。如果操作系统允许,程序可以获得任何容量的空间。 而程序获得所需的空间有两种方法:

  1. 系统加载程序内存空间
  2. 在执行过程中内存空间

如果不讨论申请方法,我们将讨论系统愿意为我们分配空间的方法。 这种方法的关键是

assume cs:code code segment dw  0123h,0456h,0789h 

==dw(define word)==是字型数据的定义[^1]的关键字 注意:dw定义的数据内存空间始于代码段, 所以它的偏移地址 CS:0,CS:2 …

由于dw因此,在代码指令之前,我们应该使用它指定程序入口的关键字。

dw 0123h ... start: mov bx,0          mov ax,0           ... code ends //结束代码段 end start 

程序之所以知道哪一条是第一个要执行的指令,是因为 可执行文件中描述的信息 的指明。而一个可执行文件由描述信息程序本身 组成,

  • 汇编指令和定义源程序中的数据;
  • 主要是编译和连接源程序伪指令处理获得的信息。

事实上,伪指令end 和 随后的标号 它将转换为存储在描述信息中的地址。

如果您的指令操作需要内存空间(比如需要一些)memory space作为栈), 可以用数据0 提前占位。

dw 0123h,0456h,0789h    #数据段在开头 CS:0处,即CS :00~CS:06 dw 0 0 0 0 0 0 0 0       #内存预占位,地址为CS:07~CS:26 

由上,dw可以说有两个方面。

  • 定义数据
  • 打开内存空间

定义多个段

值得注意的是,代码段、数据段、堆栈等应在源程序中进行分段处理。由于段本身的容量限制,定义多个段不仅可以使代码更简单。应考虑定义多个段来存储不同的内容。

assume cs:code,ds:data,ss:stack data segment dw 0123h,0456h data ends

stack segment dw 0,0,0,0,0 stack ends code segment start: mov ax, mov sp,2h mov ax, code ends end start

规律:

  • 定义不同同的段时,应该有不同的段名
  • 段名相当于标号,代表段地址。

该段数据的段地址由段名代表,偏移地址取决于他在段中的位置 (这里强调的是,不允许将数值直接送入段寄存器)

当我们谈论多个段落时,我们谈论什么?

①segment 与 ends 配套使用,段名为。不管你是不是编译器stack,stock乃至st0ck,在它眼里中的一段。我们将段落定义为code,stack,data只是为了方便用户阅读。 ②assume cs:code 编译器执行等伪指令CPU没关系,也不会CS真的指向code。这里不深究具体意义。

[^当然,这些定义的数据内存大小是16字节


内存地址的灵活定位

何谈灵活

首先,所谓的灵活定位只是因为增加了一个变量:idata和两个类bx寄存器 si和di。

  • idata是任意常量
  • 同bx一样,bp是另一个基址寄存器
  • si和di是类似bx功能的变址寄存器(但两者不能分为两个8位寄存器)

因此,指定内存地址的方法有: [bx( idata)] [si( idata)] [di( idata)] [bx si( idata)] [bx di idata] 注意点:

  1. [bx si]可以表示为[bx][si]
  2. si和bi两个变址寄存器不能同时使用。 bx和bp两个基址寄存器不能同时使用

AND OR的介绍

AND

格式:AND 数据寄存器 对应进制数据 效果:逻辑意义上的按位和 应用:可通过特定数据将对象数据的相应位设为0,其他位不变 例子:mov al,00111011B

OR

相应AND,不解释。 应用:将对象数据的相应位置设置为1,其他位置不变。

字符形式的数据

格式:

data segment db 'unIX' db ‘LeBron’ data ends 

存储方式为ASCII码 地址偏移同dw 一个规律:ASCII码中字母的二进制形式,第五位为0即大写,1即小写。

ASCII码

在编辑文本的过程中, 1.(键盘等)文本信息输入 2.信息转为ASCII代码中有指定的内存 3.文本编辑器将内存中的内存ASCII将代码信息发送到显卡 显存中 4.显卡用ASCII解释传入信息的代码规则 5.数据信息转换为字符,显示器由显卡驱动,显示在屏幕上 [id]: https://baike.baidu.com/item/ASCII/309296?fromtitle=ascii码&frmid=99077&fr=aladdin


关于数据处理的两点

数据处理有两个核心问题:

  • 处理数据在什么地方
  • 处理数据有多长 (这里给出描述性符号:reg指代其他寄存器,sreg指代段寄存器)

机器指令处理数据,不关心数据的值,只关心指令执行前,将要处理数据的位置。

数据位置

汇编指令 指令执行前的数据位置
mov bx,[0] 内存,ds:0 单元
mov bx,ax CPU内部,ax寄存器
mov bx,1 CPU内部,指令缓冲器

由表可知有三种位置表达:立即数,寄存器,EA+SA(段/偏移地址)

寻址方式

直接寻址 - 立即数

立即数 上面的1称为立即数(idata) 直接包含在机器指令中,在汇编指令中直接给出。

间接寻址 - 数据寄存器

[ax] , [bx]

相对寻址 - 基址寄存器 + 立即数

  • 用于结构体:[bx].idata
  • 用于数组:idata[si],idata[di]
  • 用于二维数组:[bxi][data]

基址变址寻址 - 基址寄存器 + 变址寄存器

二维数组 :[bx][si]

相对基址变址寻址 - 基 + 变 + idata

二维数组:idata[bx][si] 结构中的数组 [bx].idata[si]

数据长度

我们学习的8086cpu只有两种尺寸数据处理:byte和word。 通过以下方式处理数据长度 1.寄存器名 2.没有寄存器名,利用操作符 X ptr 指明长度

mov word ptr ds:[0],1
mov byte ptr ds:[0],1

3.指令默认 push[1000h]:push指令只进行字操作。


END

last but not least: 当我们谈论自由,我们谈论什么 当我们谈论爱情,我们谈论什么 [当我们谈论跑步,我们谈论什么](###直接寻址 - 立即数)

标签: 0123连接器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台