20145327 《信息安全系统设计基础》第五周学习总结

20145327 《信息安全系统设计基础》第五周学习总结

教材学习内容总结

程序编码
编译代码:gcc =O1 -o p p1.c p2.c
实际上gcc命令调用了一系列程序,将源代码转化成可执行代码。

机器级代码
指令集体系结构ISA:定义了处理器状态、指令的格式,每条指令对状态的影响。

数据格式
char b-字节
short w-字
int l-双字

数据传送指令:
MOV S,D

movb 传送字节
movw 传送字
movl 传送双字
(上述gcc生成的汇编代码指令都有一个字符后缀,表明操作数的大小)

加载有效地址:实际是将有效地址写入目的操作数,目的操作数必须是寄存器。

一元操作:只有一个操作数,可以是寄存器也可是存储器位置。

INC 加1
DEC 减1
NEG 取负
NOT 取补
二元操作:源操作数是第一个,可以是立即数、寄存器、存储器 目的操作数是第二个,可以是寄存器、存储器 两个不能同时为存储器。
ADD 加
SUB 减
IMUL 乘
XOR 异或
OR 或
AND 与
使用规则: 第二个操作数 操作符 第一个操作数
移位:了解源操作数和目的操作数
SAL 左移
SHL 左移(等同于SAL)
SAR 算术右移
SHR 逻辑右移
源操作数:移位量——立即数或CL
目的操作数:要移位的数值——寄存器或存储器

do-while循环

do
body-statement
while(test-expr);
循环体body-statement至少执行一次。

loop:
body-statement
t = test-expr;
if(t)
goto loop;
即先执行循环体语句,再执行判断。

2.while循环

while (test-expr)
body-statement
GCC的方法是,使用条件分支,表示省略循环体的第一次执行:

if(!test-expr)
goto done;
do
body-statement
while(test-expr);
done:
than

t = test-expr;
if(!t)
goto done:
loop:
body-statement
t = test-expr;
if(t)
goto loop;
done:

switch语句

switch语句可以根据一个整数索引值进行多重分支。处理具有多种可能结果的测试时,这种语句特别有用。它们不仅提高了代码的可读性,而且使用跳转表这个数据结构使用实现更加高效。跳转表是一个数组,表项i是一个代码段的地址,这个代码段实现当switch索引值等于i时程序应该执行的动作。程序代码用于索引值来执行一个跳转表内的数组引用,确定跳转指令的目标。和使用一组很长的
if-else相比,使用跳转表的优点是执行switch语句的时间与switch的case数量无关。GCC根据switch语句中case的数量和case中值的稀少程序来翻译开关语句。当case数据比较多(例如4个以上),并且值的范围跨度比较小时,就会使用跳转表。

1.寄存器的使用
调用者——%eax、%edx、%ecx
被调用者——%ebx%esi%edi

寄存器%ebp-帧指针

寄存器%esp-栈指针

数据传送指令:

move指令:将源操作符的值复制到目的操作数中。源操作数指定的值是一个立即数,存储在寄存器中或者存储器中。目的操作数指定一个位置,要么是一个寄存器,要么是一个存储器地址。。传送指令的链各个操作数不能都指向存储器位置。这些指令的寄存器操作数,对于movl来说,可以是8个32位寄存器(%eax%ebp),对于movw来说,可以是8个16位寄存器(%ax%bp),movb可以使单字节寄存器元素(%ah%bh,%al%bl)。

汇编中可以用条件测试和跳转组合起来实现循环的效果,但是大多数汇编器中都要先将其他形式的循环转换成do-while格式。

课后作业中的问题和解决过程

本周代码托管截图

代码托管

其他(感悟、思考等,可选)

感觉汇编挺有趣神奇的

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 100/100 2/2 10/10
第二周 100/200 1/3 20/30
第三周 80/280 1/4 15/45
第五周 100/380 1/5 15/60

参考资料

原文地址:https://www.cnblogs.com/20145327gc/p/5960354.html