计算机系统基础:实验10
第一题:
汇编代码文件:
wget http://121.43.169.106:5244/p/Halo/shiyan10-test1.s?sign=k6Ka93e0XZ-NnMJYq8_OPxWzPHRKLR0mdq260FZ6aug=:0 -O test1.s
汇编代码源码(此为报告中提供的源码):
如果使用上述命令直接下载附件,则需使用文本编辑器vim为文件末尾添加一行空行。
.text # 代码段声明,表示接下来的是程序的可执行代码部分
.global _start # 指定程序的入口点是 _start
_start:
movl $0x12345678, %eax
movl $0x12345678, %ebp
movl $0x804806d, %edi
movl $0x4, %ecx
movb $0x1234, %al
movl $0x4050, %eax
movw %bp, %sp
leal (%edi, %ecx), %eax
movb $-17, (%esp)
movl %eax, -12(%esp)
movl $0, %ebx
movl $1, %eax
int $0x80
注释只需根据报告表格中提供的示例进行模仿即可。
错误点应当为:
movb $0x1234, %al
该行将2字节长度赋予单字节寄存器al,因此会被寄存器提示警报,但实际成功编译。
gdb按行查询对应寄存器信息即可。
第二题:
代码文件:
wget http://121.43.169.106:5244/p/Halo/shiyan10-test2.c?sign=tejfZs5pi6Z9zsHbPqRjt4h1H55r4H9Gzn-FOOG6bAg=:0 -O test2.c
代码源码:
int exchange(int *xp, int y)
{
int x = *xp;
*xp = y;
return x;
}
int main()
{
int x = 1;
int y = 2;
exchange(&x, y);
return 0;
}
代码核心内容为exchange的函数。
使用
gcc-4.4.7 -S -O1 test2.c -o test2.s
将代码编译为汇编程序,只需观察exchange的部分,填入表格并解释其功能。
第三题:
代码文件:
wget http://121.43.169.106:5244/p/Halo/shiyan10-test3.c?sign=heo0ZYxs-LPA7GR-g3StH--LSLh4lUiSoCqhMFCkwJM=:0 -O test3.c
代码源码:
void func(int *xptr, int *yptr, int *zptr)
{
int temp1 = *xptr;
int temp2 = *yptr;
int temp3 = *zptr;
*xptr = temp2;
*yptr = temp3;
*zptr = temp1;
}
int main()
{
return 0;
}
该代码编译后与实际代码有差异,但是汇编代码中间一段在形式上相同。
若想测试代码,可以将main函数填写并调用func函数,可能会使编译结果与示例结果相同。
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 FwillraWebSite
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果
Steam卡片