文本编辑器:TeraPad、Notepad++、UltraEdit
一、学习笔记
汇编基础
ORG:告诉nask,要把程序装载到内存中的指定地址。
标签:程序入口,用于指定JMP指令程序跳转目的地。(因为标签就是地址)
MOV:寄存器,数据
寄存器,寄存器
寄存器,内存地址
内存地址,寄存器
(还可以指定传输数据的大小,eg:BYTE[AL]、DWORD[AL])
CMP AL,0 ;比较AL和0的大小
JE fin ;不相等就跳转
INT 0X10 ;调用显卡BIOS,INT为软件中断指令。
BIOS中出厂时就装在主板ROM上,包含一些常用的程序。INT就是用于调用这些函数。
BIOS:
HLT:让CPU暂时停止动作,进入待机状态。
内存分布图:
Makefile
目的:自动构建和管理软件项目的文件
文件构成:
目标:依赖项
命令 ;当目标的时间戳早于依赖项的时候才会执行命令
二、汇编语言基础
基础知识
地址总线、数据总线的宽度指的是总线有多少根。地址总线决定能控制多少内存地址、数据总线宽度决定数据传输的速度。
控制总线决定控制设备的数量。
cpu内核-寄存器
1、通用寄存器(16位寄存器)
AX、BX、CX、DX、SP、BP、SI、DI 。为了向下兼容,AX可以分为AH、AL。
2、汇编指令(不区分大小写)
mov add sub
3、
运算器(16位)和寄存器(16位)之间通路是16位。但是8086CPU却可以控制20位物理地址,因为使用2个16位(段地址和偏移地址)合并。
地址加法器:物理地址=段地址×16(数据左移4位)+偏移地址
4、8086CPU有4个段寄存器:CS、DS、SS、ES
a、CS:IP <——> 代码段寄存器:指令指针寄存器 <——> 存放段地址:偏移地址
读取指令过程:先从CS:IP单元读取指令进入指令缓存区,执行指令;然后IP+读取指令的地址;循环执行。
8086CPU开机后先从FFFF:0000这个地址执行指令。
b、修改CS:IP
jmp 段地址:偏移地址 eg:jmp 2AE3:3
只修改IP
jmp ax(类似于 mov IP,ax)
c、debug指令
debug基本命令及全称_double_piga的博客-CSDN博客_debug命令
如何运行debug:Win7 系统下进入Debug_reg183的博客-CSDN博客_win7进入debug
寄存器与内存访问
3.1 DS和[address]
DS寄存器:数据段寄存器。在mov AL,[0]语句中默认加入[DS:0]。
注意:8086不允许数据直接送入段寄存器,只能先传入通用寄存器。
3.2 栈
LOFP:后进先出。栈顶。
push ax:将寄存器ax中的数据送入栈中;(8086以字为单位,1个字2字节)
pop ax:从栈顶取出数据送入ax。
CPU如何知道哪里是栈:
段寄存器SS:存放栈顶的段地址
SP:存放栈顶的偏移地址
注意:出栈以后,并没有删除数据,只是移动了栈顶。
3.3 push和pop指令
push和pop指令可以寄存器和内存(栈)之间传送数据。
栈是内存空间的一部分,只是访问方式特殊。
注意:8086只记录栈顶;栈只需要增加SP,有一个最大允许偏移量。
理解程序过程
4.1 过程
源文件----->编译(MASM.EXE)---->目标文件(obj二进制文件)----->连接(LINK.exe多个目标文件或库文件)----->可执行文件
可执行文件包含:程序和数据、相关的描述信息。操作系统依照可执行文件的描述信息将可执行文件中的机器码和数据架加载入内存。
shell:操作系统提供的用于与其交互的软件。例如:command。
4.2 伪指令
伪指令可以告诉编译器如何编译汇编代码。伪指没有对应的机器码。
4.3 源程序
assume cs:codesg
codesg segment
start:汇编语言
codesg end
end start
exe文件中的程序加载在内存中会有:PSP(256字节)+程序两部分。
注意:一个程序必须由另一个程序加载至内存中,比如1.exe文件由command.exe加载进内存中,执行结束后返回command.exe