🏷️ 知识点:大小端
设机器数字长 16 位,有一个 C 语言程序段如下:
A. 50DBH B. BD05H C. A1B6H D. D0DBH
[tag_link]
正确答案:A
首先,程序中的 `int n = 0xAlB6;` 可能存在笔误,十六进制数字应为 0-9 和 A-F,因此合理推测为 `0xA1B6`。 机器数字长 16 位,因此 `int` 和 `unsigned int` 均为 16 位。
`n` 的初始值为 `0xA1B6`,二进制表示为 `1010 0001 1011 0110`。 作为有符号整数,其最高位为 1,表示负数,但赋值给无符号整数 `m` 时,位模式保持不变,`m` 的初始值同样为 `0xA1B6`(无符号解释为 41398)。
执行 `m = m >> 1;` 时,由于 `m` 是无符号整数,右移操作为逻辑右移,高位补 0。 原始二进制 `1010 0001 1011 0110` 右移一位后变为 `0101 0000 1101 1011`,转换为十六进制为 `0x50DB`。
机器采用大端方式存储,即高位字节在低地址,低位字节在高地址,但内存中的字节顺序不影响值的十六进制表示。 因此,`m` 在内存中的结构对应十六进制值 `50DBH`,与选项 A 一致。
若数据在存储器中以小端方式存放,则十六进制数 12345678H 按字节地址从小到大依次为( )。
A. 78563412H B. 87654321H C. 12345678H D. 21436587H
[tag_link]
正确答案:A
小端方式(Little-endian)存储规则为:多字节数据中,最低有效字节存放在最低地址,最高有效字节存放在最高地址。 对于十六进制数 12345678H,这是一个 32 位数据,占 4 个字节,从高到低字节依次为 12H、34H、56H、78H。 按小端方式存放时,地址从小到大依次存储最低有效字节到最高有效字节,即 78H、56H、34H、12H,组合起来即为 78563412H。 因此选项 A 正确。
某计算机字长为32位,按字节编址,采用小端 (Little Endian) 方式存放数据,假定有一个double型 变量,其机器数表示为1122334455667788H存放在00008040H 开始的连续存储单元中,则存储单0000 8046H中存放的是()。
A. 22H B. 33H C. 66H D. 77H
[tag_link]
正确答案:A
大端模式 :一个字中的高位字节(Byte)存放在内存中这个字区域的低地址处。小端方式:一个字中的低位字节(Byte)存放在内存中这个字区域的低地址处。依此分析,各字节的存储分配如下表所示。
| 地址 | 00008040H | 00008041H | 00008042H | 00008043H | 00008044H | 00008045H | 00008046H | 00008047H |
|---|---|---|---|---|---|---|---|---|
| 内容 | 88H | 77H | 66H | 55H | 44H | 33H | 22H | 11H |
从而存储单元 0000 804 6H 中存放的是 22H。
在按字节编址,采用小端方式的32位计算机中,按边界对齐方式为以下 C 语言结构型变量 a 分配存储空间。
struct record {
short x1;
int x2;
} a;
若 a 的首地址为 2020FE00H,a 的成员变量 x2 的机器数为 12340000H,则其中 34H 所在存储单元的地址是( )。
A. 2020FE04H B. 2020FE07H C. 2020FE05H D. 2020FE06H
[tag_link]
正确答案:C
在 32 位计算机中,按字节编址,根据 小端序 和按 边界对齐 的定义,给出变量 a 的存放方式如下:
某32位计算机按字节编址,采用小端 ( Little Endian) 方式。若语令“int i=0” 对应指令的机器代码 为“C745FC 00000000”,则语句“int i=-64” 对应指令的机器代码是()。
A.C745 FC C0 FF FF FF
B.C745 FC 0C FF FF FF
C.C745 FC FF FF FF C0
D.C745 FC FF FF FF 0C
[tag_link]
正确答案:A
按字节编址,采用 小端序 ,低位的数据存储在低地址位、高位的数据存储在高地址位,并且按照一个字节相对不变的顺序存储。由题意知机器代码的地址是递减的,存储 0 的位数是后 32 位,那么我们只需要把 -64 的补码按字节存储在其中即可,而 -64 表示成 32 位的十六进制数是 FFFFFF CO, 根据小端方式的特点,高字节存储在低地址,就是 CO FF FF FF, 故选 A。
某计算机采用大端方式,按字节编址。某指令中操作数的机器数为1234FF00H, 该操作数采用基址寻 址方式,形式地址(用补码表示)为FF12H, 基址寄存器内容为F0000000H, 则该操作数的LSB ( 最低 有效字节)所在的地址是()。
A. F000FF12H B. F000FF15H C. EFFFFF12H D. EFFFFF15H
[tag_link]
正确答案:C
注意,内存地址是无符���数。操作数采用基址寻址方式,EA=(BR)+A,基址寄存器 BR 的内容为 F000 0000H,形式地址用补码表示为 FF12H,即 1111 1111 0001 0010B,因此有效地址为 F000 0000H +(-00EEH) = EFFF FF12H。计算机采用 大端方式 编址,故低位字节存放在字的高地址处,机器数一共占 4 字节,该操作数的 LSB 所在的地址是 EFFF FF12H + 3 = EFFF FF15H,所以选 D。
某32计算机按字节编址,采用小端方式存放数据,编译器按边界对齐方式为下列 C 语言结构型数组 变量 employee 分配储存空间。
struct record{
int id;
char name[10];
int salary;
}employee[ 200];
数组 employee 的起始地址为0000A0BOH,employee[1].id 的机器数为12345678H, 问 5 6H 的地址是多 少 ? ( ) 。
A.0000 A0C3H
B.0000 A0C4H
C.0000 A0C5H
D.0000A0C6H
[tag_link]
正确答案:C
在 小端方式 下,数据的存放顺序是从最低有效字节到最高有效字节。例如,对于一个 4 字节的整数 12345678H,存放顺序为 78H 56H 34H 12H。首先,我们需要计算 struct record 的大小。根据定义: int id ; 占用 4 字节。char name[10] ; 占用 10 字节。int salary ; 占用 4 字节。总共需要 18 字节。然而,由于编译器按 边界对齐 方式分配存储空间,通常会对齐到最接近的 4 字节边界。因此,struct record 实际上会占用 20 字节(因为 18 需要向上对齐到 20)。数组 employee 的起始地址为 0000A0B0H。employee[1] 的起始地址为 0000A0B0H + 20 = 0000A0C4H 在 employee[1] 中, id 的值为 12345678H,存储在小端模式下: 地址 0000A0C4H ��放 78H 地址 0000A0C5H 存放 56H 地址 0000A0C6H 存放 34H 地址 0000A0C7H 存放 12H 因此,56H 的地址是 0000A0C5H。
上题中 C 程序段在计算机 M 上的部分机器级代码如下,每个机器级代码行中依次包含指令序号、虚拟地址、机器指令和汇编指令。
for (i = 0; i < 24; i++)
1 00401072 C7 45 F8 00 00 00 00 mov[ebp-8], 0
2 00401079 EB 09 jmp 00401084h
3 0040107B 8B 55 F8 mov eax, [ebp-8]
... ... ...
7 00401088 7D 32 jge 004010bch
for (j = 0; j < 64; j++)
8 0040108A C7 45 FC 00 00 00 00 mov[ebp-4], 0
... ... ...
a[i][j] = 10;
... ... ...
19 004010AE C7 84 82 00 20 42 00 0A 00 00 00 mov[ecx+edx*4+00422000h], 0Ah
20 ... ...
请回答下列问题。
(1) 第 20 条指令的虚拟地址是多少?
(2) 已知第 2 条 jmp 和第 7 条 jge 都是跳转指令,其操作码分别是 EBH 和 7DH,跳转地址分别为 0040 1084H、0040 10BCH,这两条指令都采用什么寻址方式?给出第 2 条指令 jmp 的跳转目标地址计算过程。
(3) 已知第 19 条 mov 指令的功能是“a[i][j]←10”,其中 ecx 和 edx 为寄存器名,0042 2000H 是数组 a 的首地址,指令中源操作数采用什么寻址方式?已知 edx 中存放的是变量 j,ecx 中存放的是什么?根据该指令的机器码判断计算机 M 采用的是大端还是小端方式。
(4) 第一次执行第 19 条指令时,取指令过程中是否会发生缺页异常?为什么?
[tag_link]
1)第 20 条指令的虚拟地址为 0040 10B9H。
2)第 2 条 jmp 和第 7 条 jge 指令都采用相对寻址方式。第 2 条指令 jmp 的跳转目标地址 = 0040 1079H+2+09H = 0040 1084H。
3)第 19 条指令中源操作数采用立即(数)寻址方式。根据汇编指令中给出的计算公式 ecx+edx*4+00422000h 可知,ecx 中存放的是 i×256。M 采用小端方式。
4)第一次执行第 19 条指令时,取指令过程中不会发生缺页异常。因为第 19 条指令所在的程序段都在页号为 00401H 的同一个页面中,执行第 19 条指令时,该页已在主存,因而取指令过程中不会发生缺页异常。
对于题 43 中的计算机 M,C 语言程序 P 包含的语句 sum+=a[i];,在 M 中对应的指令序列 S 如下:
slli r4, r2, 2 // R[r4] <- R[r2]<<2
add r4, r3, r4 // R[r4] <- R[r3]+R[r4]
lw r5, 0(r4) // R[r5] <- M[R[r4]+0]
add r1, r1, r5 // R[r1] <- R[r1]+R[r5]
已知变量 i,sum 和数组 a 都为 int 型,通用寄存器 r1 - r5 的编号为 01H-05H。请回答下列问题。
(1)根据指令序列 s 中每条指令的功能,写出存放数组 a 的首地址、变参 i 和 sum 的通用寄存器编号(3 分)
(2)已知 M 为小端方式,计算机采用页式存储管理方式。页大小为 4KB。若执行到指令序列 s 中第 1 条指令时,i=5 且 r1 和 r3 的内容分别为 0000 1332H 和 0013 DFF0H。从地址 0013 DFF0H 开始存储单元内容如题 44 图所示。则执行 sum+=a[i]; 语句后。a[i] 的地址、a[i] 和 sum 的机器数分别是什么(用十六进制表示)?a[i] 所在页的页号是多少?在此次执行中,数据组 a 至少存放在几页中?(5 分)
(3)指令 slli r4, r2, 2 的机器码是什么(用十六进制表示)?若数组 a 改为 short 类型,则指令序列存到 S 中 slli 指令的汇编形式应是什么?
[tag_link]
【答案】
1)a 的首地址存放在 r3;i 存放在 r2;sum 存放在 r1。
2)a[i] 的地址为 0013 E004H;a[i] 的机器数为 FFFF ECDCH;sum 的机器数为 0000 000EH;a[i] 所在页的页号是 0013EH;数组 a 至少存放在 2 页中。
3)指令机器码为 0021 2213H。汇编形式是 slli r4, r2, 1。【解析】
1)add r4,r3,r4:这条指令将寄存器 r3 和 r4 的值相加,结果存储在寄存器 r4 中。这对应于计算数组元素的内存地址(即&a[i])。因此,我们可以推断出寄存器 r3 存储的是数组 a 的首地址,即 a 的寄存器编号为 03H。slli r4,r2,2:这条指令将寄存器 r2 的值左移 2 位,2 结果存储在寄存器 r4 中。在 C 语言中,这对应于数组索引的计算(即 i*4,因为每个 int 类型占 4 字节)。因此,我们可以推断出寄存器 r2 存储的是变量 i 的值,即的寄存器编号位 02H。add r1,rl,r5:这条指令将寄存器 r1 和 r5 的值相加,结果存储在寄存器 r1 中。这对应于累加操作(即 sum+=a[i])。因此,我们可以推断出寄存器 r1 存储的是变量 sum 的值,即 sum 的寄存器编号为 01H。所以,数组 a 的首地址、变量 i 和 sum 的通用寄存器编号分别为 03H、02H 和 01H。
2)执行 sum+=a[i] 语句后,i 保持不变即 i = 5,每个数组元素占用四个字节
i=0时,a[0]占据存储单元 FF FF FF 7Ci=1时,a[1]占据存储单元 70 FE FF FFi=2时,a[2]占据存储单元 00 00 00 00i=3时,a[3]占据存储单元 3C 02 01 FFi=4时,a[4]占据存储单元 FF FF FF 7Ci=5时,a[5]占据存储单元 F0 F1 00 00i=6时,a[6]占据存储单元 DC EC FF FF所以a[i]的地址 = 首地址 + 偏移量 =0013 E000 + 4 * (5-1)= 0013 E004H。a[i]的机器数按照小端编址,所以 DC 作为最低位放在最右边,以此类推可得:a[i] 的机器数 = FFFF ECDCH。sum 的机器数 = 0000 1332H + FFFF ECDCH = (1) 0000 000EH。由于只有 32 位,所以最高位舍掉后答案为 0000 000EH。页大小为 4KB =212 B,所以页内地址占 12 位,去掉后 12 位剩余的则是 20 位页号,a[i] 所在页页号 = 0013EH。我们有 20 位页号,根据题目可知数组跨页号了 0013E 和 0013D,所以数组 a 至少存放在 2 页中。
3)slli r4,r2,2 // R[r4]←R[r2]<<2通用寄存器 r1→r5 的编号位 01H→05H。
- 6~0:由表可得:0010011
- 11~7:rd = r2 = 00010
- 14~12:由表可知为 010
- 19~15:rd = r4 = 00100
- 24~20:shamt = 2,可以为 2420:
- 31~25:由表可知为 000 0000机器码 = 0000 0000 0010 0001 0010 0010 0001 0011B = 0021 2213H。若 a 改为 short 类型,slli 指令的汇编形式应该是
slli r4, r2, 1。