大家好,深入探讨汇编语言的关键要素相信很多的网友都不是很明白,包括也是一样,不过没有关系,接下来就来为大家分享关于深入探讨汇编语言的关键要素和的一些知识点,大家可以关注收藏,免得下次来找不到哦,下面我们开始吧!
8条数据总线一次可传输1B数据。
内存地址空间
可寻址的内存单元构成了该CPU的内存地址空间。
系统中的各种类型的内存都可以看作逻辑内存。通过对不同的地址进行操作,就可以操作不同的存储器。
一些概念
主板(BIOS)
接口卡:
显卡((ROM)BIOS、RAM),我们把需要显示的内容写入显存,就会显示在显示器上。
网卡(BIOS)
存储芯片的分类
根据读写属性分为两类:随机存取存储器(RAM)和只读存储器(ROM)
随机存储器可以读写,但必须带电存储。关机后内存中的内容将会丢失。
只读存储器只能读不能写,关机后其内容不会丢失。如果向ROM的存储单元写入数据的操作是无效的。
典型的CPU由运算单元、控制器、寄存器和其他设备组成,通过内部总线连接。
操作员:信息处理
控制器:控制设备的工作
寄存器:用于信息存储
内部总线:连接各种设备并在它们之间传输数据。
内部总线与外部总线的关系
内部总线实现CPU内部各种设备之间的连接,外部总线实现CPU与主板上其他设备之间的连接。
程序员通过改变各个寄存器的内容来控制CPU。
8086寄存器的特点
这16个寄存器都是16位通用寄存器:AX、BX、CX、DX。
段寄存器:CS、DS、SS、ES。
CX 以字节为单位存储程序的长度。
为了保证兼容性,可以将其拆分为两个8位寄存器。
啊,阿尔
乙肝、乙肝
.
这些8位寄存器可以独立使用,即互不影响。一个16位寄存器最大可以表示的数字是65535。为了兼容性的考虑,8086 CPU可以同时处理以下两种大小的数据——字(Word)和字节(Byte)。字可以分为高位字节和低位字节,也可以说是高八位。位寄存器和寄存器的低八位。数制后缀
十六进制数后添加H,二进制数后添加B,十进制数后不添加任何内容。注意
编写汇编指令或寄存器的名称时,不区分大小写。
指令的两个操作数的位数应该相同。如果运算结果超出了存储结果的寄存器的存储范围,则高位被丢弃,低位被保留。物理地址
所有存储单元组成的存储空间是一维线性空间。每个内存单元在该空间中都有一个唯一的地址,称为物理地址。不同的CPU以不同的方式形成物理地址。逻辑地址
逻辑地址:CPU生成的地址。逻辑地址在内部和编程中使用,并且不是唯一的。例如,当你用C语言进行指针编程时,你可以读取指针变量本身的值(操作)。其实这个值就是逻辑地址,就是相对于你当前进程的数据段的地址(偏移地址)。它不是绝对地址。物理地址相关。材料:
物理地址和逻辑地址
https://blog.csdn.net/tuxedolinux/article/details/80317419
16位计算机为什么叫16位计算机?
处理、传输和临时存储的信息的最大长度为16位。
处理:运算符处理16位数据
传输:寄存器和运算符之间的路径为16位
临时存储:寄存器的最大宽度为16位。
8086CPU具有20位地址总线,可以传输20位地址,实现1MB寻址能力。
有16位数据总线,可以一次传输16位数据。
8086如何合成物理地址?
在内部,两个16位地址被合成形成一个20位物理地址。
一种称为段地址,另一种称为偏移地址。
物理地址=段地址*16+偏移地址。 (即基地址+偏移地址=物理地址)
"*16"可以理解为左移4位
探究X基数左移1位是否等于乘以?
为什么段的起始地址是16的倍数?
因为基地址=段地址*16
为什么段的最大长度是64KB?
偏移地址为16位,寻址能力为64KB。 (这是8086模式的限制,并不是所有处理器都是这样)
不同的段地址和偏移地址可以组成同一个物理地址。
段地址(SA)、偏移地址(EA)
为什么偏移地址的英文缩写叫EA?
偏移地址(Offset Address=OA),也称为有效地址(Effective Address=EA)
信息:偏移地址的英文缩写为什么叫EA?
https://bbs.csdn.net/topics/370157156
数据在21F60H内存单元中。数据以2000:1F60为单位。数据位于2000H段的1F60单元中。 CS是代码段寄存器,IP是指令指针寄存器。
cs:ip读取指令的顺序
首先将指令读入指令寄存器,然后更新IP,然后执行读到的指令。
(先读,后执行)
上电或复位后,cs=FFFFH,IP=0000H,所以FFFF0单元的指令是8086PC上电后执行的第一条指令。
指令分类
传送指令,大多数寄存器的值都可以使用mov指令来改变。
转移指令,可以改变cs和ip内容的指令统称为转移指令。
jmp的用法
jmp段地址:偏移地址可以同时改变cs和ip的值。
jmp合法寄存器可以改变ip的值。 (16位寄存器)
地址读取
对于内存段来说,最低地址代表该段。
当表示一个内存段的值时,高地址数据---低地址数据。
绘制时,低地址在上,高地址在下。
段地址存储在段寄存器中。当8086 CPU要访问内存时,段寄存器提供内存单元的段地址。
调试命令
R--查看寄存器内容
R寄存器--修改寄存器的值
d --查看默认地址处内存的值
D段地址:偏移地址--查看指定起始位置的内存单元的值
D段地址:偏移地址结束地址--查看区间内存单元的值
e段地址:偏移地址data数据. --修改内存单元的值
E段地址:偏移地址,按回车——通过提问更改数值
t ---执行一条指令
t3 ---执行3条指令
t=0103 ---执行0103处的指令
一个
段地址:偏移地址
值得注意的是
b80100是mov ax,0001的机器码,在内存中是从低地址向高地址存储的,与data正好相反。两位为一个单位(8位)
词单位
即,存储字体数据(16位)的存储器单元由具有连续地址的两个存储器单元组成。 (高字节单元和低字节单元)
N地址字单元,N为字单元的起始地址。
记忆单元
存储单元为字节单元(一个单元存储一个字节)或字单元。
mov的一些函数
将寄存器值、数据和内存单元值发送到寄存器中。
将寄存器的值传送到内存单元、寄存器、段寄存器中。 (三对三)
将段寄存器的值传送到寄存器和内存单元(
将内存单元的值传送到段寄存器和寄存器中【基本是双向的】(除了数据不能直接与内存单元和段寄存器交互)
添加/删除
三个寄存器和一个内存
由于8086 CPU的硬件设计,数据不能直接发送到段寄存器。需要使用另一个寄存器作为传输来设置段寄存器的值。
使用ds寄存器时,一般需要先设置其值
[0]和ds:[0]的使用范围是什么?
mov ax,[0] 在调试中正常运行,但在编译期间被转换为mov ax,0。如果你想要原来的效果,可以使用
移动bx,0
mov ax,[bx];默认的段寄存器在ds中,当然也可以显式给出。间接寻址。
为了避免麻烦,也可以使用mov ax,ds:[0]进行寻址。
栈是一种具有特殊访问方式的存储空间。它的特点是最后进入这个空间的数据最先出去。 LIFO(后进先出)向上增长型
当压入堆栈时,堆栈顶部从高地址向低地址增长。
任何时候,SS:SP都指向栈顶元素。
入栈时,sp=sp-2,然后将数据移入栈顶空间。
出栈时,先将栈顶空间数据移入寄存器,则sp=sp+2 栈中第一个内存单元的地址、栈段最高地址与SS:SP的指针之间的关系当堆栈为空时
SS:Sp-1=栈段最高地址-1=栈中第一个内存单元的地址。
必须警惕栈顶越界的问题。
8086 CPU不检查堆栈是否越界。它只考虑当前堆栈的顶部在哪里,从而节省资源。推/弹出命令形式
压入/弹出寄存器、段寄存器、内存单元
需要注意的是,堆栈操作是按字进行的。
本质上是一条内存传输指令。清除AX寄存器的两种方法
mov ax,0(三个字节的机器码)
sub ax, ax(2字节机器代码)一段内存空间,可以是代码存储空间,数据存储空间,堆栈空间,或者什么都没有。源程序从编写到执行的过程
源程序文本文件(.asm)——编译(.obj)连接(.exe)——可执行文件(程序和数据、相关描述信息)——加载(命令)——内存中的程序——运行(CPU)伪指令代码段
.
代码结束(可以理解为结束段)end(标记程序结束)伪指令一般由编译器执行,用于控制编译器的编译工作。
标签
标签指的是一个地址,它被解析为一串值。
所以mov ds,data是不允许存在的。程序返回
基于单任务操作系统(DOS),程序返回的过程如下。
如果程序P2在可执行文件中,则必定存在正在运行的程序P1。将P2从可执行文件加载到内存中,并将CPU的控制权交给P2,然后P2才能运行。 P2开始运行后,P1暂时不运行。
当P2运行完毕后,CPU的控制权应返回到使其运行的程序P1。之后P1继续运行。 (这个过程称为程序返回) mov ax,4c00h
int 21h就是利用这两句来实现程序返回的。一般用在程序的最后。
语法错误和逻辑错误。编译过程中,有两种情况找不到目标文件(.obj)。找不到源程序文件。程序中有一个“严重错误”链接,用于连接多个目标文件并连接到某个库。该子例程将单个文件连接到DOS系统的外壳,即程序command.com(命令解释器)。在DOS 中,命令处理各种输入:命令或要执行的程序的文件名。 PSP(程序段前缀)是用于DOS和加载的程序之间通信的数据区域。
PSP 区域:SA:0
程序区:SA+10H:0
(段地址不同)
ds=SA
CS=SA+10
PSP区域有256字节的空间。
可以推断有如下对应关系:因为“ds=0B2D,所以程序从0B3DH段开始,也就是说CS为0B3DH。在调试模式下,使用p指令执行int 21h。
执行int 21h 时,显示“Program attempts returned returnednormally”,表示返回到debug。然后可以使用q 命令退出调试模式并返回到命令。如何完整地描述一个内存单元?内存单元的地址、内存单元的长度、描述符号“()”,可以有3种。寄存器名称段寄存器名称内存单元的物理地址(一个20位数据) 详细内容P96
描述性符号reg代表一个寄存器
sreg代表段寄存器
CPU执行循环指令时,需要执行两步操作。 (cx)=(cx)-1 确定cx 中的值。如果不为零,就会去标号处执行程序。如果为零,则向下执行。
一般情况下,cx用于存储循环次数,loop用于实现循环功能。减少循环次数是提高计算效率的一种方法。例如,123*236 使用哪个乘数作为cx的值? p103
在汇编源程序中,数据不能以字母开头,必须以0p104开头。
当遇到循环指令时,使用p命令来执行它。 Debug可以自动重复循环中的指令,直到(cx)=0。
也可以使用g偏移地址直接运行到CS:偏移地址。
两者具有相同的效果。一个概念
一个简单的操作系统,大约10万行代码段前缀
如ds: cs: ss: es:等。一个安全的空间
DOS或者其他合法程序一般不会使用0:200~0:2ff这256字节的空间,所以我们使用这个空间是安全的。 dw 定义单词、字体数据。它可用于定义数据。它可以用来打开空间。 end函数标志着程序的结束。 end后面的标签表示程序的入口。指令假设
无需赘述,只需知道您需要用它来连接您定义的具有某些用途的段和相关寄存器即可。和指令(如果有0,则0),或指令(如果有1,则1)
将al的第0位设置为0的指令是:and al,11111110B
将al的位0设置为1的命令是:或al,00000001B。按键盘上的“a”,屏幕上将显示“a”。这是一个什么样的过程呢?
按键盘上的a,发送到计算机,编码,转换成61h存入内存。文本编辑软件从内存中取出61h,发送到显卡显存。对于工作在文本模式的显卡,显存中的内容按照ASCII码的规则进行解释。 61h被视为“a”,驱动县市,并在屏幕上显示字符“a”的图像。一些常识
“A”的ASCII 代码是41H
‘a’的ASCII码是61H
"1"-30H=1一个有趣的提示
"a"-"A"=20H=2^5
二进制的表现是:小写字母(从右到左,从0开始)的第五个二进制位为1,大写字母为0,其他位相同。
通过灵活使用and和or指令,可以将一串大小写混合的字符串转换为统一的大写或小写。 [bx+idata][bx+idata] 的某些形式
=[idata+bx]
=[bx].idata
=idata[bx] 可以在C语言中比较idata[bx]和a[i]
因此,[bx+idata]的形式为高级语言实现数组提供了一种便捷的机制。
Si和di是8086 CPU中与bx功能类似的寄存器,但不能分成两个8位寄存器使用。
它还可以有以下形式: [si][si+idata] 也可以有与bx 的组合形式:
[bx+si]
[bx][si]扩展形式:
[bx+si+idata]
[bx+di+idata]
[bx+idata+si]
200[bx+si]
[bx].200[si]
[bx][si].200 需要注意的是+idata可以对应.idata
bx 和si/di 之间也没有主次关系。后者也可以在前者之前。上面bx统一在si/di前面只是习惯问题。
一般来说,当我们需要临时存储数据时,应该使用栈。数据处理中的两个基本问题:数据在哪里处理?数据要处理多长时间? bx、si、di、bp 中
[bp]默认段地址是ss。
bp 和bx 具有相同的状态
Si和di具有相同的地位。
请注意,以下命令是不正确的:mov ax,[bx+bp]
mov ax,[si+di]机器指令处理的数据在哪里?
内存、CPU 内部和端口中的数据处理操作有哪些类型?
读、写、操作。立即数
对于直接包含在机器指令中的数据(执行前在CPU的指令缓存中),在汇编语言中称为立即数据(idata)。寻址模式p164
直接寻址--[idata]
寄存器间接寻址--[bx]
寄存器相对寻址--[bx+idata]
基址索引寻址--[bx+si]
相对基址索引寻址--[bx+si+idata]
当不存在寄存器时,使用运算符X ptr指定内存单元的长度。 X 可以是汇编指令中的字或字节。 div 除数(reg 或内存单元)
被除数ax、ax和dx(dx为高16位,ax为低16位)
除数为8 位,被除数为16 位。除数为16 位,被除数为32 位。
结果8 位除数、商、余数
除数16位,ax商,dx余数。 dd dword(双字),双字数据。 dup dw 3 dup(0) 的一些用法
dd 3 dup(0,1,2)
db 3 dup("abc","ABC")传输指令对IP的修改范围不同,可分为短传输和近传输(统称为段内传输)、远传输(段间传输)转移)
短转范围为-128~128
近转-32768~32867
nop的机器码占用1个字节。
mov 还可以借助偏移地址复制指令。 (本质上都是机器码)
偏移运算符获取标签的偏移地址。
jmp短标签的本质ip=ip+8位位移
8 位位移=标签处的地址- jmp 指令后第一个字节的地址。 (编译时计算)
短——对应于8位位移。
8 位位移用二进制补码表示。
jmp靠近ptr标签的本质是ip=ip+16位位移。
与上面类似。
jmp far ptr标签jmp段地址的本质:偏移地址
jmp word ptr(段内传输)
jmp dword ptr(段间传输) 高地址为段地址,低地址为偏移地址(cs:ip点)
jcxz指令,
if(cx==0) jmp 短标签;
所有条件跳转和循环都是短跳转。如jcxz、loop等。
循环标签相当于
CX--
if(cx!=0) jmp 短标签;
理解重要性只涉及位移,而不涉及存储的实际地址。
好了,文章到这里就结束啦,如果本次分享的深入探讨汇编语言的关键要素和问题对您有所帮助,还望关注下本站哦!
【深入探讨汇编语言的关键要素】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
想学汇编,感觉需要认真对待
有9位网友表示赞同!
汇编太难了吧?感觉头疼
有12位网友表示赞同!
原来汇编语言还有这么多需要注意的地方啊
有8位网友表示赞同!
以前没接触过汇编,有点好奇它的写法
有9位网友表示赞同!
学习汇编是挑战自己吗?太厉害了
有10位网友表示赞同!
理解汇编代码的能力感觉很牛逼
有10位网友表示赞同!
如果想深入了解计算机的底层,学习汇编很有必要吧
有17位网友表示赞同!
汇编语言确实有点枯燥,需要耐心学习
有18位网友表示赞同!
希望这些注意点能帮助我更好地掌握汇编
有8位网友表示赞同!
学好汇编语言,是不是可以写病毒?哈哈
有17位网友表示赞同!
感觉学习汇编很有研究的价值
有20位网友表示赞同!
想了解一下,汇编语言有哪些应用领域啊?
有9位网友表示赞同!
现在用汇编写程序还有必要吗?
有18位网友表示赞同!
学汇编语言可以提高编程能力吗?
有7位网友表示赞同!
学习汇编需要哪些资料呢?
有5位网友表示赞同!
汇编语言和高中文本语言相比,优缺点是什么?
有20位网友表示赞同!
感觉汇编语言的语法很像机器代码
有13位网友表示赞同!
想找到一些好用的汇编开发工具
有9位网友表示赞同!
学习汇编语言需要多长时间才能入门呢?
有11位网友表示赞同!
是不是学习汇编语言需要有扎实的数学基础啊?
有10位网友表示赞同!