(10分)已知某计算机M的字长为32位,int型数据占4字节,其执行如下C程序段时的部分机器级代码如下(每行依次包含指令序号、虚拟地址、机器指令和汇编指令,汇编指令中[ebp-X]表示栈帧中存放局部变量的地址):
int a[32][64]; // 数组a在主存中连续存放,首地址为00431000H
for(int i=0; i<32; i++){ // 外层循环:i从0到31
for(int j=0; j<64; j++){// 内层循环:j从0到63
a[i][j] = 0x12345678; // 给数组元素赋值
}
}
对应的机器级代码(部分):
1 00402050 C7 45 F8 00 00 00 00 mov [ebp-8], 0 ; 初始化i=0
2 00402057 EB 0B jmp 00402064H ; 跳转到外层循环判断
3 00402059 8B 45 F8 mov eax, [ebp-8] ; eax = i
4 0040205C 6B C0 40 imul eax, eax, 40H ; eax = i * 64(64为数组列数)
5 0040205F 89 45 F4 mov [ebp-4], eax ; [ebp-4] = i*64
6 00402062 EB 09 jmp 0040206DH ; 跳转到内层循环判断
7 00402064 C7 45 FC 00 00 00 00 mov [ebp-4], 0 ; 初始化j=0
8 0040206B 8B 55 FC mov edx, [ebp-4] ; edx = j
9 0040206E 8B 75 F4 mov esi, [ebp-4] ; esi = i*64(第5条指令赋值结果)
10 00402071 C7 84 B6 00 10 43 00 78 56 34 12 mov [esi*4 + edx*4 + 00431000H], 0x12345678 ; a[i][j] = 0x12345678
11 0040207C 83 45 FC 01 add [ebp-4], 1 ; j++
12 00402080 83 7D FC 3F cmp [ebp-4], 3FH ; 比较j与63(判断j<64)
13 00402084 7C E6 jl 0040206BH ; 若j<64,跳回内层循环执行
14 00402086 83 45 F8 01 add [ebp-8], 1 ; i++
15 0040208A 83 7D F8 1F cmp [ebp-8], 1FH ; 比较i与31(判断i<32)
16 0040208E 7C CB jl 00402059H ; 若i<32,跳回外层循环执行
请回答下列问题:
(1) 第11条指令的虚拟地址是多少?(2分)
(2) 第2条jmp(操作码EBH)和第13条jl(操作码7CH)均为跳转指令,跳转目标地址分别为00402064H、0040206BH。这两条指令采用何种寻址方式?请计算第2条jmp指令的跳转偏移量(用十六进制表示),并写出目标地址的推导过程。(3分)
(3) 针对第10条mov指令(实现a[i][j] = 0x12345678):①该指令中源操作数(0x12345678)采用何种寻址方式?②结合数组a的存储结构,说明指令中地址计算表达式“esi*4 + edx*4”的逻辑含义,并写出该指令访问数组元素a[i][j]的有效地址(EA)计算公式。③根据该指令的机器码,判断计算机M采用大端还是小端方式。(3分)
(4) 已知计算机M的Cache采用直接映射方式,Cache总行数为1024行(2¹⁰行),每行大小为64字节(2⁶字节),主存按字节编址。第一次执行第10条指令时,访问数组元素a[i][j](即目标存储单元)是否会发生Cache缺失?请写出具体判断过程(提示:第一次执行时访问的是a[0][0])。(2分)
登录后提交答案
暂无评论,来抢沙发