第一题:

汇编代码文件:

shiyan10-test1.s

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按行查询对应寄存器信息即可。

第二题:

代码文件:

shiyan10-test2.c

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的部分,填入表格并解释其功能。

第三题:

代码文件:

shiyan10-test3.c

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函数,可能会使编译结果与示例结果相同。