没有合适的资源?快使用搜索试试~ 我知道了~
罗晏宸_PB17000297_第6次作业1
需积分: 0 4 下载量 89 浏览量
2022-08-04
12:59:07
上传
评论
收藏 87KB PDF 举报
温馨提示
试读
14页
罗晏宸_PB17000297_第6次作业1
资源详情
资源评论
资源推荐
Homework 6
PB17000297 罗晏宸
October 23 2019
Exercise 1
针对如下 C 程序及其在 i386 Linux 下的汇编代码(片段):
#include<stdio.h>
union var{
char c[5];
int i;
};
int main(){
union var data;
char *c;
data.c[0] = ’2’;
data.c[1] = ’0’;
data.c[2] = ’1’;
data.c[3] = ’6’;
data.c[4] = ’ ’;
c = (char*)&data;
printf("%x %s", data.i, c);
return 0;
}
// 第一题 C 程序
(a) 上述 C 程序的输出是什么?
(b) 补全 10 处划线部分的汇编代码。
.section .rodata
.LC0:
.string "%x %s"
.text
.globl main
.type main, @function
main:
movl %esp, %ebp
subl $40, %esp
andl $-16, %esp
movl $0, %eax
subl %eax, %esp
movb $50, -24(%ebp)
movl %eax, -28(%ebp)
pushl $.LC0
call printf
addl $16, %esp
leave
ret
// 第一题汇编程序
1
解
(a) 程序的输出结果为
36313032 2016
(b) 补全后的汇编代码如下
.section .rodata
.LC0:
.string "%x %s\n"
.text
.globl main
.type main, @function
main:
pushl %ebp
movl %esp, %ebp
subl $40, %esp
andl $-16, %esp
movl $0, %eax
subl %eax, %esp
movb $50, -24(%ebp)
movb $48, -23(%ebp)
movb $49, -22(%ebp)
movb $54, -21(%ebp)
movb $0, -20(%ebp)
leal -24(%ebp), %eax
movl %eax, -28(%ebp)
movl -24(%ebp), %eax
movl -28(%ebp), %edx
movl %edx, %esp
pushl $.LC0
call printf
addl $16, %esp
popl %esp
leave
ret
// 补全后的第一题汇编程序
2
Exercise 2
针对如下 C 程序及其汇编代码(片段):
(a) 补全划线处的汇编代码;
(b) 从运行时环境看,addl $16, %esp和leal -8(%ebp), %esp这两条汇编指令的作用
是什么?
(c) 结合上述两种汇编代码,简述编译器在按值传递结构变量时的处理方式。
#define N 2
// #define N 11
typedef struct POINT {
int x, y ;
char z[ N ];
struct POINT *next;
} DOT;
void f(DOT p)
{
p.x = 100;
p.y = sizeof(p);
p.z[1] = ’A’;
f(*(p.next));
}
// 第二题 C 程序
.file "test1.c"
.text
.globl f
.type f,@function
f:
pushl %ebp
movl %esp, %ebp
movl $100, 8(%ebp)
movl $16, 12(%ebp)
movb $65,
movl , %eax
pushl
pushl
pushl
pushl
call f
addl $16, %esp
leave
ret
// 当 N=2 时,生成的汇编代码片段。
3
剩余13页未读,继续阅读
艾法
- 粉丝: 20
- 资源: 319
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0