Remember 记忆
理解部分
计算机语言
语言即由符号组成,搭配表达各种意思,而计算机语言的符号搭配表示计算机的各种命令,再转换成电平脉冲信号形式用来控制操作计算机
例如:mov bx ax 是汇编语言的符号搭配而成,表示控制8086CPU把寄存器BX的数据送到AX的命令,mov bx ax以其二进制形式存储在计算机中,再通过编译软件翻译成对应的二进制机器语言1000100111011000,而数据在电脑中是以脉冲形式传递,0代表低,1代表高,就这样向8086CPU的16个输入端口,同时输入高低为1000100111011000(1代表高0代表低)的电平电脉冲,就能控制8086CPU把寄存器BX的数据送到AX
电脑工作原理
CPU与计算机的所有存储器(内存,显卡缓存,声卡缓存等)连接,并通过地址,控制,数据总线对其进行读取
内存地址空间
计算机所有内存单元的集合必须小于最大内存地址空间,2的n(地址总线宽度)次方
段地址
用两个地址(16*2)来指出要寻找的地址的一种方法,从而使寻址范围更广,但收地址总线宽度的约束
起始地址=段地址*16
内存地址=起始地址+编译地址
指令的寻址执行过程
questionOne:从内存读取指令时,如何知道所读取指令的长度,并按照这个长度从内存读取相应个数的储存单元
代码段
cs:ip指向
数据段
[address]指向
栈(stack):
ss:sp 指向
字单元
两个内存单元
程序返回
Start的意义
设置代码段的编译地址,并通过编译存储在执行文件的描述信息中
ASCII码
doc中EXE文件的加载过程
记忆部分
语法
'...........' 以字符形式给出数据的形式
[bx+5]=5[bx]
bx:[40H]表示内存单元的数据
汇编指令
mov
mov ip/sp/ax,数据
mov [0],cx
mov ds,cx
mov cx,ds
-----------
mov ax,stack //段名相当于段地址
mov ss,ax
mov sp,12 //设置栈顶ss:sp指向 stack:12
------------
数据只能和寄存器,或偏移地址
jmp 45:3a09 //执行后 cs=0045H ip=3a09H,
jmp ax //ip=ax
add
sub
pop
push
s: .....
loop s // loop 标号,cx中存放循环次数
inc +1
dw :在内存写入数据
and al,01000000B:可将操作对象相应位设为0
or al,01000000B:可将操作对象相应位设为1
db '.....':定义字节数据与dw差不多
伪的:
段声明
name segment
assume cs/ds/ss:name // 指示该段是什么段
.................数据..................
start: ......................................... //start 处 cs地址
.................代码................
.........................................
mov ax,4c00
int 21H //程序返回
name ends
end start//总程序结束标志,表示程序入口为start:
汇编debug调试指令
20多个 常用的有:
R 查看改变CPU寄存器的内容
D 查看内存内容
E 改写内存内容
U 将内存中的机器指令翻译成汇编指令
T 执行一条机器指令
A 以汇编格式在内存中写入一条机器指令
Q退出
详细:
r:查看现寄存器状态
r ax:修改ax寄存器内容,IP cs也可以修改
d:列出内存中预示/续后地址的内容
d 起始地址(段地址:偏移地址):查指定地址开始的16*8个内存单元的内容
d 起始地址(段地址:偏移地址) 结尾偏移地址:指定范围查看内存单元
e 起始地址(段地址:偏移地址):带提示地修改内容
e 起始地址(段地址:偏移地址) 数据 数据 ...n个...:修改从指定地址开始的n个内存单元
u 起始地址(段地址:偏移地址):显示从这点地址开始的16行汇编指令与相应的数据形式
t:执行CS:IP指定的命令
a起始地址(段地址:偏移地址):从这点地址开始带提示的以汇编指令形式吧写入内存单元
调试编译过程
1.写好源程序保存成asm后缀
2.用dos运行masm或masm 文件名.asm,编译生成包含机器码的目标文件obj
obj 生成文件的格式
lst 列表文件,生成文件时的中间结果,不需要就直接按回车
chf 交叉引用文件名,一样是中间结果
3.用link连接系统生成可执行文件(.exe)
map 映像文件中间结果
lib 要调用到得库文件
通用寄存器
AX(AH,AL),BX,
CX:存放loop 循环次数
DX
段寄存器
CS : CS:IP指向代码执行的地址
DS : [address] = ds:address 处的数据,只能 mov ds ax
SS:sp 栈顶
ES
其它寄存器
SI DI:与bx类型的寄存器,不能分成两个八位寄存器来用
内存物理地址的表示
段地址(16):编译地址(16)
程序载入时寄存器的状态
cx中存放程序的长度
ds程序所在内存区的段地址
程序从 ds-10 段开始,因为前面有psp区占据256(100h)字节
注意
指令两个操作数的位数应该一致
写入内存的数据顺序相反,因为书写是从高到低,43(高8位)21(低8位)H,而内存中是从低到高,2143
[数据]在源文件中被认为是直接的数据,而在debug中被认为是ds:数据单元的数据
所以在源代码中指定单元数据的方法有[bx],ds/cs/ss/es(段前缀):[0],
安全的内存空间:0:200~0:300
要把数据,代码,栈写到不同的的段里面
可以用内存单元来当寄存器,变量的作用
一般我们使用栈来暂存数据
使用P命令执行int 21
dw 一个2字节
db 一个1字节
寄存器:ax,bx,cx,dx,ah,al,bh,bl,ch,cl,dh,dl,sp,bp,si,di
段寄存器:ds,ss,cs,es
可以[寄存器]寻址的有:bx,si,di,bp,组合寻址:bx+si,bx+di,bp+si,bp+di,bx默认段地址在ds,bp默认段地址在ss
Learn&Use 学用
配置环境
MASM5:汇编常用工具的集合,包括link.exe及masm.exe
http://www.programfan.com/showdown.asp?id=171
编辑器下载
http://www.duote.com/soft/4230.html