王爽汇编语言学习笔记文档格式.docx
《王爽汇编语言学习笔记文档格式.docx》由会员分享,可在线阅读,更多相关《王爽汇编语言学习笔记文档格式.docx(8页珍藏版)》请在冰豆网上搜索。
◎8086有四个段寄存器CS、DS、SS、ES
◎CS为代码段寄存器,IP为指令指针寄存器。
任意时刻,设CS中内容为M、IP中内容为N,8086CPU从内存M×
16+N读取一条指令执行
◎不能用mov修改CS、IP,因为8086CPU没有提供这样功能,可用指令JMP段地址:
偏移地址。
JMP2AE3:
3JMPAX修改IP
第三章寄存器(内存访问
◎DS数据段寄存器。
不能将数据直接送入段寄存器,所以『MOVDS,1』不正确
◎字在存储时要两个连续的内存单元,低位在低地址,高位在高地址
◎[address]表示一个偏移地址为address的内存单元
◎SS:
SP指向栈顶元素
◎PUSHAX:
(1SP=SP-2;
(2AX送入SS:
SP
◎POPAX:
(1SS:
SP送入AX;
(2SP=SP+2
◎PUSH/POP寄存器
PUSH/POP段寄存器
PUSH/POP内存单元
第四章第1个程序
◎可执行文件包含两部分:
程序和数据,相关的描述信息
◎程序加载后,ds中存放这程序所在内存区的段地址,这个内存区的偏移地址为0,策程序所在的内存区的地址为ds:
0;
这个内存区的前256个字节中存放的是PSP,dos用来和程序进行通信。
从256字节处向后的空间存放的是程序。
第五章[BX]和loop指令
◎[BX]表示一个内存单元,它的段地址在ds中,偏移地址在bx中。
MOVAX,[BX]MOVAL,[BX]MOV[BX],AX
◎loop要进行两步操作,CX=CX-1;
判断cx中值,不为零则转至标号处执行程序,为零则向下执行。
◎masm将指令movax,[0]当作movax,0处理
解决方法可以为movbx,0使用寄存器
movax,[bx]
或movax,ds:
[0]直接给出段地址所在的段寄存器
◎loop中不可使用mov[cx],cx
第六章包含多个段的程序
◎dw定义字型数据
◎end标号定义程序入口点
◎定义多个段,同定义代码段相同。
定义仅仅是为了程序阅读方便
◎assumecs:
code,ds:
data,ss:
stack是伪指令,将定义的具有一定用途的段和相关的寄存器联系起来
◎对于段,如果数据占N个字节,则程序加载后实际占有空间为:
(N/16+1*16,N的16整数
第七章更灵活的定位内存地址的方法
◎and按位与andal,0EFh
◎or按位或oral,20h
◎字母大小写转换:
大写(xx0xxxxxandal,0EFh
小写(xx1xxxxxoral,20h
◎movax,[200+bx]==movax,[bx+200]==movax,200[bx]==movax,[bx].200段地址为ds,偏移地址为bx+200
◎si和di示8086CPU中和bx功能相近的寄存器,si和di不能分成两个8位寄存器来使用◎一般来说,在需要暂存数据的时候,都应该使用栈
第八章数据处理的两个基本问题
◎bx,si,di,bp
1。
在8086CPU中,只有这4个寄存器可以用在[...]中来进行内存单元的寻址
正确:
movax,[bx]|movax,[bp]
错误:
movax,[cx]|movax,[dx]|movax,[ax]|movax,[ds]
2。
在[...]中,这4个寄存器可以单个出现,或只能以四种组合出现:
bx和si、bx和di、bp和si、bp和di
movax,[bx+bp]|movax,[si+di]
3。
只要在[...]中使用寄存器bp,而指令中没有显性地给出段地址,段地址就默认在ss中
movax,[bp]ax=ss*16+bp(取地址值
◎在没有寄存器名存在的情况下,用操作符Xptr指明内存单元的长度,X在汇编指令中可以位word或byte:
movwordptrds:
[0],1|addwordptr[bx],2|incbyteptrds:
[2]
◎div,除法指令div除数
除数8位16位
被除数AXDX->
高16位AX->
低16位
商ALAX
余数AHDX
◎dd伪指令,定义双字dword
◎dup伪指令,用来进行数据的重复
db3dup(0==db0,0,0
db3dup(0,1,2==db0,1,2,0,1,2,0,1,2
db3dup('
ab'
'
CD'
==db'
abCDabCDabCD'
第九章转移指令的原理
◎可以修改ip,或同时修改cs和ip的指令统称为转移指令
◎8086CPU的转移行为有一下几类:
只修改ip时,称为段内转移,如jmpax
同时修改cs和ip时,称为段间转移,如jmpes:
[dx]
由于转移指令对ip的修改范围不同,段内转移又分为:
短转移和近转移
短转移ip的修改范围为-128~127
近转移ip的修改范围为-32768~32767
8086CPU的转移指令分为以下几类:
无条件转移指令(如jmp
条件转移指令
循环指令(如loop
过程
中断
◎offset取得标号的偏移地址
◎jmpshort标号实现段内短转移,对ip的修改范围为-128~127对应机器码中包含转移的位移EB地址
◎jmpnearptr标号实现段内近转移,对ip的修改范围为-32768~32767对应机器码包含转移的位移
◎jmpfarptr标号实现段间转移对应机器码中高地址为段地址,低地址为偏移地址EA偏移地址段地址
◎jmpwordptr内存单元地址(段内转移
◎jmpdwordptr内存单元地址(段间转移
高地址存放目的段地址,低地址存放目的偏移地址
◎jcxz标号cx为0时跳转
所有有条件跳转指令都是短转移,对ip的修改范围都为-128~127
◎loop标号
所有循环指令都是短转移,对ip修改范围都为-128~127
◎80×
25彩色字符显示模式显示缓冲区结构:
内存地址空间中,B8000h~BFFFFFh共32KB的空间,为80×
25彩色显示缓冲区。
向这个地址写入数据,写入的内容将立即出现在显示器上。
在80×
25彩色字符模式下,显示器可以显示25行,每行80个字符,每个字符可以有256种属性。
一个字符在缓冲区占两个字节,一屏内容共占4000个字节。
显示缓冲区分8页,每页4KB,显示器可以显示任意一页的内容,一般显示第0页,即B8000h~B8F9Fh。
在一行中,一个字符占两个字节的存储空间,低位字节存储字符的ASCII码,高位字节存储字符的属性,一行80字符,占160字节
属性字节的格式:
76543210
BL(闪烁RGB(背景IRGB(前景
显示在M行N列的字符为B800:
[160*M+2*N]
第十章call和ret指令
◎ret用栈中数据修改ip,实现近转移
(ip=((ss*16+(sp
(sp=(sp+2
相当于:
POPip
◎retf用栈中数据修改cs和ip,实现远转移
(cs=((ss*16+(sp
POPcs
◎call指令,call指令不能实现短转移,实现转移的方法和假名牌指令原理相同
call标号,段内转移
机器指令中没有转移的目的地址,而是相对于当前ip的转移位移(补码,相当于1.puship2.jmpnearptr标号
callfarptr标号,段间转移
机器指令中包含转移目的地址,相当于1.pushcs2.puship3.jmpfarptr标号
call16位寄存器
相当于1.puship2.jmp16位寄存器,机器指令不包含目的地址
注意:
1.pushipip先变成call后第一个字节的偏移地址,然后入栈
4。
callwordptr内存地址
相当于1.puship2.jmpwordptr内存地址
5。
calldwordptr内存地址
相当于1.pushcs2.puship3.jmpdwordptr内存地址
2.pushipip先变成call后第一个字节的偏移地址,然后入栈
◎mul指令,乘法a×
b
a8位16位
bALAX
结果AX高位DX,低位AX
第十一章标志寄存器
◎11109876420
OFDFIFTFSFZFAFPFCF
◎ZF零标志位,如果运算结果为零,则ZF=1
◎PF奇偶标志位,相关指令执行后,1的个数为偶数PF=1
◎SF符号标志位,执行后,计算结果为负SF=1
◎CF进位标志位,无符号加减发生最高有效位之外的进、接位时CF=1
◎OF溢出标志位,有符号运算发生溢出时CF=1
◎adc带进位加法,adcax,bx==(ax=(ax+(bx+CF
◎sbb带借位减法,sbbax,bx==(ax=(ax-(bx-CF
◎cmp比较指令,相当于减法,但是不保存结果,只影响标志寄存器
cmpax,bx
无符号比较时:
ax==bx,ZF=1
ax<
>
bx,ZF=0
bx,CF=1
ax>
bx,CF=0andZF=0
=bx,CF=1orZF=1
=bx,CF=0
有符号比较时(反向说明cmpah,bh:
SF=0andOF=0,ah>
=bh
SF=0andOF=1,ah<
bh
SF=1andOF=0,ah<
SF=1andOF=1,ah>
◎无符号比较跳转指令
je,ZF=1
jne,ZF=0
jb,CF=1
jnb,CF=0
ja,CF=0andZF=0
jna,CF=1orZF=1
◎DF方向标志位,在串处理指令中,控制每次操作后sidi的增减,DF=1操作后sidi递减使用cld,std设置:
cld,DF=0.std,DF=1
◎movsb将ds:
si内存单元字节送入es:
di
moves:
[di],byteptrds:
[si];
非8086指令
DF=0:
incsi,incdi
DF=1:
decsi,decdi
类似的还有movsw,传送一个字
一般使用格式为repmovsb
相当于s:
movsb,loops,所以要在之前设置cx
◎pushf将标志寄存器值入栈,popf将标志寄存器值出栈
◎标志寄存器在debug中的表示
0OVDNNGZRPECY1NVUPPLNZPONCOFDFXXSFZFXXPFCF第十二章内中断◎中断类型码:
除法错误:
0单步执行:
1int0指令:
4intn:
n◎中断向量表0000:
0000~0000:
03E8,1000个单元,号中断偏移地址为4N,N段地址为4N+2,高地址为段地址,低地址为偏移地址◎中断处理过程:
1.取得中断类型码N2.pushf3.TF=0,IF=04.pushCS5.pushIP6.ip=4N,cs=4N+2◎中断处理程序的编写和子程序类似,常规步骤为:
1.保存用到的寄存器2.处理中断3.恢复用到的寄存器4.用iret返回(iret=popip,popcs,popf)第十三章int指令◎10中断movah,2;
置光标,2号子例程为设置光标位置movbh,0;
第0页movdh,5;
行号movdl,12;
列号int10h----------movah,9;
9号子例程为在光标位置显示字符moval,'
a'
;
字符movbl,7;
颜色属性movbh,0;
第0页movcx,3;
字符重复个数int10h第十四章端口◎端口的读写只能用in(读入)和out(写入)◎在in和out指令中,只能使用ax或al来存放从端口中读入的数据或要发送到端口中的数据。
访问8位端口时用al,访问16位端口时用dx
inal,20h;
从20h端口读入一个字节out20h,al;
向20h端口写入一个字节movdx,3F8h;
端口号送入dx(16位)inal,dx;
读入一个字节outdx,al;
写入一个字节第十五章外中断◎PC机键盘处理过程扫描码端口为60h,断码=通码+80h键盘输入到达60h端口时,相关芯片发送9号中断,如果这时IF=1,则响应中断◎BIOS提供int9中断例程,用来进行基本的键盘输入处理1.读出60h端口中的扫描码2.如果时字符键的扫描码,将扫描码对应的ASCII码送入内存中BIOS键盘缓冲区;
如果是控制键,将其转为状态字节写入0040:
17单元BIOS键盘缓冲区中,一个键盘输入用一个字单元存放,高位存放扫描码,低位存放ASCII码状态字节含义:
0右shift,1表按下1左shift,1表按下2ctrl,1表按下3alt,1表按下4ScrollLock,1表灯亮5NumLock,1表灯亮6CapsLock,1表输入大写字母7Insert,1表处于删除状态第十六章直接定址表◎adb1,2,3以这种方式定义的标号a不但表示内存单元的地址,还表示内存单元的长度,即a处单元是一个字节单元moval,a[si]相当于moval,cs:
0[si]moval,a[3]相当于moval,cs:
0[3]◎assume将标号所在段和一个段寄存器联系起来,否则编译时无法确定标号的段地址assumeds:
datadatasegmentadb1,2,3bdw0dataendscode段中可以使用moval,a[si]相当于moval,[si]◎seg取得标号的段地址adb1,2bdw0cdda,b;
相当于cdwoffseta,sega,offsetb,segb
◎int16h读取键盘缓冲区movah,0int16h◎int13h对磁盘进行读写(ah=int13h的功能号,2-读扇区,3-写扇区(al=读取/写入的扇区数(ch=磁道号(cl=扇区号(dh=磁头号(面)(dl=驱动器号0:
软驱A1:
软驱B80h:
硬盘C81h:
硬盘Des:
bx指向数据区,读入/写入的数据返回值:
(al=读入/写入扇区数,(ah=返回码,0表成功本文来自CSDN博客,转载请标明出处: