刚刚学markdown,为适应语法,以下格式包括 成分,
看着难受也不关我事。
文章目录
- 包含多段程序
-
- dw:数据存储在哪里
- 定义多个段
- 当我们谈论多个段落时,我们谈论什么?
- 内存地址的灵活定位
-
- 何谈灵活
- AND OR的介绍
-
- AND
- OR
- 字符形式的数据
- ASCII码
- 关于数据处理的两点
-
- 数据位置
- 寻址方式
-
- 直接寻址 - 立即数
- 间接寻址 - 数据寄存器
- 相对寻址 - 基址寄存器 立即数
- 寻址基址 - 基址寄存器 变址寄存器
- 相对基址变址寻址 - 基 变 idata
- 数据长度
包含多段程序
dw:数据存储在哪里
该程序需要其他存储数据的空间,这必须是安全的。如果操作系统允许,程序可以获得任何容量的空间。 而程序获得所需的空间有两种方法:
- 系统加载程序内存空间
- 在执行过程中内存空间
如果不讨论申请方法,我们将讨论系统愿意为我们分配空间的方法。 这种方法的关键是
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] 注意点:
- [bx si]可以表示为[bx][si]
- 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: 当我们谈论自由,我们谈论什么 当我们谈论爱情,我们谈论什么 [当我们谈论跑步,我们谈论什么](###直接寻址 - 立即数)