1 给出以下概念的解释说明。
机器语言程序            机器指令                汇编语言       
汇编指令                汇编语言程序            汇编助记符
汇编程序                反汇编程序                机器级程序
通用寄存器                定点通用寄存器            栈指针寄存器
指令指针寄存器            标志寄存器                条件标志(条件码)
控制标志                寻址方式                立即寻址
寄存器寻址                存储器操作数            实地址模式
保护模式                比例变址                非比例变址
比例系数(比例因子)    MMX指令                SSE指令集
SIMD                    多媒体扩展通用寄存器    栈(Stack
调用者保存寄存器        被调用者保存寄存器        帧指针寄存器
当前栈帧                按值传递参数            按地址传递参数
嵌套调用                递归调用                缓冲区溢出
缓冲区溢出攻击            栈随机化           
2 简单回答下列问题。
1)一条机器指令通常由哪些字段组成?各字段的含义分别是什么?
2)将一个高级语言源程序转换成计算机能直接执行的机器代码通常需要哪几个步骤?
3IA-32中的逻辑运算指令如何生成条件标志?移位指令可能会改变哪些条件标志?
4)执行条件转移指令时所用到的条件标志信息从何而来?请举例说明。
5)无条件转移指令和调用指令的相同点和不同点是什么?
6)按值传递参数和按地址传递参数两种方式有哪些不同点?
(7)为什么在递归深度较深时递归调用的时间开销和空间开销都会较大?
8)为什么数据在存储器中最好按地址对齐方式存放?
9)造成缓冲区溢出的根本原因是什么?
3 对于以下AT&T格式汇编指令,根据操作数的长度确定对应指令助记符中的长度后缀,并说明每个操作数的寻址方式。
1mov  8(%ebp, %ebx, 4), %ax
2mov  %al, 12(%ebp)
3add  ( , %ebx,4), %ebx
4or    (%ebx), %dh
5push  $0xF8
6mov  $0xFFF0, %eax
7test  %cx, %cx
8lea  8(%ebx, %esi), %eax
4 使用汇编器处理以下各行AT&T格式代码时都会产生错误,请说明每一行存在什么错误。
1movl  0xFF, (%eax)
2movb  %ax, 12(%ebp)
3addl  %ecx, $0xF0
4orw    $0xFFFF0, (%ebx)
5addb  $0xF8, (%dl)
6movl  %bx, %eax
7andl    %esi, %esx
(8)movw  8(%ebp, , 4), %ax
5 假设变量xptr的类型声明如下:
        src_type    x;
        dst_type *ptr;
这里,src_typedst_type是用typedef声明的数据类型。有以下一个C语言赋值语句:
*ptr=(dst_type) x;
x存储在寄存器EAXAXAL中,ptr存储在寄存器EDX中,则对于表3.12中给出的src_typedst_type的类型组合,写出实现上述赋值语句的机器级代码。要求用AT&T格式汇编指令表示机器级代码。
3.12 5用表
src_type
dst_type
机器级表示
char
int
int
char
int
unsigned
short
int
unsigned char
unsigned
char
unsigned
int
int
6    假设某个C语言函数func的原型声明如下:
    void func(int *xptr, int *yptr, int *zptr);
    函数func的过程体对应的机器级代码用AT&T汇编形式表示如下:
1    movl    8(%ebp), %eax
2    movl    12(%ebp), %ebx
3    movl    16(%ebp), %ecx   
4    movl    (%ebx), %edx
5    movl    (%ecx), %esi
6    movl    (%eax), %edi   
7    movl    %edi, (%ebx)
8    movl    %edx, (%ecx)
9    movl    %esi, (%eax)   
请回答下列问题或完成下列任务。
1)在过程体开始时三个入口参数对应实参所存放的存储单元地址是什么?(提示:当前栈帧底部由帧指针寄存器EBP指示)
2)根据上述机器级代码写出函数funcC语言代码。
7    假设变量xy分别存放在寄存器EAXECX中,请给出以下每条指令执行后寄存器EDX中的结果。
1leal  (%eax), %edx
2leal  4(%eax, %ecx), %edx
3leal  (%eax, %ecx, 8), %edx
4leal  0xC(%ecx, %eax, 2), %edx
汇编指令有多少个5leal  ( , %eax, 4), %edx
6leal  (%eax, %ecx), %edx
8    假设以下地址以及寄存器中存放的机器数如表3.13所示。
    3.13 8用表
地址
机器数
寄存器
机器数
0x8049300
0xfffffff0
EAX
0x08049300
0x8049400
0x80000008
EBX
0x00000100
0x8049384
0x80f7ff00
ECX
0x00000010
0x8049380
0x908f12a8
EDX
0x00000080
分别说明执行以下指令后,哪些地址或寄存器中的内容会发生改变?改变后的内容是什么?条件标志OFSFZFCF会发生什么改变?
1addl  (%eax), %edx
2subl  (%eax, %ebx), %ecx
3orw  4(%eax, %ecx, 8), %bx
4testb  $0x80, %dl
5imull  $32, (%eax, %edx)
6decw  %cx
9    假设函数operate的部分C代码如下:
1        int    operate(int x, int y, int z, int k)
2        {
3            int    v =               ;
4            return v;
5        }
以下汇编代码用来实现第3行语句的功能,请写出每条汇编指令的注释,并根据以下汇编代码,填写operate函数缺失的部分。
1    movl    12(%ebp), %ecx
2        sall        $8, %ecx
3        movl    8(%ebp), %eax
4        movl    20(%ebp), %edx
5        imull    %edx, %eax
6        movl    16(%ebp), %edx
7        andl        $65520, %edx
8        addl        %ecx, %edx
9        subl        %edx, %eax
10    假设函数productC语言代码如下,其中num_type是用typedef声明的数据类型。
    1    void product(num_type *d, unsigned x, num_type y ) {
    2        *d = x*y;
    3    }
函数product的过程体对应的主要汇编代码如下:
1    movl    12(%ebp), %eax
2    movl    20(%ebp), %ecx
3    imull    %eax, %ecx
4    mull        16(%ebp)
5    leal        (%ecx, %edx), %edx
6    movl    8(%ebp), %ecx
7    movl    %eax, (%ecx)
8    movl    %edx, 4(%ecx)
请给出上述每条汇编指令的注释,并说明num_type是什么类型。
11.已知IA-32是小端方式处理器,根据给出的IA-32机器代码的反汇编结果(部分信息用x表示)回答问题。
(1)已知je指令的操作码为01110100,je指令的转移目标地址是什么?call指令中的转移目标地址0x80483b1是如何反汇编出来的?
          804838c    :    74 08                je      xxxxxxx
        804838e:    e8 1e 00 00 00        call  80483b1<test>
(2)已知jb指令的操作码为01110010,jb指令的转移目标地址是什么?movl指令中的目的地址如何反汇编出来的?
          8048390:    72 f6                jb      xxxxxxx
        8048392:    c6 05 00 a8 04 08 01    movl  $0x1, 0x804a800
8048399:    00 00 00   
(3)已知jle指令的操作码为01111110,mov指令的地址是什么?

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。