学习汇编的目的
通过学习汇编进行编程,而深入的了解计算机底层的基本工作机理,可以达到随心所欲的控制计算机。在学习的过程中,比如操作系统,编译原理等内容都会影响我们,但是我们只是利用masm等工具进行更好的学习汇编,不要让这些额外的东西分散我们的注意力,要明确我们学习的目的,不要多手抓多手都丢失的厄运!!
第二章知识点
1.物理地址
所有的内存单元构成存储空间是一个一维德线性空间,每一个内存单元在这个空间中都有唯一的地址。
2.16位CPU
运算一次最多可以处理16位数据
寄存器最大宽度为16位
寄存器和运算器之间的通路位16位
3.8086CPU采用一种在内部两个16位地址合成的方法来形成一个20位的物理地址,其中采用了地址加法器,物理地址=段地址*16+偏移地址。
本质含义:CPU在访问内存的时候,用一个基础地址(段地址*16)和一个相对于基础地址的偏移地址相加,给出内存单元的物理地址。
4.段地址
其实在内存中是没有段地址的,在以后的编程中,将若干个地址连续的内存单元看做一个段,用段地址*16来表示基础地址(起始地址),用偏移地址来定义段中的内存单元。要注意的又两点:
段的起始地址一定是16的倍数
段的最大长度为64k
5.段寄存器
CS,DS,SS,ES,其中CS和IP是最关键的寄存器,它们指示了CPU当前要读取指令的地址。
CS为位代码寄存器,IP为指令指针寄存器。位CPU提供所需的执行指令的地址,CS为段地址,IP为偏移地址,经过加法器后,通过20为地址总线到内存中寻找数据,然后通过数据总线放到输入输出控制电器,然后放到指令缓冲器,之后到指令执行器执行。
如何修改CS,IP指令
jmp 段地址:偏移地址,jmp 2AE3:3,说明执行后:CS= 2AE3H,IP=0003H,CPU将从2AE33H处读取指令
如果只想修改IP内容,jmp 某一合法寄存器,如jmp ax
第三章知识点
1.内存中字的存储以字单元来表示,存放一个字型数据(16位)的内存单元,由两个地址连续的内存单元组成,高内存单元存高字节,低内存单元存低字节
2.DS
用来存放访问数据的段地址(可以在mov的指令中给出单元偏移的地址,此时段地址ds是默认的)
3.数据段
将一组长度为N(N<=64k),地址连续的,起始位16的倍数的内存单元当做专门储存数据的内存空间,从而定义了一个数据段。
4.栈顶越界问题
第四章知识点
如何构建第一个程序?
1.伪指令和汇编指令
汇编指令:有对应的机器码的指令,可以被编译为机器指令,最终由CPU来执行
伪指令:没有对应的机器指令,最终不被CPU所执行,由编译器来执行指令,编译器根据伪指令来进行相关的编译工作
assume cs : codesg
codesg segment
mov ax,0123H
mov bx,0456H
add ax,bx
add ax,ax
mov ax,4c00H //代表了程序返回
int 21H //将CPU的控制权交换给使得它的一运行其他的程序
codesg ends
end
从以上这段简单的源码可以看出,伪指令有:***segment…….***ends(一个有效的汇编程序必须的,因为这个代表了一个段,用来存放代码),assume(将有特定用途的段和相关的段寄存器关联起来),end(汇编程序的结束的标志)
2.汇编从写出到执行的过程
编程(edit)—>test.asm-->complie—>test.obj—>link—>test.exe-->load—>the program in memory—>run
第六章知识点
1.程序的框架
assume cs : code
code segment
data //存放数据的地方
start: //指明了程序的入口
codes
code ends
end start
一个简单的数据加法程序
assume cs :code
code segment
dw 0123h , 0456h , 0789h , 0abch , 0defh , 0fedh , 0987h , 0cbah //刚好占了16个空间
dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
start:mov ax , cs
mov ss , ax
mov sp , 30h //设置栈顶ss:sp指向cs:30h
mov bx , 0
mov cx , 8
s: push cs:[bx]
add bx , 2
loop s
mov bx , 0
mov cx , 8
s0: pop cs:[bx]
add bx , 2
loop s0
mov ax , 4c00h
nt 21h
code ends
end starts