汇编1-进制、数据宽度、通用寄存器、汇编指令、内存寻址

汇编1-进制、数据宽度、通用寄存器、汇编指令、内存寻址

系统学习一下免杀,纯属个人笔记。禁止搬运。课是别人的,要删联系我即可。刚考完就火急火燎的来学免杀了,感觉还是网安好啊,正反馈十足,考研这b东西,真恼火。唉,也不知道考得上不这次。

首先记录一些杂七杂八的东西

杂项

位数的知识扩展

比如一个计算机的位数是4,那他的数据宽度就只能存0000-1111(二进制)这么多。也就是0-15

那么以此类推,32位的系统的数据宽度也能算出来。

通用寄存器

image-20231227223714089

哎哟有水印,我这个知识个人笔记哈,这一篇的内容反正百度也能拿到的。

vs的一些基础小用

比如说你要看c语言的代码的反汇编,先下个断点,然后直接运行,右键进入反汇编即可

image-20230915201659763

image-20230915201843667

od

单步走是按f8

od中,改变的寄存器或者说是数据,会变成红色

汇编指令

mov

mov 把后面的参数覆盖掉前面指定的寄存器中去(前后的寄存器的数据宽度必须是一样的,而如果后面的参数是数据的话,那么只会取后8位的数据放到前面的寄存器中去)

image-20230915203822481

image-20231227224752974

add

两个参数,参数相加之后,放到第一个参数的寄存器里面去,这里的寄存器记得也要保持位数相同。

image-20231227230452727

sub

这就是相减了

image-20231227230512866

and

这个就是位运算了,会对每一位都进行运算,

image-20231227231146757

就像这样,有0则全为0,全是1则是1.

image-20231227231228499

这里值得注意的是,od里面的数都是十六进制的哈,而位运算都是基于二进制算的。举个栗子,0x6和0x9进行运算,那就是0110和1001进行运算,那结果就是0.

or

同and,只不过是或的关系。

xor

那异或呢

如果a、b两个值不相同,则异或结果为1。如果a、b两个值相同,异或结果为0。

not

就是取非,1变成0,0变成1。

内存寻址

基础指令-取(改)内存里面的值

嘿嘿我的网安,我爱网安。

寄存器是存在于cpu里面的,所以运算速度相比内存来说,就很快。但是cpu的空间不够,

image-20231227233542844

这里值得注意点的是,ESP EBP这两个是存储内存地址的(和堆栈有关),而EAX ECX EDX EBX这四个基本上使用来存储十六进制数据的。acdb,数据的存储数据基本是按照这个顺序存入的。

byte是1字节,8bit。
word是1字,16bit
dword 双字,32bit
qword 64bit

在计算机里面每个字节都有一个编号,这里可以认为内存的编号就是字节,在32位下范围为00000000-FFFFFFFF,最大的殉职范围就是FFFFFFFF+1字节,转换过来就是4G

image-20231227234612416

这时候咱们就举个栗子比如说,我们要将一个8位的通用寄存器里面的内容放到一个8位的内存中去mov m8 r8

mov byte ptr ds:[0x19FF74],al
mov dword ptr ds:[0x19FF74],eax

其中,byte和dword是单位嘛,就是指几位。
而ptr是一个关键字,表示指针,表示后面这个ds:[0x19FF74]是个指针
而ds:[0x19FF74]则是一个内存地址ds 是data segment register,即数据段寄存器。
这里值得注意的是,中括号括起来的东西是一个内存地址,而不是立即数。

lea

这个指令是寻找内存地址的意思,lea eax,dword ptr ds:[ecx]是取ecx的地址(和c语言的指针差不多)

栗子

image-20231228002134442

第一行,把后面的立即数存到ecx寄存器中
第二行,把ecx存的立即数作为地址,将这个地址中的内容存到eax里面去。
第三行,把立即数存到edx寄存器中
第四行,把后面的立即数存到edx存的地址所指向的内存中去
第五行,表示取edx存的地址,存到eax寄存器中去
第六行,表示讲edx寄存器所指向的内存中存的东西,存到eax中区

(课里面有个好厉害的师傅,感觉什么都能想到,举一反三,我感觉啥也不懂一样像个呆瓜捏。)慢慢学把,加油捏。


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。后续可能会有评论区,不过也可以在github联系我。