大家好,今天小编来为大家解答以下的问题,关于《汇编语言学习笔记:第三章与第四章内容梳理》,这个很多人还不知道,现在让我们一起来看看吧!
起始地址为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。
【《汇编语言学习笔记:第三章与第四章内容梳理》】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
终于开始接触汇编语言了!
有7位网友表示赞同!
第三章和第四章内容不容易吧?希望我能看得懂。
有12位网友表示赞同!
最近也在学汇编,感觉很有成就感。
有15位网友表示赞同!
学习笔记分享真是太棒了!节省了我很多时间。
有10位网友表示赞同!
要学习汇编语言,真得需要扎实的计算机基础知识。
有16位网友表示赞同!
请问第三章和第四章侧重哪些方面的内容呢?
有14位网友表示赞同!
汇编语言这门学科真的很有深度啊!
有5位网友表示赞同!
笔记写得真好,看得出作者对它的理解很深。
有16位网友表示赞同!
学习汇编语言是为了更好地理解计算机工作机制吧?
有12位网友表示赞同!
感觉编程的世界越来越有趣了,要不断探索新的语言。
有5位网友表示赞同!
我会收藏一下这篇文章,以后学习的时候可以参考。
有17位网友表示赞同!
希望笔记能够涵盖一些常见指令集和操作方法。
有14位网友表示赞同!
学习汇编语言的过程一定很漫长吧?
有18位网友表示赞同!
这本书的作者是谁呢?他/她是否也写过其他编程书籍?
有7位网友表示赞同!
我特别想了解汇编语言和大数据分析之间的关系。
有19位网友表示赞同!
对于初学者来说,学习汇编语言有哪些推荐资源?
有13位网友表示赞同!
学习笔记可以分享一些代码示例吗?
有16位网友表示赞同!
感觉学习汇编语言需要很大的耐心和毅力!
有5位网友表示赞同!
我很想尝试用汇编语言编写一些简单的程序。
有20位网友表示赞同!