王爽汇编语言学习笔记.docx

上传人:b****6 文档编号:4969790 上传时间:2022-12-12 格式:DOCX 页数:8 大小:21.14KB
下载 相关 举报
王爽汇编语言学习笔记.docx_第1页
第1页 / 共8页
王爽汇编语言学习笔记.docx_第2页
第2页 / 共8页
王爽汇编语言学习笔记.docx_第3页
第3页 / 共8页
王爽汇编语言学习笔记.docx_第4页
第4页 / 共8页
王爽汇编语言学习笔记.docx_第5页
第5页 / 共8页
点击查看更多>>
下载资源
资源描述

王爽汇编语言学习笔记.docx

《王爽汇编语言学习笔记.docx》由会员分享,可在线阅读,更多相关《王爽汇编语言学习笔记.docx(8页珍藏版)》请在冰豆网上搜索。

王爽汇编语言学习笔记.docx

王爽汇编语言学习笔记

第一章基础知识

◎汇编语言由3类指令组成

汇编指令:

机器码的助记符,有对应机器码。

伪指令:

没有对应机器码,由编译器执行,计算机并不执行

其他符号:

如+-*/,由编译器识别,没有对应机器码

◎一个CPU有n根地址线,则可以所这个CPU的地址线宽度为n,这样的CPU最多可以寻找2的n次方个内存单元。

◎1K=2^10B1M=2^20B1G=2^30B

◎8086CPU地址总线宽度为20,寻址范围为00000~FFFFF

00000~9FFFF主存储器地址空间(RAM

A0000~BFFFF显存地址空间

C0000~FFFFF各类ROM地址空间

第二章寄存器(CPU工作原理

◎16位结构描述了一个CPU具有下面几个方面的结构特性

运算器一次最多可以处理16位的数据

寄存器的最大宽度为16位

寄存器和运算器之间的通路为16位

◎8086有20位地址总线,可以传送20位地址,达到1M的寻址能力。

采用在内部用两个16位地址合成的方法来形成一个20位的物理地址

◎物理地址=段地址×16+偏移地址

◎在编程是可以根据需要,将若干地址连续的内存单元看作一个段,用段地址×16定位段的起始地址(基础地址,用偏移地址定位段中的内存单元。

段地址×16必然是16的倍数,所以一个段的起始地址也一定是16的倍数;偏移地址位16位,16位地址的寻址能力为64KB,所以一个段的长度最大为64KB

◎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,实现远转移

(ip=((ss*16+(sp

(sp=(sp+2

(cs=((ss*16+(sp

(sp=(sp+2

相当于:

POPip

POPcs

◎call指令,call指令不能实现短转移,实现转移的方法和假名牌指令原理相同

1。

call标号,段内转移

机器指令中没有转移的目的地址,而是相对于当前ip的转移位移(补码,相当于1.puship2.jmpnearptr标号

2。

callfarptr标号,段间转移

机器指令中包含转移目的地址,相当于1.pushcs2.puship3.jmpfarptr标号

3。

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

ax

ax>bx,CF=0andZF=0

ax<=bx,CF=1orZF=1

ax>=bx,CF=0

有符号比较时(反向说明cmpah,bh:

SF=0andOF=0,ah>=bh

SF=0andOF=1,ah

SF=1andOF=0,ah

SF=1andOF=1,ah>bh

◎无符号比较跳转指令

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博客,转载请标明出处:

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 军事

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1