计算机系统期中题库

1 基础知识点

  1. 单精度浮点数 float为32 位,其中符号位 s 占 1 bit,阶码 E 占 8 bit,尾数 M 占 23 bit
  2. E=阶码=指数 EXP Bias=2k-1-1
  3. frac为0位到第22位,即2^23 = 8388608,一共七位,这意味着最多能有7位有效数字,但绝对能保证的为6位,所以float的精度为6~7位有效数字;
  4. float的指数范围为-126~+127;
  5. 负指数决定了浮点数所能表达的绝对值最小的非零数,正指数决定了浮点数所能表达的绝对值最大的数,也即决定了浮点数的取值范围;
  6. 在定点小数一位除法中为了避免溢出被除数的绝对值一定要小于除数的绝对值
  7. 指令系统中采用不同寻址方式的目的主要是 C 缩短指令长度,扩大寻址空间,提高编程灵活性
  8. 寄存器间接寻址:
    操作数在主存单元
  9. 由于表示的精度有限,浮点运算不具备结合性,一般选择最小的先运算
  10. 有符号数遇见无符号数会默认强制转换为无符号数
  11. 浮点数编码是表示实数的科学计数法的以二为基数的版本
  12. 无符号数中,所有的位都用于直接表示该值的大小,最高位非符号位。所以,无符号数无原码、反码、补码。
  13. 不可以 movb $0xF,%ebx

xy同号 且 z与x异号 OF是有符号溢出
12.
z小于x CF是无符号进位
13. 对于一个无符号数字X,截断它到K位的结果就相当于计算 x mod 2K
14. 指向int型的指针与指向char型的指针长度总是一样
15. 在64位机器中,将一个double型数一次性完整的传入某个寄存器中,应该使用的指令是 movq (8字节)
16.
17. imull 有符号乘法 sall 算数左移(*2x)
18. 计算机系统中采用补码运算的目的是为了 简化计算机的设计
19. 计算机操作的最小时间单元为 时钟周期
20. 计算 Imm(Eb ,Es ,s)这种寻址模式所表示的有效地址为Imm + R[Eb]+R[Es] *s
R[] 表示寄存器 M[]表示内存
21. 汇编指令LOOPE/LOOPZ是指 CX不为零且标志ZF=1时循环
22. 在32位机器中声明char (p)[8],其占用的存储空间是 4 字节
p)储存大小为8的数组的首地址;p储存着p的地址,因此 p是一个指针 所以是4字节
23. 调用者保存寄存器为: %eax %edx %ecx
24. 被调用者保护寄存器:%ebx %edi %esi %rbx、%rbp
25. 参数入栈后,接着入栈的是 返回地址 (call) 在被调用函数里 再压入ebp的值
26. 跳转指令ja的跳转条件为条件码的组合是 CF&ZF
无符号 判断非零且没有进位
27. 跳转指令jge的跳转条件为条件码的组合 ~(SF^OF)
有符号 判断 溢出且结果是负数 没有溢出 结果是正数
27. 两补码相加,采用1位符号位,当( )时,表示结果溢出
符号位进位和最高数位进位异或结果为1
28. 操作系统内核提供三个基本的抽象:
① 文件 是对I/O设备的抽象
② 虚拟存储器 是对主存和磁盘的抽象
③ 进程 是对处理器、主存和I/O设备的抽象
29. 机器代码提供两种基本的低级机制来实现有条件的行为:测试数据值,然后根据测试的结果,来改变控制流或数据流
30. 加载有效地址指令leal实际上是movl指令的变形。它的指令形式是从存储器读数据到寄存器,但是实际上,过程中并没有引用存储器。
31. 下列不属于操作数类型的是 计数器
32. 寄存器用来存储 整数数据和指针
33. 在大多数机器上,整数除法要比整数乘法更慢
34. 单精度和双精度浮点数分别在32位机器中使用()字节。 4,8
35. 计算机使用(字长)来指明整数和指针数据的标称大小。
36. 位于存储器层次结构中的最顶部的是 (寄存器)
37. CPU要访问的某一存储单元的实际地址称 (物理地址)
38. gcc编译程序时,需要在执行文件中产生调试文件的gcc附加参数是( (-g))
39. IA32指令集中MOV类指令不包含( movx)
MOVX是外部数据存储器(外部RAM)与累加器A之间的数据传送指令
40. IEEE浮点数用V = (-1)^s * M * 2^E的形式来表示一个数,其中E表示的是 (可正可负整数阶码)
41. 8086CPU在基址加变址的寻址方式中,变址寄存器可以为 ( SI或DI )
42. call指令的效果是将返回地址入栈,并跳转到被调用过程的起始处.返回地址是紧跟在程序中call后面的那条指令的地址
43. 汇编语言源程序中,每个语句由四项组成,如语句要完成一定功能,那么该语句中不可省略的项是( 操作项 )
44. 在32位汇编代码后缀 l 表示( 四个字节 )
movb 传送一个字节
movw 传送两字节 单字长
movl 传送四个字节 双字长
movq 传送8字节 4字长
45. gdb中:
46. 补码使得数的符号位可以同数值部分作为一个整体参与运算
47. .int转为float类型时,不会发生溢出,但是有可能发生舍入。(有些数字float无法精确表示)
48. 浮点数IEEE754标准对尾数编码采用的是( 原码 )
49. 浮点加减中的对阶的( 将较小的一个阶码调整到与较大的一个阶码相同 )
50. 并发运行是指一个进程的指令和另一个进程的指令是交错执行的
51. 64位有符号除法 idivl S,所得结果商存在%eax中,余数存在%edx中
52. 32位linux系统中,long类型的字节数是 4
53. 汇编语言的优点:
① 直接有效地控制硬件
②生成的代码序列短小
③运行速度快
54. 程序寄存器组是唯一能被所有过程共享的资源
55. 源码 反码 补码 均可以表示负数 无符号数没有源码 补码 反码
源码:-(2n-1 -1) ~ 2n-1-1
反码:-(2n-1-1) ~ 2n-1-1
补码: -2n-1 ~ 2n-1-1
56. 在C语言中,移位运算的优先级比加法(和减法)要低
57. 机器级程序使用的存储器地址是( 虚拟地址 )
58. 用于最小程序缓冲区溢出攻击漏洞的最常见的机制:
①栈保护
②随机化
③限制哪部分存储器可以存储可执行代码
59. 两个w位的数字相乘,机器可以用一种乘法指令来进行有符号和无符号整数的乘法
60. 两个数的w位补码之和与无符号之和有完全相同的位级表示
两个二进制数,看成补码表示加起来得到的结果和看成无符号得到的结果的二进制表示一样。比如1111和1010,看成补码就是-1和-6,加起来是-7,二进制表示为1001,看成无符号数就是15和10,加起来是25,二进制表示也是为1001(这里溢出了)
61. 栈帧的最顶端以两个指针界定,寄存器(%ebp)为帧指针,%esp为栈指针
62. 跳转表是一个( 数组 )
63. jmp LABEL要跳转的地址是LABEL地址中存的地址
64. 函数编译出来的代码会创建栈帧的原因:
① 有些局部变量是数组或者结构
② 函数用取地址操作符(&)来计算一个局部变量的地址
③ 在修改一个被调用者保存寄存器之前,函数需要保存它的状态
65. IA32架构下,栈的增长方式是 向下增长
66.
67. pop %eip 不合法 只有ret可以pop掉返回地址 修改eip
68. mov $0x00H,%AL
69. 有一个CRT的分辨率是1024×768像素,颜色数为256色,则刷新存储器的容量是( 768KB )
1024
768
8/8 bite=768Kb
69. 补码的非:

如果是最小的 就等于自己;其他的等于自己的相反数
此处设w=4,用补码可表示的范围就是[-8,7],对于-8,它的“补码的非”还是-8,而[-7,7]补码的非就是原数的负数,比如说-4的“补码的非”是-4取负,即:4,而3的“补码的非”是3取负,即:-3。
70. 计算机中,单精度浮点数据类型和双精度浮点数据类型的尾数分别用()位和()位表示。 23,52
71. x86_64架构有16个通用寄存器,相比IA32多了8个
72. ASCII码中,A和a对应的十进制整数值分别为()和() 65,97
73. 计算机中表示信息的最小单位是 ( 位 )
74. 操作系统:
① 操作系统是应用程序和硬件之间插入的一层软件
② 操作系统具有防止硬件被失控的应用程序滥用的功能
③ 操作系统具有向应用程序提供简单一致的机制来控制底层硬件设备的功能
④ 操作系统通过进程、虚拟存储器和文件来实现功能
75. 字符串“\ta\017bc”的长度(不包括结束符)是 5

  1. MOVZ类中的指令是把目的中剩余的字节填充为0,而MOVS类中的指令通过符号扩展来填充,把源操作的最高位进行复制
  2. 根据惯例,寄存器%rbx、%rbp和%r12~%r15被划分为被调用者保护寄存器。
  3. 跳转指令JMP的编码方式 有些是 采用PC相对的,以目标指令的地址与紧跟在跳转指令后面那条指令的地址之间的差作为编码
  4. cltq指令无操作数,只作用于寄存器%eax和%rax,把%eax符号扩展到%rax
  5. 寄存器rax初始化后值为0011223344556677,经过指令 movl $-1,%eax ,寄存器rax中数值变成 00000000FFFFFFFF
    前面的位数会自动清零
  6. hello.c hello.i hello.s hello.o hello
    C程序 汇编文件 机器语言指令 可执行文件

2 单选题

很遗憾图片没法一次性复制粘贴,大家可以参考下知识点(都是对标题库的)

3 详细知识点

在这里插入图片描述
在这里插入图片描述

  1. 结构体中元素是按照定义顺序一个一个放到内存中去的,但并不是紧密排列的。从结构体存储的首地址开始,每一个元素放置到内存中时,它都会认为内存是以它自己的大小来划分的,因此元素放置的位置一定会在自己宽度的整数倍上开始(以结构体变量首地址为0计算)。
  2. 存储单元是否为所有元素中最宽的元素的长度的整数倍

我们可以把操作系统看成应用程序和硬件之间插入的一层软件,所有的应用程序对硬件的操作都必须通过操作系统。
操作系统的两个基本功能:
①防止硬件被失控的应用程序滥用。
②向应用程序提供简单一致的机制来控制复杂而又大相径庭的低级硬件设备。
我们可以通过进程、虚拟存储器和文件这几个抽象概念来实现上面两个功能:
①文件是对I/O设备的抽象表示;
②虚拟存储器是对主存和磁盘I/O设备的抽象表示;
③进程则是对处理器、主存和I/O设备的抽象表示

单精度浮点数占据32位,1位为符号位,8位指数位,尾数23位;
双精度浮点数占据64位,1位为符号位,11位指数位,52位尾数位。

条件码通常不会直接读取,有三种使用方法:
(1)根据条件码的某个有意义的组合或者逻辑操作后的结果将某个字节设置为0或者1
(2)跳转指令可以以条件码为条件进行跳转
(3)可以有条件的传送数据

移位操作
SAL 算术左移SAR 算术右移
SHL 逻辑左移SHR 逻辑右移
有符号数进行算数移位,无符号数逻辑移位
特殊操作
imull,有符号数乘法
双操作数,从两个32位操作数产生一个32位的乘积。
mull,无符号数乘法
idivl有符号除法
divl无符号除法

控制器是由指令寄存器IR、程序计数器PC和操作控制器OC三个部件组成。

计算机以补码的形式保存所有的整数

整型算术运算溢出:完整的整数结果不能放到数据类型的字长限制中去。

跳转表是一个数组,表项i是一个代码段的地址。

栈帧结构 栈帧 为单个过程分配的那部分栈称为栈帧。 最顶端的栈帧以两个指针界定,寄存器%ebp为栈底 帧指针,%esp为栈顶 栈指针

  1. 对无符号和补码乘法,乘法运算的位级表示都是一样的。
  2. 机器使用一种乘法指令来进行有符号和无符号整数的乘法,也就是都采用无符号乘法处理,再取低位。
  3. 无符号和补码的乘法低位是相同的。

随机化、栈保护和限制可执行代码,是用于最小化程序缓冲区溢出攻击漏洞三种最常见机制

c语言移位的优先级比较低,移位的优先级比加法的优先级还要低,

程序寄存器是唯一一个被所有过程共享的资源。虽然在给定时刻只能有一个过程是活动的,我们必须保证当一个过程(调用者)调用另一个(被调用者)时,被调用者不会覆盖某个调用者稍后会使用的寄存器的值。为此,IA32采用了一组统一的寄存器使用惯例,所有的过程都必须遵守,包括程序库中的过程。
根据惯例,寄存器eax,edx,ecx被划分为调用者保存(caller save)寄存器。当过程P调用Q时,Q可以覆盖这些寄存器,而不会破坏P所需要的数据。另外,寄存器ebx,esi和edi被划分为被调用者保存(callee save)寄存器。这意味着Q必须在覆盖它们之前,将这些寄存器的值保存到栈中,并在返回前恢复它们,因为P(或某个更高层次的过程)可能会在今后的计算中需要这些值。此外,根据这里描述的惯例,必须保存寄存器ebp,esp。
过程P在调用Q之前计算y,但是它必须保证y的值在Q返回后是可用的。有两种方式可以做到这一点:
1:它可以在调用Q之前,将y的值存放在自己的栈帧中;当Q返回时,它可以从栈中取出y的值。
2:它可以将y的值保存在被调用者保存寄存器中。如果Q,或任何其他Q调用的程序,想使用这个寄存器,它必须将这个寄存器的值保存在栈帧中,并在返回前恢复该值。因此,当Q返回到P时,y的值会在被调用者保存寄存器中,或者是因为寄存器根本就没有改变,或者是因为它被保存并恢复了。

所谓的并发运行,则是说一个进程的指令和另一个进程的指令是交错执行的。

call指令的效果是 将返回地址入栈,并跳转到被调用过程的起始处 。 (返回地址是在程序正文中紧跟在call后面的那条指令的地址,这样当被调用过程返回时,执行流会从此处继续。 )
leave:弹出旧ebp
ret指令从栈中弹出地址,并跳转到这个位置。

JNE:如果不为0就跳转(即如果ZF=0就跳转)
cltq将EAX签名扩展为RAX。它是movslq %eax, %rax的简短形式,节省了代码字节。

在某些极端要求性能的场合,我们需要对程序进行优化,关于优化,以下说明正确的是:
A. 将程序整个用汇编语言改写会大大提高程序性能。
B. 在优化前,可以先确定哪部分代码最为耗时,然后对这部分代码使用汇编语言改写,使用的汇编语句数目越少,程序就运行越快。
C. 使用汇编语言虽然可能提高程序性能,但是降低了程序的可移植性和可维护性,所以应该绝对避免。
D. 适当调整汇编指令的顺序,可以缩短程序运行的时间。
解答:
A:不应该将程序整个改写,应该只改写关键部分,整个改写降低了程序的可移植性和可维护性;
B:汇编语句不是数目越少越快,循环等;
C:不应该绝对避免

操作系统通过几个基本的抽象概念来实现管理硬件,文件,虚拟存储器,进程,
①文件是对IO设备的抽象;
②虚拟存储器是对主存和磁盘IO设备的抽象表示
③进程则是对处理器 主存 io设备的抽象

32系统中
short与short int型数据占2个字节(16位);
int、long int、long型数据占4个字节(32位);
long long 型数据占8个字节(64位)。

div是除法指令,使用div做除法的时候应注意以下问题:
1、除数:有8位和16位两种,在一个寄存器或者内存中。
2、被除数:默认放在AX或(DX和AX)中,如果除数为8位,被除数为16位,被除数默认在AX中存放,如果除数为16位,被除数为32位,被 除数则在(DX和AX)中存放,DX存放高16位,AX存放低16位。
3、结果:如果除数是8位,则AL存储除法操作的商,AH存储除法操作的余数;如果除数是16位,则AX存储除法操作的商,DX存储除法操作的余数。
%eax保存着商 %edx储存余数

可能会舍入
①从 int 转换成 float,数字不会溢出,但是可能被舍入。
②从 int、float 转换成 double,能够保留精确的数值。因为 double 有更大的范围和更高的精度(有效位数)。
③从 double 转换成 float,因为 float 范围要小一些,所以值可能溢出成 +∞ 或 -∞。另外由于float精度较小,还可能被舍入。
④从 float、double 转换成 int,值将会向零舍入。如1.999会被转成1,-1.999会被转成-1。同时值可能会溢出

ebp是帧指针 esp是栈指针
double:64位
float:32位

地址寄存器包括指针和变址寄存器SI、DI、 SP、BP 四个16位寄存器
esi edi esp ebp

指数 E=阶码 EXP-Bias

浮点数所能表示的范围取决于阶码;精度取决于尾数。

带+、-符号的数叫真值,把符号数字化得到的数称为机器数(1表示-,0表示+)
机器数:原码、反码、补码、移码

(1) 在补码加减运算中,符号位与数据 按同样规则一起 参加运算,符号位产生的进位 自动丢失
(3) 在原码一位乘法的运算过程中,符号位与数值位 分别 参加运算,运算结果的符号位等于 两操作数的符号的模2加(异或)
(4) 浮点乘除法运算的运算步骤包括:阶码运算 、 溢出判断、尾数乘除运算、结果规格化处理、舍入处理
(5) 在浮点运算过程中,如果运算结果的尾数部分不是 规格化 形式,则需要进行规格化处理。设尾数采用补码表示形式,当运算结果 溢出 时,需要进行右规操作;当运算结果 不是规格化数 时,需要进行左规操作。
左规操作:尾数左移1位,阶码减1
右规操作:尾数右移1位,阶码+1
(6) 将两个8421BCD码相加,为了得到正确的十进制运算结果,需要对结果进行修正,其修正方法是 两个8421码相加后,若相加的和数<10,则不需修正,按二进制规则相加的结果就是正确的8421码的和数;若相加的和数≥10,则需在二进制相加的结果上加“0110”进行修正。
(7) 浮点运算器由 阶码部件 和 尾数部件 两部分组成,它们本身都是定点运算器,其中阶码部件 要求能够进行 加减 运算;尾数 要求能够进行 加减乘除 运算。

int 4字节 B:内存到内存
movx
其中 x 可以是下面的字符:
1,l用于32位的长字值 4字节
2,w用于16位的字值 2字节
3,b用于8位的字节值 单字节
4,q用于64位的长字节
movsbl:符号扩展
movzbl:零扩展

CF(carry flag):无符号数减法有借位;进位(但是INC/DEC指令不影响cf位)
ZF(zero flag):零标志 最近操作结果为0(列如 逻辑操作 等)
SF(sign flag):符号标志 最近操作结果为负数
OF(overflow flag):有符号数减法时有溢出(正溢出或者负溢出)
inc指令:操作数+1

32位系统,双字l 4字节 -4

setl:小于 设置为1

时钟周期是最计算机操作的最小单位时间,由计算机的主频决定,是主频的倒数。
时钟周期也称为振荡周期,定义为时钟频率的倒数。时钟周期是计算机中最基本的、最小的时间单位。在一个时钟周期内,CPU仅完成一个最基本的动作。时钟周期是一个时间的量。

1、中断周期
当CPU采用中断方式实现主机与I/O交换信息时,CPU在每条指令执行阶段结束前,都要发中断查询信号,以检测是否有某个I/O提出中断请求。如果有请求,CPU则要进入中断响应阶段,又称中断周期。
2、CPU周期
机器内部各种操作大致可归属为对CPU内部的操作和对主存的操作两大类,由于CPU内部操作速度较快,CPU访问一次内存所花的时间较长,因此用从内存读取一条指令字的最短时间来定义,这个基准时间就是CPU周期(机器周期)。一个指令周期常由若干CPU周期构成。
3、指令周期
计算机之所以能自动地工作,是因为CPU能从存放程序的内存里取出一条指令并执行这条指令;紧接着又是取指令,执行指令,如此周而复始,构成了一个封闭的循环。除非遇到停机指令,否则这个循环将一直继续下去。

  1. LOOP Lable
    解释:遇到这条命令,首先执行 CX=CX-1;然后判断CX的值,若CX!=0,则循环;如果CX=0,终止循环。

  2. LOOPZ/LOOPE Lable
    解释:遇到这条命令,首先执行 CX=CX-1;然后判断CX的值,如果遇到CX=0或者ZF=0,则终止循环。

  3. LOOPNZ/LOOPNE Lable 、
    解释:遇到这条命令,首先执行 CX=CX-1;如果遇到CX=0或者ZF=1,则终止循环。

64位机器,指针8字节;指针数组,每个指针8字节,8*8=64

  1. 调用者保存寄存器:
    也叫易失性寄存器,在程序调用的过程中,这些寄存器中的值不需要被保存(即压入到栈中再从栈中取出),如果某一个程序需要保存这个寄存器的值,需要调用者自己压入栈;
    eax edx ecx
  2. 被调用者保存寄存器
    也叫非易失性寄存器,在程序调用过程中,这些寄存器中的值需要被保存,不能被覆盖;当某个程序调用这些寄存器,被调用寄存器会先保存这些值然后再进行调用,且在调用结束后恢复被调用之前的值;
    ebx edi esi

esp是栈顶指针的寄存器
ebp是基址寄存器

ja: 结果不为0且不存在进位
jge:正数且溢出 or负数且不溢出

操作数有 3 种基本类型:

● 立即数——用数字文本表达式
● 寄存器操作数——使用 CPU 内已命名的寄存器
● 内存操作数——引用内存位置

指令Leal实际上是movl指令的变形。他的指令形式是从存储器读数据到寄存器,但实际上他根本就没有引用存储器。

在机器代码中,提供两种基本的低级机制来实现有条件的行为:测试数据值,然后根据测试的结果来改变控制流 或者数据流

一个 IA32 中央处理单元(CPU)包含一组 8 个存储 32 位值的寄存器。 这些寄存器用来存储整数数据和指针

我们使用的ATT
ATT格式汇编 vs Intel格式汇编:
(1)intel省略表示大小的后缀
(2)intel省略寄存器前%
(3)intel用不同的方式描述内存中的位置,如“QWORD PTR [rbx]”替代“(%rbx)”
(4)在带有多个操作数的指令情况下,列出的操作数顺序相反

实际上在大多数机器上,整数除法要比整数乘法更慢
每台计算机都有一个字长(word size),指明整数和指针数据的标称大小。

字长:32位 64位
比特bit:位
字节byte:8
字:32位的字是4字节

S:符号位
frac:尾数

  • 6
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MORE_77

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值