一 函数对象
函数同样可以作为对象复制给一个变量,如下:
1 | f = abs; |
用前文提到的基础知识,和网上流行的2048源码,用python实现该游戏。
先将用户操作和游戏逻辑绑定。
WASD分别对应移动方向上、左、下、右
然后实现矩阵的转置和逆置,这样只要实现一个方向的移动,通过转置和逆置就可以得到其他方向的移动。
通过前文介绍,大体上可以用学过的知识做一些东西了。
这里简单介绍下python参数解析argparse命令
。
使用argparse
需要引用
import argparse
然后调用
parser = argparse.ArgumentParser()
ArgumentParser()函数可以传一些参数
parser = argparse.ArgumentParser(description='This is a PyMOTW sample program')
参数有很多种类型,读者自己查阅,参考资料的链接:
我没学过python
,通过网上和一些图书资料,自学并且记下笔记。
很多细节留作以后自己做项目时再研究,这样能更高效一些。
python基础自学笔记
基本输入和输出
pthon3.0用input提示用户输入,用print提示用户输出,格式为print(“…”)
如果格式化输出,那么格式为print("%d" %(变量名))
, %d可以替换为%s等其他格式符
,以后用到什么格式自己查,这样学起来高效。
简单的例子:
1 | #-*-coding:utf-8-*- |
这是汇编语言基础最后一篇,以后还会更新更高级的汇编知识,并且这部分知识会应用到逆向编程的环节,这一章介绍汇编基础–机器指令。
一个16比特位的汇编指令
:
opcode操作码占用3个比特位,可以表示2的3次方为8种操作
寄存器占用2个比特位,可表示2的2次方为4种可用寄存器
地址空间为2的11次方为2048个可能的内存单元地址可用。
十八、字符串处理
前文介绍过字符串的处理,字符串是byte类型
的数组,现在实现一段代码,将字符串string1数据copy到字符串string2中
代码如下
1 | .data |
通过ecx递减
,将字符串string1每个字符一次copy给string2中,其中用到了ebx基址寄存器
。
也可以通过esi和edi寄存器
1 | .data |
数组
数组的基本表示方法
numary sdword 2,5,7
numary数组中有三个元素,为sdword类型,分别为2,5,7
empary sdword ?, ?,?
empary数组为sdword类型元素,未初始化。
如果数组元素很多可通过
zeroary sdword 100 dup(0)
zeroary数组中有100个0
empary sdword 3 dup(?)
empary 数组中有3个未初始化的sdword类型数据
mov eax, numary+8
; 表示把数组numary第3个元素放入eax中
sdword为四字节,numary+0表示numary首地址,也是第一个元素地址,以此类推,numary+8为第三个元素首地址
。
mov numary+0, eax;
将eax内容放入数组第一个元素中。
除了采用数组首地址+偏移地址方式,可以采用ebx基址寄存器进行数组索引
。
访问numary第三个元素
mov ebx, 8;
ebx存储8
mov eax, numary[ebx];访问numary偏移8字节的元素,也就是第三个元素,放入eax中。
过程
汇编语言的过程
可以被理解为方法
,过程调用采取如下形式
call pname
pname为过程名,call为调用指令
pname过程的格式为
1 | pname proc |
proc 告知编译程序过程pname的开始,endp告诉编译程序过程pname的结束
。ret指令表明何时返回到调用程序中,ret和高级语言return不一样,ret不返回任何值给调用程序。ret是过程中必不可少的调用指令。
举个过程的实例:
1 | sample proc |