汇编基础知识

最近感觉自己学的到了一个瓶颈,学的不知道有多少是记住的,总是感觉自己要学的东西有那么多,时间又太少。专业课也越来越多,花在编程上的时间就少了,但是这毕竟是我的兴趣爱好,所以我不想放弃。昨晚突然有个想法,以后写博客的频率加快,尽管这样博客的质量也就下降了很多,但是我还是觉得博客就是来记录我成长的地方,我该把我的学到的,哪怕是点点滴滴都记录下来,呵呵,不知道能坚持多久。

不久前看拿起了王爽老师的汇编语言看了看,觉得确实写的不错,当时因为都是基本的语法,我就看看就过去了。不过这些天发现突然很多都忘记了,所以写点东西来记录下。

首先是硬件的一些基础知识,cpu要对物理内存操作总得最起码要知道1,所操作的地址2.操作的数据3.操作的指令。所以cpu有地址总线(传地址的),有数据总线(传数据的),有控制总线(传命令的)。先是地址总线,一个cpu有N根地址线,寻址范围就是2^N次。数据总线也是一样的道理,传输数据都是最大是2^N。8086cpu有20位地址总线,寻址能力是0~1M,但是数据总线是16位,就是只能传输数据0~64K,为了可持续发展,所以就想出了,两个16位地址通过一个特殊的加法器来算出一个20的地址,这就是所谓的段+偏移。具体算法:物理地址
= (段地址 * 16 + 偏移量)。16 = 0x10,其实就相当于是把段地址变成了20位和偏移量相加得出20位的物理地址。段+偏移的思想在我们日常生活中随处可见,比如时钟啊,过了60s加相当于过了一分钟····

再是一些汇编的基础知识:

字节(byte):8个bit。

字(word):2个byte,16个bit。

双字(dword):4个byte,32bit。

8086cpu通用寄存器:AX,BX,CX,DX都是16bit,一次存放两个字节。为了与上一代8位的寄存器兼容,所以在通用寄存器里面又分出高位寄存器和地位寄存器。

这个应该写程序就可以实现的吧。比如AX,由AH:高8位;AL:低8位构成。

CS和IP也是两个寄存器,CS是段寄存器,IP是指针寄存器。CS:IP里面存的就是CPU要执行的下一条指令。任意时刻,cpu要执行的地址 = (cs*16 + ip)。

DS寄存器,cpu要读写一个内存单元的时候,必须先给出这个内存单元的地址。内存地址就是由段地址+偏移地址组成的。

mov 指令

1.从数据送到寄存器,mov ax,1000h。 (ax) = 1000h。()就相当于里面的内容

2.将寄存器的内容送到另一个寄存器中,mov bx,ax。

3.将一个内存单元内字送到寄存器。mox ax,[0]。[]里面表示偏移地址,段地址默认在ds中,cpu自动从ds中提取。

4.mov [bx],ax 将ax中存放的数据放到偏移量是bx的内存单元中。((ds)*16+(bx)) = (ax)。

下面是我从网上找来的一些基本的汇编指令,就当作手册

一、数据传输指令
MOV        传送字或字节
PUSH       把字压入堆栈
POP        把字弹出堆栈
PUSHA      把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈
POPA       把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈
PUSHAD     把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈
POPAD      把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈
PUSHF      标志入栈
POPF       标志出栈
LEA        装入有效地址
LDS        传送目标指针,把指针内容装入DS
LES        传送目标指针,把指针内容装入ES
LAHF       标志寄存器传送,把标志装入AH
SAHF       标志寄存器传送,把AH内容装入标志寄存器
二、算术运算指令
ADD        加法
ADC        带进位加法
INC        加 1
SUB        减法
SBB        带借位减法
DEC        减 1
NEC        求相反数(以 0 减之)
CMP        比较(两操作数作减法,仅修改标志位,不回送结果)
MUL        无符号乘法
IMUL       整数乘法
DIV        无符号除法
IDIV       整数除法
三、逻辑运算指令
OR         或运算
AND        与运算
XOR        异或运算
NOT        取反
TEST       测试,两操作数作与运算,仅修改标志位,不回送结果
SHL        逻辑左移
SHR        逻辑右移
ROL        循环左移
ROR        循环右移
RCL        通过进位的循环左移
RCR        通过进位的循环右移
四、串指令
MOVSX      先符号扩展,再传送
MOVZX      先零扩展,再传送
MOVS       串传送
CMPS       串比较
五、程序转移指令
JMP        无条件转移指令
CALL       过程调用
RET        过程返回
JG/JNLE    大于转移
JGE/JNL    大于或等于转移
JL/JNGE    小于转移
JLE/JNG    小于或等于转移
JE/JZ      等于转移
JNE/JNZ    不等于时转移
LOOP       CX不为零时循环.

标签:Assemble