一、zip的坑
zip()函数接收多个可迭代数列,将数列中的元素重新组合,在3.0中返回迭代器指向
数列首地址,在3.0以下版本返回List类型的列表数列。我用的是3.5版本python,
所以zip返回的是指向地址。
先看几个例子
通过前文介绍,大体上可以用学过的知识做一些东西了。
这里简单介绍下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 |
数字在计算机中以二进制存储,每个位数字为0或者1,当两个二进制数字进行逻辑按位&
,逻辑按位|
,逻辑异或^操作
,
可以采用汇编语言提供的逻辑运算指令and
,or
, xor
,not
等指令。
and指令:
C语言&操作,将0110&1101得出结果为0100
C语言代码为
1 | if(flag & maskit) |
汇编语言高级指令可实现:
1 | mov eax, flag |
不采用高级指令的情况下可采用如下代码:
1 | if01: mov eax, flag |
if-then结构
C语言版本
1 | if(count == 10) |
MASM汇编
1 | .if count==10 |
cmp指令,该指令用于比较两个参数大小
cmp mem, imm
比较内存mem和立即数imm大小
cmp reg, imm
比较寄存器reg和立即数imm大小
cmp reg, mem
比较寄存器reg和内存mem大小
cmp mem, reg
比较内存mem和寄存器reg大小
cmp imm, reg
比较立即数和寄存器reg大小
cmp imm, mem
比较立即数和内存mem大小
cmp reg, reg
比较两个寄存器数据大小
.if 内部是通过cmp实现的,.if和cmp都不能比较两个内存中数据大小