Algorithm
题目:链表中环的检测
自己的分析见博客《检测链表中是否存在环》
Review
disassemble command是我读的一篇英语文章,这篇文章主要是介绍gdb反汇编命令的使用和参数。自己为了能够演示这篇文章里边的内容,特意自己使用汇编语言编写代码,然后写了一篇博客。
我这里使用下边的汇编代码进行演示:
# 文件名称:twoNumberPlus.s
.type twoNumberPlus, @function
.section .data
intFormatShow:
.ascii "%d\n\0"
.global main
.section .text
main:
pushq %rbp
movq %rsp,%rbp
movq $2,%rdi
movq $3,%rsi
call twoNumberPlus
movq %rax,%rsi
movq $intFormatShow,%rdi
movq $0,%rax
call printf
movq $60,%rax
movq $0,%rdi
movq %rbp,%rsp
popq %rbp
syscall
twoNumberPlus:
pushq %rbp
movq %rsp,%rbp
addq %rdi,%rsi
movq %rsi,%rax
movq %rbp,%rsp
popq %rbp
ret
gcc -g twoNumberPlus.s -static -o twoNumberPlus
带有调试信息地进行编译。
gdb -q twoNumberPlus
使用安静模式开始调试。
list
可以看一下第1行到第10行代码。
break 10
可以在第10行代码处设置上断点,run
可以让gdb
开始运行程序,disassemble
可以查看当前运行的函数。
disassemble twoNumberPlus
可以看一下twoNumberPlus
函数的汇编代码。
disassemble 0x0000000000401095
可以看一下0x0000000000401095
地址所在的函数汇编代码。
disassemble 0x000000000040108e,0x0000000000401095
只显示0x000000000040108e
到0x0000000000401095
之间的汇编代码,注意不包括0x0000000000401095
。
disassemble twoNumberPlus,+4
反汇编函数twoNumberPlus
和它加4地址之间的代码,不包括twoNumberPlus+4
的代码。
disassemble 0x000000000040108e,+9
,反汇编0x000000000040108e
到0x000000000040108e
+9的地址之间代码,不包括0x000000000040108e
+9的代码。
disassemble /m twoNumberPlus
把 twoNumberPlus
函数反汇编出来,也把对应的行数显示出来。
disassemble /r twoNumberPlus
把机器码也反汇编出来。
Technique/Tip
我最近在学习汇编语言,感觉自己的技术基础有些差,希望程序员朋友还是要把底层知识好好学习一下,争取都能掌握,让我们的技术生命周期更长一些。另外还需把自己的涉及面提升一下,我的意思就是大家的技术既要深,也要博,当然还是要把握两者的平衡点,毕竟一个人的精力有限。这里推荐给大家几本汇编书籍。
intel汇编风格(64位)
:
Beginning x64 Assembly Programming From Novice to AVX Professional(中文版《x64汇编语言:从新手到AVX专家》)
Low-Level Programming C, Assembly
AT&T汇编风格(64位)
:
Learn to Program with Assembly Foundational Learning for New Programmers
Share
分享自己对《认知天性》
的一些总结。
学习的本质是打造心智模型,将知识条件反射式使用,就是在遇到问题时,能够毫不费力地迅速对问题做出反应。
学习的三步骤:编码、巩固和检索
编码:将材料记到大脑里面,形成短期记忆
巩固:将短期记忆变成长期记忆
检索:将知识从记忆中提取到意识中解决实际问题
学习的提升需要通过合意困难来完成,合意困难有三个要素:
1.有相应的已知做基础
2.能够触发巩固和检索
3.对学习有正面促进作用
学习的八种方法:
1.从记忆中检索新学习的内容,是学习的最好方法。
2.间隔地安排检索练习,需要注意检索知识的时间间隔,在《认知天性》
里边只说,根据不同的材料选择不同的间隔时间。根据《考试脑科学》
中的说法,在学习之后的一个月内,一定要复习一次,否则可能就是重新学习了。
3.穿插学习各种问题类型
4.细化:为新材料寻找不同层次的意义,比如将刚学习的内容跟已经学习到的知识进行关联。
5.生成:在看到解决方法之前需要自己努力回答问题或者解决难题。
6.反思:将检索和细化进行结合,回顾一下以前学习的知识,看一下自己什么地方做得好,什么地方做得不好。
7.校准: 使用客观评价工具来清除你已经掌握的知识错觉,调整你的认识来更好地反映现实。
8.助记:使用谐音或者顺口溜或者概括进行记忆。