2019-2020-1 20199328《Linux内核原理与分析》第二周作业

冯诺依曼体系结构的核心是:
冯诺依曼体系结构五大部分:控制器,运算器,存储器,输入输出设备。

常用的寄存器

AX、BX、CX、DX一般存放一些一般的数据,被称为通用寄存器,分别拥有高8位和低8位。

段寄存器

段寄存器CS指向存放程序的内存段,IP是用来存放下条待执行的指令在该段的偏移量,把它们合在一起可在该内存段内取到下次要执行的指令。
段寄存器SS指向用于堆栈的内存段,SP是用来指向该堆栈的栈顶,把它们合在一起可访问栈顶单元。另外,当偏移量用到了指针寄存器BP,则其缺省的段寄存器也是SS,并且用BP可访问整个堆栈,不仅仅是只访问栈顶。
段寄存器DS指向数据段,ES指向附加段,在存取操作数时,二者之一和一个偏移量合并就可得到存储单元的物理地址。该偏移量可以是具体数值、符号地址和指针寄存器的值等之一,具体情况将由指令的寻址方式来决定。

寻址方法 :寄存器寻址,立即寻址,直接寻址,间接寻址,变址寻址

立即寻址
指令的地址字段指出的不是操作数的地址,而是操作数本身,这种寻址方式称为立即寻址。立即寻址方式的特点是指令执行时间很短,因为它不需要访问内存取数,从而节省了访问内存的时间。如:MOV AX,#5678H 注意:立即数只能作为源操作数,不能作为目的操作数。
直接寻址
直接寻址是一种基本的寻址方法,其特点是:在指令格式的地址的字段中直接指出操作数在内存的地址。由于操作数的地址直接给出而不需要经过某种变换,所以称这种寻址方式为直接寻址方式。在指令中直接给出参与运算的操作数及运算结果所存放的主存地址,即在指令中直接给出有效地址 。
间接寻址
间接寻址是相对直接寻址而言的,在间接寻址的情况下,指令地址字段中的形式地址不是操作数的真正地址,而是操作数地址的指示器,或者说此形式地址单元的内容才是操作数的有效地址。
寄存器寻址方式和寄存器间接寻址方式
当操作数不放在内存中,而是放在CPU的通用寄存器中时,可采用寄存器寻址方式。显然,此时指令中给出的操作数地址不是内存的地址单元号,而是通用寄存器的编号(可以是8位也可以是16位(AX,BX,CX,DX))。指令结构中的RR型指令,就是采用寄存器寻址方式的例子。如:MOV DS,AX
寄存器间接寻址方式与寄存器寻址方式的区别在于:指令格式中的寄存器内容不是操作数,而是操作数的地址,该地址指明的操作数在内存中。

另外的一些常见命令

应注意堆栈是向下增长的,EIP寄存器不可以直接修改,必须通过特殊指令

实验部分 (路径是shiyanlou/Code)

先利用 vi main.c 而后进行编辑

其中,编辑完成时需要用保存并退出,这里开始时一直不太会,后来在网上查找资料,发现需要按下esc键,然后按下"SHIFT"+":",在输入wq表示保存并退出,最后按enter键返回上一个界面。

接下来编译成汇编代码命令如图,编译成32位的汇编程序

查看main.s会发现有许多以.开头的文件,这些都是用于链接的辅助信息,不会执行

为是代码更加简洁,使用g/.s*/d命令删去这些辅助信息

最后生成后的结果如图

原文地址:https://www.cnblogs.com/llj76720197/p/11560346.html