汇编语言知识大全.docx
《汇编语言知识大全.docx》由会员分享,可在线阅读,更多相关《汇编语言知识大全.docx(14页珍藏版)》请在冰豆网上搜索。
汇编语言知识大全
第一章根底知识:
一.机器码:
1.计算机只认识0,1两种状态。
而机器码只能由0,1组成。
故机器码相当难认,故产生了汇编语言。
2.其中汇编由三类指令形成:
汇编指令〔有机器码对应〕,伪指令,其他符号〔编译的时候有用〕。
每一总CPU都有自己的指令集;注意学习的侧重点。
二.存储器:
1.存储单元中数据和指令没任何差异。
2.存储单元:
Eg:
128个储存单元〔0~127〕128byte。
//1字节=1B=1byte=8bit
条件反射:
1存储单元=1B=8个2进制;以后的ax,cs之类的占两个存储单元,
ah之类的占一个
3.CPU对存储器的读写:
地址信息+控制信息+数据信息
三.总线:
1.地址总线:
寻址用,参数〔宽度〕为N根,那么可以寻到2^N个内存单元。
//因为一根总线只能表示0,1,N根的话可以表示2^N
2.数据总线:
传送数据用,参数为N根,一次可以传送N/8个存储单元。
3.控制总线:
cpu对元器件的控制能力。
越多控制力越强。
四.内存地址空间:
1.由地址总线决定大小。
2.主板:
cpu和核心器件〔或接口卡〕用地址总线,数据总线,控制总
线连接起来。
3.接口卡:
由于cpu不能直接控制外设,需通过接口卡间接控制。
4.各类存储器芯片:
RAM,BIOS〔主板,各芯片〕的ROM,接卡槽的
RAM
CPU在操控他们的时候,把他们都当作内存来对待,把他们总的看作一个由
假设干个存储单元组成的逻辑存储器,即我们所说的内存地址空间。
自己的一点理解:
CPU对内存的操作是一样的,但是在cpu,内存,芯片之间的硬件本身所牵扯的线是不同的。
所以一些地址的功能是对应一些芯片的。
第二章存放器
引入:
CPU中含有运算器,存放器,控制器〔由内部总线连接〕。
而存放器是可以用来指令读写的部件。
8086有14个存放器〔都是16位,2个存储空间〕。
一.通用存放器〔ax,bx,cx,dx〕,16位,可以分为上下位
注意1.范围:
16位的2^16-1,8位的2^8-1
2.进行数据传送或运算时要注意位数对应,否那么会报错
二.字:
1.1个字==2个字节。
2.在存放器中的存储:
0x高位字节低位字节;单元认定的是低单元
数制,16进制h,2进制b
三.20根数据总线的16位cpu--8086给出物理地址的方法:
1.20根数据总线〔稍外〕:
寻址能力为1M
2.16位的cpu〔内部〕:
一次能处理的数据位2^16。
3.方法:
物理地址=段地址*16+偏移地址 ;*16==左移四位
2.一个段的长度最长为64K;因为偏移地址为16位,寻址能力为64K
五.回到存放器--段存放器〔cs,ds,ss,es〕
1.cs〔代码段存放器〕,ip〔指针指令存放器〕;cs为存放指令的段地址
2.cpu中cs,p的运作过程:
先将两个16位的数通过地址加法器变成一个20位的地址,通过输入输出控制电路,寻址并返回给cpu指令。
ip自动增加。
执行指令。
next。
。
。
3.修改cs;ip:
mov不行,jmp行。
形为:
jmpcs:
ip或者jmpip〔通用存放器〕;转移指令修改ip
六.代码段:
2.存放后用cs,ip指向第一条指令的首地址。
第三章还是存放器
一.内存中字的存储:
因为字〔2个存储单位〕要存在两个字节当中。
运用mov等指令时,指向的是低字节。
二.DS和[address]
1.[]中放的是偏移地址,默认段地址是ds。
2.段地址的移入:
要通过通用存放器。
三.movaddsub〔减〕指令
除了处理[]内存可以位数可以不对应,其他都要。
五.栈
1.概念:
FILO,以字为单位。
2.栈顶的单元为低,栈底的单元较高。
3.ss〔段存放器〕:
sp〔存放器〕:
任意时刻指向栈顶。
4.push进栈:
sp-2mov;pop出栈:
,movsp+25.栈的最大容量为64K,超出覆盖
注意初始化的时候栈顶的指向是栈底+1。
入出栈最易出错
第四章第一个程序
一.源程序的架构:
开头:
assume〔假设〕cs:
xxx
中间:
xxxsegment〔段〕
…………
程序返回:
movax,4c00h
int21h
xxxends
结束:
end
下载masm,运行cmd,找到目录,masm文件名,link文件名,文件名
。
第五章[bx]和loop
一.[bx]
1.Q:
为什么是bx,ax,cx,dx行不行?
A:
不行
用debug的a指令试试看。
〔参考实验一〕
可以理解为bx特有的功能,和后面与loop配套使用的cx一样。
1.与ax对应使用,当cx不为0时,一直循环。
在loop指令前,一定要把循环次数mov进cx。
在循环里面,执行完会subcx,1,再判断ax是否为0,执行跳出或者循环。
三.loop和[bx]联合使用
1.通过改变bx值可以操作连续的一段空间。
第六章包含多个段的函数
引入:
使用一:
在代码段中使用数据
1.先将数据储存到一段连续的内存空间中〔由系统分配〕,用loop和[]来读写这些数据。
2.start:
跳过数据存储的地方,指令开始的地方。
使用二:
在代码段中使用
1.先dw要用的空间,栈空是sp为dw的个数*2-2;
正文:
将数据、代码、栈放入不同的段中
assumecs:
code,ds:
data,ss:
stack ;先联系起来
datasegment
dw
dataend
stacksegment
dw
stackend
codesegment
movax,stack
movss,stack
movsp,ffh ;栈地址放到栈段
movax,data
movds,ax ;数据地址放到数据段
;核心程序
;核心程序
codeend
end
第七章更加灵活的定位内存地址的方法
引入:
1.add和or:
操作对象是位〔bit〕。
2.关于ASCII码:
占一个字节〔byte〕
3.以字符给出数据‘xxx'每一个x占一个字节。
在程序时可直接看成一个或一排连续的ASCII码。
4.综合使用:
大小写互换。
正文:
1.[bx+idata]:
偏移地址为〔bx〕+idata;疑问:
为什么不是〔〔bx〕+idata〕自己理解:
可能是bx是一个存放器,其中的值用〔〕表示,
;这样已经完成了存放器到数值的转换了
[bx]:
偏移地址为〔bx〕
用idata[bx]进行数值的应用
2.si和di:
si和di是和bx相似的8位存放器。
;bx被占领使用时应该考虑到这个。
3.[bx+si+idata]各种组合都是行的
第八章数据处理的两个根本问题
一.处理的数据在什么地方?
机器指令处理的数据在什么地方?
内存,CPU,指令缓冲器
汇编语言中数据位置的表达。
内存〔[]〕,CPU(ax),指令缓冲器
(1)
寻址:
直接寻址 ;EA=idata
存放器间接寻址 ;EA=〔ax〕
存放器相对寻址 ;EA=(ax)+idata
基址变址寻址;EA=(ax)+(si)
相对基址变址寻址;EA=(ax)+〔si〕+idata
;原来di对应的是ds;si对应的是ss。
二.指令要处理的数据有多长?
ax之类的两个字节,al之类的一个字节
在没有汇编的情况下,用操作符Xptr指明内存单元中的长度,X在汇编中可以为byte或word。
dd伪指令
dup
第九章转移指令的原理
一.操作符offset:
编译时标号处取偏移地址用
1.根据位移进行转移的jmp指令jmpshort标号;功能是IP=IP+8位位移
2.转移的目的地址在指令中的jmp指令jmpfar标号;可以同时修改CS,IP
3.转移地址在存放器的jmp指令:
jmp16位reg功能:
〔ip)=(reg)
4.转移地址在内存中的jmp指令:
jmpwordptr内存单元地址〔段内转移〕 ;〔ip〕=〔内存单元地址〕
jmpdwordptr内存单元地址〔段间转移〕 ;〔ip〕=〔内存单元地址〕〔cs〕=〔内存单元地址+2〕
三.jcxz指令
当cx不为0时,跳转到jcxz标号位置。
if〔〔cx〕==0〕jmpshort标号
第十章CALL和RET指令
一.ret〔近转移〕:
popip
retf〔远转移〕:
popip
popcs
使用前要先进栈。
retff的先pushcs再puship
ip进栈保存,改动ip跳转,执行;注意进栈时地ip是call之后的一条
1.call标号是 相当于进行:
puship ;根据位移〔段内转移〕
jmpnearptr标号
2.callfarptr标号 相当于进行:
pushcs ;段间转移
puship
jmpfarptr 标号
3.call16位reg 相当于进行:
puship
jmpreg
4.callwordptr内存单元地址
calldwordptr内存单元地址
call是进栈调用后用ret返回
mov8位reg或者内存字节单元中;另一个乘数默认放在al,其中结果放在ax中。
mov16位reg或者内存字单元中;另一个乘数默认放在ax,其中结果高位在dx,低位在ax
1.参数和结果的传递〔通过存放器〕
2.多个数据的传递〔在字符串中在内存中的首地址放到存放器〕
3.存放器冲突问题:
在子函数中进去前把存放器进栈,返回主函数时在出栈〔注意顺序〕
第十一章标志存放器
标志存放器的作用:
1.用来储存相关的某些指令的执行结果;
其他存放器合起来存放数据的,而标志存放器是按位起作用的。
一.ZF标志 Zfor零;结果不为0 他为0
二.PF标志 Pfor奇偶;1的个数为奇他为0
三.SF标志 Sfor负;结果为非负 他为0
四.CF标志 Cfor无符号溢出;没溢出他为0
五.OF标志 Oforout;
六.adc指令〔带进位加法指令〕
adc操作对象1,操作对象2
功能:
操作对象1=操作对象1+操作对象2+CF ;比add多加了个CF
作用:
七.sbb指令:
〔带借位减法指令〕
sbb操作对象1,操作对象2
功能:
操作对象1=操作对象1-操作对象2-CF ;比sub多加了个CF
八p指令〔对上述各种标志位的应用〕:
cmp操作对象1,操作对象2
功能:
相当于sub指令,只是不保存运算完之后的结果,只是影响标志存放器的各位〔〕
九.检测比拟结果的条件转移指令jcxz
转移是修改IP
条件是满足一定条件才执行转移指令
检测是什么呢?
第十二章内中段
中断类型码为一个字节,可以表示256种中断信息的来源。
中断处理程序。
;cpu的设计者必须在中断信息和其处理程序的入口地址之间建立某种联系。
中断向量表
cpu用8位的中断类型码通过中断向量表找到相应的中断处理函数的入口。
中断向量表是存放着中断处理程序入口地址的列表。
一个表项存放一个中断向量,也就是一个中断处理函数的入口地址,所以一个表项占两个字节。
高字节存放段地址,低字节存放偏移地址。
3.TF=0IF=0
4.pushCS
5.pushIP
6.(IP)=(4*N),(CS)=〔4*N〕+2
四.除法错误中断(o号中断)的处理
;当除法溢出的时候,产生中断信息
编写中断处理程序d0
可以将do0传送到内存0000:
0200〔之后的256字节为空〕
将do0的入口地址0000:
0200存储在中断向量表0号中
中断被执行的过程:
先将中段处理程序加载到内存当中,然后再复制到内存单元为0:
200的地址当中,最后最在中断向量表0号中填入do0的入口中地址0:
200
具体编程:
1.设置ds,si指向源地址:
movax,cs
movds,ax
movsi,offsetdo0
2.设置es,di指向目的地址:
movax,0
moves,ax
movdi,200h
3.设置cx为传输长度:
movcx,offsetdo0end-offsetdo0
4.设置传输方为正:
cld
5.确定信息:
repmovsb
如果中断中有数据要处理的话,可以存放到do0函数中,用jmp跳转到do0start,数据在jmp之后的内存位置中,确保不被用到。
movax,0
moves,ax
movwordptres:
[0*4],200h
movwordptres:
[0*4+2],0
第十三章int指令
一.int指令
功能是能引发中断
取中断类型码n
标志存放器入栈:
IF=0,TF=0
CS,IP入栈
〔IP〕=(n*4) (CS)=(n*4+2)
int和iret的使用类似于call和ret
三.对in,iret和栈的深入理解
暂时不了解
第十四章端口
。
。
。
第十五章外中断
PC机键盘的处理过程
键盘的输入
60h端口
a的通码/扫描码:
1e断码=通码+80h
引发9号中断
假设IF=1,响应中断
执行int9中断例程
读出60h端口中的扫描码
如是字符型的将扫描码和对应的ASCII码送入内存中的BIOS键盘缓冲区
如果是控制键或切换键,那么将其转换为状态字节写入内存中存储状态字节的单元
编写int9中断例程
键盘输入的处理过程:
键盘产生扫描码--扫描码送入60h端口--引发9号中断--CPU执行int9中断例程处理键盘输入
从端口60h读出键盘的输入 inal,60h
调用BIOS的int9中断例程
要先将原来的存放中断入口地址的单元储存在另外的空间中
pushes:
[9*4]
popds:
[0]
pushes:
[9*4+2]
popds:
[2]
在中断向量表中设置新的int9中断入口程序的地址
movwordptres:
[9*4],offsetint9
moves:
[9*4+2],cs
新的中断程序中要
相关存放器进栈
读端口inal,60h
对int指令进行模拟,调用原来的int9中断例程