教材学习内容总结

  • 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

-----------------------数据转移指令---------------------------------

  1. 通用数据传送指令.
    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 ) 
    
  2. 输入输出端口传送指令.
    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\n", 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/)
- 结对照片

# 2017-2018-1 20155224 《信息安全系统设计基础》第5周学习总结

- 结对学习内容
    - 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小时

  • 改进情况:

(有空多看看现代软件工程 课件
软件工程师能力自我评价表
)

参考资料

相关文章: