学习汇编之前,除了要掌握常用的汇编指令之外,还需要掌握CPU寄存器(CPU用来存储数据的地方),内存,32位CPU和64位CPU,32位是指CPU一次能处理的最大位数(bit,计算机语言叫做位,就是常见的0和1)。64位只是在32位的基础上,增加了一些CPU寄存器和一些汇编指令,别的差别不是很大。
我们知道32位CPU的寄存器或者内存,可以存放8位 16位 32位数据宽度(你也可以理解成数据类型,比如int char double float等等)的数据,超过32位的数据宽度,CPU就会丢弃掉。
一,寄存器
常见的寄存器有如下几种,当然还有很多没有列出的

但是EIP寄存器是不能够这样的,它不是通用寄存器,它只能存储CPU下一步要执行的指令。
这些指令的书写格式都是在DTDebug编译器(windows系统下的一个编写汇编代码的工具)下面的,如果是在MAC下编写,就需要用到DosBox这个工具,还需要一些配置。
首先要认识的是MOV指令,作用是用来移动数据。例如,向寄存器EAX存储一个值,就可以这样mov eax,1,把寄存器eax的值存到寄存器ebx,就可以这样mov ebx,eax

数据在计算机中是以十六进制的形式存放的,比如-1,寄存器或者内存里面存放的是0xFF即是1111 1111如果存放在32位的寄存器或者内存中就是0x0000 00FF存放在16位的寄存器或者内存中就是0x00FF存放在8位的寄存器或者内存中就是0xFF。 32位的除了可以存放数据宽度是32位的之外,还可以存储数据宽度是16位的数据,只是占用了32位的后16位,存储数据宽度是8位的数据,只是占用了32位的后8位或者16位的后8位。
EAX寄存器是32位的,AX寄存器使用了EAX寄存器的后16位,但是AL,AH就没有这么简单了,比如eax寄存器存放的值是FFFFFFFF就是-1,如果执行mov ax,1那么结果就是FFFF0001,如果执行执行mov ax,16,那么结果就是FFFF0010,如果执行mov al,1,那么结果就是FFFFFF01,如果执行mov ah,1结果就是FFFF01FF,从而可以看出AL和AH的区别。
如果执行mov bx,bl或者mov bl,bx都是不错的,因为bx是16位的,bl是八位的。
二,内存


1个字节就是1B有8位,1KB包含1024个字节,1MB包含1024个KB,1GB包含1024个MB,那么程序中所说的4G虚拟内存就是4*1024*1024*1024*8就是这么多个位(0和1)。


那么为什么每个进程都有4G的虚拟内存呢,这是因为内存地址十六进制的形式表示,16进制所表示的最大数是0xFFFF FFFF,所以总共有0x1 0000 0000(0x0000 0000+0x0000 0001到0xFFFF FFFF)个8位空间的内存,也就是总共有0x8 0000 0000个位(0和1),十六进制的8 0000 0000等于十进制的34359738368,也就是有34359738368个位(bit),除以1024就是多少个字节(byte),再除以1024是多少KB,再除以1024是多少MB,再除以1024是多少GB,最后是4,所以32位的计算机,每个进程都有4G的虚拟内存大小。
比如把1写到内存中,汇编指令是mov byte ptr ds:[已经申请的内存地址编号]. 1,这个汇编指令的意思就是把数据宽度是1个字节的数据1存放到内存地址是中括号里面的地址的内存里面。注意数据宽度的不同,往内存写数据写法也不同,比如double是8个字节,那么汇编指令就是mov dword ptr ds:[已经申请的内存编号].2.22,这个汇编指令的意思就是把数据宽度是8个字节的数据2.22放到内存地址是中括号里面的地址的内存里面。
网友评论