2017-2018-1 20155224 《信息安全系统设计基础》第5周学习总结
教材学习内容总结
- gcc -Og -o p p1.c p2.c:-Og告诉编译器使用会生成符合原始C代码整体结构的机器代码的优化等级。
- gcc -Og -S xxx.c:可看到编译器产生的汇编代码。
- objdump -d xxx.o:可查看机器代码文件的内容。
- C语言调用机制使用了栈数据结构提供的后进先出的内存管理原则。
- call指令有一个目标,即指明被调用过程起始的指令地址。
- 有些情况下局部数据必须存放在内存中。
- 寄存器不够存放所有本底数据。
- 对一个局部变量使用地址运算符“&”。
- 某些局部变量是数组活结构。
- 寄存器组是唯一被所有过程共享的资源。必须确保一个过程调用另一过程时,寄存器值不会被覆盖。
教材学习中的问题和解决过程
(一个模板:我看了这一段文字 (引用文字),有这个问题 (提出问题)。 我查了资料,有这些说法(引用说法),根据我的实践,我得到这些经验(描述自己的经验)。 但是我还是不太懂,我的困惑是(说明困惑)。【或者】我反对作者的观点(提出作者的观点,自己的观点,以及理由)。 )
- 问题1:本章主要内容是汇编相关的,但我对汇编相关指令还不是很熟悉。
- 问题1解决方案:
-----------------------算数运算指令-----------------------
ADD 加法
ADC 带位加法
SBB 带位减法
SUB 减法.
INC 加法.
NEC 求反(以0减之).
NEG 求反然后加1,假如NEG AL相当于Not AL; INC AL
CMP 比较.(两操作数作减法,仅修改标志位,不回送结果).
INC DPTR 数据指针寄存器值加1 (说明:将16位的DPTR加1,当DPTR的低字节(DPL)从FFH溢出至00H时,会使高字
节(DPH)加1,不影响任何标志位)
MUL A B 将累加器的值与B寄存器的值相乘,乘积的低位字节存回累加器,高位字节存回B寄存器(说明:将累加
器A和寄存器B内的无符号整数相乘,产生16位的积,低位字节存入A,高位字节存入B寄存器.如果积大于FFH,则溢出
标志位(OV)被设定为1,而进位标志位为0)
IMUL 整数乘法. 以上两条,结果回送AH和AL(字节运算),或DX和AX(字运算),
DIV A B 将累加器的值除以B寄存器的值,结果的商存回累加器,余数存回B寄存器(说明:无符号的除法运算,
将累加器A除以B寄存器的值,商存入A,余数存入B。执行本指令后,进位位(C)及溢出位(OV)被清除为0)
IDIV 整数除法. 以上两条,结果回送: 商回送AL,余数回送AH, (字节运算); 或 商回送AX,余数回送DX, (字运算).
-----------------------逻辑运算指令---------------------------------
AND 与运算.
OR 或运算.
XOR 异或运算.
NOT 取反.
TEST 测试.(两操作数作与运算,仅修改标志位,不回送结果).
SHL 逻辑左移.
SHR 逻辑右移.
SAL 算术左移.(=SHL)
SAR 算术右移. (左移是一样的,右移是不同的.逻辑右移补0,算术右移补最高位)
ROL 循环左移. ( ((unsigned char)a) << 5 ) | ( ((unsigned char)a) >> 3 )
rol eax,cl ==> eax=(eax<<cl)+(eax>>(32-cl));
ROR 循环右移. ror eax,cl ==> eax=(eax>>cl)+(eax<<(32-cl));
RCL 通过进位的循环左移.
RCR 通过进位的循环右移.
以上八种移位指令,其移位次数可达255次.
移位一次时, 可直接用操作码. 如 SHL AX,1.
移位>1次时, 则由寄存器CL给出移位次数.
如 MOV CL,04
SHL AX,CL
-----------------------数据转移指令---------------------------------
-
通用数据传送指令.
MOV 传送字或字节.
MOVSX 先符号扩展,再传送.
MOVZX 先零扩展,再传送.
PUSH 把字压入堆栈.
POP 把字弹出堆栈.
PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈.
POPA 把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈.
PUSHAD 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈.
POPAD 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈.
BSWAP 交换32位寄存器里字节的顺序
XCHG 交换字或字节.( 至少有一个操作数为寄存器,段寄存器不可作为操作数)
CMPXCHG 比较并交换操作数.( 第二个操作数必须为累加器AL/AX/EAX )
XADD 先交换再累加.( 结果在第一个操作数里 )
XLAT 字节查表转换.
── BX 指向一张 256 字节的表的起点, AL 为表的索引值 (0-255,即 0-FFH); 返回 AL为查表结果. ( [BX+AL]->AL )
-
输入输出端口传送指令.
IN I/O端口输入. ( 语法: IN 累加器, {端口号│DX} )
OUT I/O端口输出. ( 语法: OUT {端口号│DX},累加器 )
输入输出端口由立即方式指定时, 其范围是 0-255; 由寄存器 DX 指定时,
其范围是 0-65535.
----------------------- 标志传送指令-----------------------
LAHF 标志寄存器传送,把标志装入AH.
SAHF 标志寄存器传送,把AH内容装入标志寄存器.
PUSHF 标志入栈.
POPF 标志出栈.
PUSHD 32位标志入栈.
POPD 32位标志出栈.
0012F618 |00A8E5A8 ASCII "nk'MHBh30"
-----------------------程序转移指令 -----------------------
1>无条件转移指令 (长转移)
JMP 无条件转移指令
CALL 过程调用
RET/RETF过程返回.
2>条件转移指令 (短转移,-128到+127的距离内)
( 当且仅当(SF XOR OF)=1时,OP1<OP2 )
JA/JNBE 不小于或不等于时转移.
JAE/JNB 大于或等于转移.
JB/JNAE 小于转移.
JBE/JNA 小于或等于转移.
以上四条,测试无符号整数运算的结果(标志C和Z).
JG/JNLE 大于转移.
JGE/JNL 大于或等于转移.
JL/JNGE 小于转移.
JLE/JNG 小于或等于转移.
以上四条,测试带符号整数运算的结果(标志S,O和Z).
JE/JZ 等于转移.
JNE/JNZ 不等于时转移.
JC 有进位时转移.
JNC 无进位时转移.
JNO 不溢出时转移.
JNP/JPO 奇偶性为奇数时转移.
JNS 符号位为 "0" 时转移.
JO 溢出转移.
JP/JPE 奇偶性为偶数时转移.
JS 符号位为 "1" 时转移.
3>循环控制指令(短转移)
LOOP CX不为零时循环.
LOOPE/LOOPZ CX不为零且标志Z=1时循环.
LOOPNE/LOOPNZ CX不为零且标志Z=0时循环.
JCXZ CX为零时转移.
JECXZ ECX为零时转移.
4>中断指令
INT 中断指令
INTO 溢出中断
IRET 中断返回
5>处理器控制指令
HLT 处理器暂停, 直到出现中断或复位信号才继续.
WAIT 当芯片引线TEST为高电平时使CPU进入等待状态.
ESC 转换到外处理器.
LOCK 封锁总线.
NOP 空操作.
STC 置进位标志位.
CLC 清进位标志位.
CMC 进位标志取反.
STD 置方向标志位.
CLD 清方向标志位.
STI 置中断允许位.
CLI 清中断允许位.
代码调试中的问题和解决过程
- 问题1:XXXXXX
- 问题1解决方案:XXXXXX
- 问题2:XXXXXX
- 问题2解决方案:XXXXXX
- ...
代码托管
(statistics.sh脚本的运行结果截图)
上周考试错题总结
- main.c 调用了静态库libmath.a中的函数,编译main.c的命令是()
A .
gcc -static main.c ./libmath.a -o main
B .
gcc -static main.c -L. -lmath -o main
C .
gcc -static main.c -L. -llibmath.a -o main
D .
gcc -static main.o ./libmath.a -o main
正确答案: A B 你的答案: C
- 针对以上代码:gcc -c *.c 可以得到m.o,swap.o两个模块,相对于m.o, buf是()
A .
外部符号
B .
全局符号
C .
局部符号
D .
以上都不对
正确答案: B 你的答案: A
- 针对以上代码:gcc -c *.c 可以得到m.o,swap.o两个模块,哪些符号会出现在swap.o模块的.symtab条目中()
A .
buf
B .
temp
C .
swap
D .
buffp0
正确答案: A C D 你的答案: C D
- 上图是典型的ELF的可重定位目标文件的格式,对于代码:
int a[100] ={0};
int b[100];
int main()
{
int i=0;
for(i=0; i<100; i++)
b[i] = i;
printf("the b[3]= %d
", b[3]);
return 1;
}
其中b[100]存放在()节
A .
.text
B .
.data
C .
.bss
D .
.rodata
正确答案: C 你的答案: B
- 编译驱动程序gcc -c 会调用()
A .
预处理器
B .
编译器
C .
汇编器
D .
链接器
正确答案: C 你的答案: B
- dll,so文件的链接是运行在()
A .
编译时
B .
加载时
C .
运行时
D .
链接时
正确答案: C 你的答案: B
结对及互评
点评模板:
- 博客中值得学习的或问题:
- xxx
- xxx
- ...
- 代码中值得学习的或问题:
- xxx
- xxx
- ...
- 其他
本周结对学习情况
- [20155219](http://www.cnblogs.com/paypay/)
- 结对照片
- 结对学习内容
- XXXX
- XXXX
- ...
其他(感悟、思考等,可选)
xxx
xxx
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 0/0 | 1/1 | 3/3 | |
第二周 | 32/32 | 1/2 | 4/7 | |
第三周 | 109/141 | 1/3 | 8/15 | |
第四周 | 58/199 | 1/4 | 8/15 |
尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。
-
计划学习时间:XX小时
-
实际学习时间:XX小时
-
改进情况:
(有空多看看现代软件工程 课件
软件工程师能力自我评价表)