大家好,今天小编来为大家解答以下的问题,关于《汇编语言学习笔记:第三章与第四章内容梳理》,这个很多人还不知道,现在让我们一起来看看吧!
起始地址为N的字单元称为N地址字单元。
3.2 DS和[address]
DS寄存器:通常用于存储要访问的数据的段地址
[address]表示偏移地址为address的内存单元。段地址默认放在ds中。
mov 指令将一个内存单元的内容移动到另一个寄存器中:
mov 寄存器名 [内存单元的偏移地址]指令执行时,8086CPU自动取ds寄存器中的数据为内存单元的段地址。所以当我们将一个内存单元的内容送入寄存器时,我们需要预先将该内存单元的段地址放入ds中。
8086CPU不支持将数据直接送入段寄存器,只能通过另一个寄存器传输。首先将段地址发送到通用寄存器,例如bx,然后将bx的内容发送到ds。
3.4 mov、add、sub指令
mov寄存器,数据如: mov ax,8
mov寄存器,如: mov ax,bx等寄存器
mov寄存器,内存单元如: mov ax,[0]
mov内存单元,寄存器如: mov[0],ax
mov内存单元,段寄存器如: mov[0],cs
mov段寄存器,内存单元如: mov cs,[0]
mov段寄存器,寄存器如: mov ds,ax
mov寄存器、段寄存器例如:mov ax,ds
几乎所有的mov指令都可以互相传递,唯一需要注意的是:不能将数据直接送入段寄存器!。
可以将内存单元的内容发送到段寄存器,也可以将寄存器的内容发送到段寄存器,但不能直接将数据发送到段寄存器!
这里插入图片说明
3.7 CPU提供的栈机制(ss和sp)
基于8086CPU编程时,一段内存可以用作堆栈。
8086CPU的入栈和出栈操作是在以字为单位进行的。
当执行push和pop指令时,CPU的范围是SS和SP中得到栈顶的地址。
段寄存器SS存放栈顶的段地址,SP寄存器存放栈顶的偏移地址。任何时候,SS:SP都指向栈顶的元素。
在8086CPU中,入栈时,栈顶从高地址向低地址方向增长。Push ax表示将寄存器ax中的数据送入堆栈,分两步完成。
SP=SP-2,SS:SP指向当前栈顶前面的单元,当前栈顶前面的单元就是新的栈顶;将ax中的内容发送到SS:SP指向的内存单元,此时SS:SP指向新的栈顶。 imagepop ax的意思是从栈顶取出数据并发送给ax,分以下两步完成。
将SS:SP指向的内存单元处的数据发送到ax中; SP=SP+2,SS:SP指向当前栈顶以下的单元,当前栈顶以下的单元为新的栈顶。当栈为空时,栈顶没有元素,此时SS:SP指向栈的最底部单元下面的单元。该单元的偏移地址为栈最底部的字单元的偏移地址+2!。必须注意的是,栈底字单元的地址并不是底层内存单元的地址!
由于栈是从高地址到低地址从栈底到栈顶,而字单元的地址是两个字节单元地址中较低的一个,所以栈底的字单元的地址为不是底部。内存单元的地址!
3.8 栈顶超界的问题
栈顶越界会导致其他内存空间的指令或数据被覆盖,造成难以想象的后果。
8086CPU并不能保证我们对栈的操作不会越界。
在编程的时候,我们不得不担心栈顶越界的问题。
3.9 push、pop指令
压入寄存器将寄存器中的数据压入堆栈
pop寄存器出栈,使用寄存器接收从栈中弹出的数据
压入段寄存器将段寄存器中的数据压入堆栈
pop段寄存器弹出堆栈,使用段寄存器接收从堆栈弹出的数据
image实验将空间10000H~1000FH 视为堆栈。初始状态栈为空;设置AX=001AH,BX=001BH;将AX和BX中的数据压入堆栈;然后清除AX和BX; from 恢复栈中AX和BX原来的内容。移动斧头,1000H
mov SS, 斧头
mov sp,0010H;初始化栈顶
莫夫斧头,001AH
莫夫BX,001BH
推斧
推bx; ax, bx 被压入堆栈
子斧头,斧头;清除axe,也可以使用mov ax, 0,
;sub ax,ax的机器码为2字节,
;mov ax,0的机器码为3个字节。
子bx, bx
流行bx;从堆栈中恢复ax和bx的原始数据
流行斧头;将10000H~1000FH这段空间当作栈,初始状态栈是空的;mov ax, 1000Hmov ss, axmov sp, 0010H当栈为空时,SP指向的内存单元的偏移地址为栈底字单元的偏移地址+2
当栈为空时,SP指向的内存单元的偏移地址为栈底偏移地址字单元+ 2
当栈为空时,SP指向的内存单元的偏移地址为栈底偏移地址字单元+ 2
问题 3.12由于push和pop只能在执行过程中修改SP,所以栈顶的变化范围是0~FFFFH,一个栈最大可以设置为64KB。
对于小于64KB的栈,当栈顶超出界限时,其他内存单元将被覆盖;
对于等于64KB的栈,当栈顶超过限制时,SP会溢出,栈顶会回绕,覆盖原来栈的内容。
段的综述
我们可以使用段来存储数据,并将其定义为“数据段”;
我们可以用段来存储代码,并将其定义为“代码段”;
我们可以将段当作堆栈来使用,并将其定义为“堆栈段”。
对于数据段,将其段地址放在DS中,当使用mov、add、sub等指令访问内存单元时,CPU就会将我们定义的数据段中的内容访问为数据;
对于代码段,将其段地址放在CS中,将段中第一条指令的偏移地址放在IP中,这样CPU就会执行我们定义的代码段中的指令;
对于堆栈段,将其段地址放入SS,将栈顶单元的偏移地址放入SP。这样,当CPU需要执行堆栈操作,例如执行入栈和出栈指令等时,就会将该堆栈段用作堆栈空间。
CPU将内存中的某段内容当作代码,是因CS:IP指向了那里; CPU将某段内存当作栈,是因为SS:SP指向了那里。一段内存可以是代码的存储空间、数据的存储空间、堆栈空间或什么都不是。
是的。关键在于CPU中寄存器的设置,即CS、IP、SS、SP、DS方向。
实验 2
我们可以使用“d段地址:偏移地址”来查看指定内存单元的内容,其中段地址存放在DS段寄存器中。
我们既可以直接以数据的形式给出段地址,也可以以段寄存器的形式给出段地址。
imageimage
第4章、第一个程序
4.1 一个源程序从写出到最终执行的过程
image 使用文本编辑器用汇编语言编写汇编程序,生成存储源程序的文本文件。使用汇编语言编译器对文件中的源程序执行编译,产生目标文件。使用连接。程序对目标文件执行连接,生成可直接在操作系统中运行的可执行文件。操作系统执行可执行文件:OS将可执行文件中的机器代码和数据加载到内存中,由CPU进行相关初始化(如设置CS:IP指向要执行的第一条指令)来执行程序。
4.2 源程序
汇编语言源程序中有两条指令:
汇编指令:有对应的机器代码,可以编译成机器指令,最终由CPU执行。伪指令:没有对应的机器码,编译器执行1.asm
假设cs:codesg将用作代码段的段codesg与段寄存器cs相关联。
Codesg段定义了一个段,该段的名称是“codesg”,这个段从这里开始
codeg是一个标号,作为段的名称,最终被编译连接成段的段地址。
莫夫斧头, 0123H
莫夫BX,0456H
添加ax、bx
添加斧头,斧头
移动斧头,4c00H
int 21H 这两条指令实现程序的返回
codesg 结束名为“codesg”的段在此结束
end 编译器在编译汇编程序的过程中,遇到伪指令end,结束源程序的编译。源程序:源程序文件中的所有内容称为源程序。
程序:源程序中最终由CPU执行处理的指令或数据(即源程序中没有伪指令的部分)
程序首先以汇编指令的形式存在于源程序中。经过编译和链接后,成为机器代码并存储在可执行文件中。
可执行文件是怎么得到运行的?如果程序P2在可执行文件中,则必须存在正在运行的程序P1。将P2从可执行文件加载到内存后,CPU的控制权就交给P2,这样P2就可以运行了。 P2开始运行后,P1停止运行。当P2运行完毕后,CPU的控制权应返回给使其运行的程序P1,此后P1将继续运行。
程序返回:程序结束后,将CPU的控制权返回给使其运行的程序。
所以需要在程序末尾添加返回的程序段。
移动斧头,4c00H
int 21H 这两条指令实现了程序映像
4.5 编译连接
的返回。首先,在DOSBox Options.bat中挂载DOSBox中的虚拟目录和本地计算机中的真实目录。
image 如图所示,挂载DOSBox中的d:目录和本地路径的D:DOSBoxmasm,即访问DOSBox中的d:目录相当于访问D:DOSBoxmasmimage连接的作用:当源程序较大时,可以分成多个源程序文件进行编译。每个源程序被编译成目标文件后,使用链接器将它们连接在一起生成可执行文件。对于库文件中的程序,需要将这个库文件与程序生成的目标文件连接起来,生成可执行文件。编译源程序后,您将获得包含机器代码的目标文件。目标文件中的某些内容不能直接用于生成可执行文件。链接器将这些内容处理成最终的可执行信息。因此,即使只有一个源程序文件,不需要调用库中的子程序,也必须使用链接器来处理目标文件并生成可执行文件。
4.6 以简化的方式进行编译和连接
在masm(链接)后添加编译(连接)源程序文件(目标文件)的路径和文件名,在结尾再加上分号,编译器在编译(连接)过程生成时会自动忽略中间文件。
imageimage
4.7 exe的执行
image 输入可执行文件目录下的可执行文件名来执行(因为我用本地路径的D:DOSBoxmasm挂载了DOSBox中的d:目录,可执行文件在D: DOSBoxmasm,所以这相当于可执行文件所在目录)
4.8 谁将可执行文件中的程序装载入内存并使它运行?
为了使程序P1 运行,必须有一个正在运行的程序P2。将P1从可执行文件加载到内存中并赋予其CPU控制权,然后P1才能运行; P1运行完毕后,必须将CPU的控制权交还给程序P2,使其能够运行。
操作系统是一个由多个功能模块组成的庞大而复杂的软件系统。操作员通过称为外壳的程序来操作计算机系统。
DOS中有一个程序command.com,它在DOS中被称为命令解释器,它是DOS系统的外壳。
DOS启动时,首先完成其他重要的初始化任务,然后运行command,它执行用户输入的命令,如:cd、dir、type。
在DOS中,命令处理各种输入、命令或要执行的程序的文件名。我们通过命令进行工作。
用户想要执行一个程序:
在command命令中输入程序的可执行文件名。根据文件名找到可执行文件。将可执行文件中的程序加载到内存中。设置CS:IP指向程序的入口。命令暂时停止运行并移交CPU的控制权。当另一个程序运行完毕后,CPU 控制返回到命令,等待用户输入。
4.9 程序执行过程的跟踪
命令将程序加载到内存中。一旦CS:IP指向程序的入口,command就会放弃对CPU的控制,直到程序结束,因此我们无法逐条指令地看到程序的执行过程。
调试将程序加载到内存后并不放弃对CPU的控制,而是单步执行程序。所以我们使用Debug来一条条执行指令,查看每条指令的执行结果,跟踪执行过程。
debug a.exe,debug将程序从a.exe加载到内存中
图像程序加载到内存的位置:
image(1) 程序加载后,ds存储程序所在内存区域的段地址(SA)。该内存区域的偏移地址为0,因此程序所在内存区域的地址为ds:0;
(2) 该内存区域的前256字节存放PSP,DOS用它与程序进行通信。向后256字节开始的空间存放程序。
(3)程序的物理地址为SAx16+0+256=(SA+16)x16+0,表示为段地址和偏移地址:SA+10H:0。
【《汇编语言学习笔记:第三章与第四章内容梳理》】相关文章:
用户评论
终于开始接触汇编语言了!
有7位网友表示赞同!
第三章和第四章内容不容易吧?希望我能看得懂。
有12位网友表示赞同!
最近也在学汇编,感觉很有成就感。
有15位网友表示赞同!
学习笔记分享真是太棒了!节省了我很多时间。
有10位网友表示赞同!
要学习汇编语言,真得需要扎实的计算机基础知识。
有16位网友表示赞同!
请问第三章和第四章侧重哪些方面的内容呢?
有14位网友表示赞同!
汇编语言这门学科真的很有深度啊!
有5位网友表示赞同!
笔记写得真好,看得出作者对它的理解很深。
有16位网友表示赞同!
学习汇编语言是为了更好地理解计算机工作机制吧?
有12位网友表示赞同!
感觉编程的世界越来越有趣了,要不断探索新的语言。
有5位网友表示赞同!
我会收藏一下这篇文章,以后学习的时候可以参考。
有17位网友表示赞同!
希望笔记能够涵盖一些常见指令集和操作方法。
有14位网友表示赞同!
学习汇编语言的过程一定很漫长吧?
有18位网友表示赞同!
这本书的作者是谁呢?他/她是否也写过其他编程书籍?
有7位网友表示赞同!
我特别想了解汇编语言和大数据分析之间的关系。
有19位网友表示赞同!
对于初学者来说,学习汇编语言有哪些推荐资源?
有13位网友表示赞同!
学习笔记可以分享一些代码示例吗?
有16位网友表示赞同!
感觉学习汇编语言需要很大的耐心和毅力!
有5位网友表示赞同!
我很想尝试用汇编语言编写一些简单的程序。
有20位网友表示赞同!