汇编笔记一

来源:互联网 发布:sql sum多个字段求和 编辑:程序博客网 时间:2024/05/20 11:20
汇编语言发展至今,由以下3类指令组成:
1.汇编指令:机器码的助记符,有对应的机器码;
2.伪指令:没有对应的机器码,由编译器执行,计算机并不执行;
3.其他符号:如:+、-等,由编译器识别,没有对应的机器码。
CPU要想进行数据的读写,必须和外部器件(标准说是芯片)进行3类信息的交互:
1.存储单元的地址(地址信息)
2.器件的选择,读或写的命令(控制信息)
3.读或写的数据(数据信息)
8086  16位字长 20位地址总线  80386 32地址总线
第二章
CPU:运算器、寄存器、控制器、内部总线
寄存器:AX,BX,CX,DX,SI,DI,SP,BP,IP,CS,SS,DS,ES,PSW
物理地址=段地址*16+偏移地址  16位字长 20位地址总线
16位偏移地址,所以一个段的长度最大为64KB
8086E 4个侧寄存器:CS、DS、SS、ES。
CS:代码段寄存器,IP:指令指针寄存器
任意时刻:CS*16+IP单元中读取指令并执行
8086CPU的工作过程可以简要描述如下:
1、从CS:IP指向的内存单元读取指令,读取的指令进入指令缓冲器;
2、IP=IP+所读取指令的长度,从而指向下一条指令;
3、执行指令。转到1,重复这个过程。
8086CPU加电后被设置为CS:F000H IP:FFFFH
8086CPU能够改变CS、IP的有JMP指令  jmp  段地址:偏移地址
jmp 某一合法寄存器    功能:用寄存器中的值修改IP
Debug是DOS、WINDOWS都提供的实模式(8086方式)程序的调试工具。DEBUG功能如下:
R:查看、改变CPU寄存器的内容;
D:查看内存中的内容;
E:改写内存中的内容;
U:将内存中的机器指令翻译成汇编指令;
T:执行一条机器指令;
A:以汇编指令的格式在内存中写入一条机器指令;
第三章
mov: 1、将数据直接送入一个寄存器中; 2、将一个寄存器中的内容送入另一个寄存器。
mov al,[0]   []表示一个内存单元,[0]中的0表示内存单元的偏移地址,段地址自动去DS中取。
8086CPU不支持将数据直接送入段寄存器的操作,只能通过通用寄存器中转。
MOV 寄存器,数据 比如:MOV AX,8
MOV 寄存器,寄存器 比如:MOV AX,BX
MOV 寄存器,内存单元 比如:MOV AX,[0] 
MOV 内存单元,寄存器 比如:MOV [0],AX
MOV 段寄存器,寄存器 比如:MOV DS,AX
8086CPU中,有两个寄存器,段寄存器SS和寄存器SP,栈顶的段地址存放在SS中,偏移地址存放在SP中。
任意时刻,SS:SP指向栈顶元素。push and pop时CPU从SS和SP中得到栈顶的地址。
8086CPU不保证我们对栈的操作不会越界。


第四章
assume cs:codesg //假设某个段寄存器与下面定义的段相关联
codesg segment    //***segment与*** ends伪指令定义一个段
start: mov ax,0123H
mov bx,0456H //数据最前面如果是字母的话,要在之前再补个0
add ax,bx
add ax,ax

mov ax,4c00H //这两行用于程序的返回
int 21H
codesg ends
end //汇编程序的结束标志   也可以end start  //可以告诉程序的入口在哪里。


Debug和编译对指令中的"[idata]"有不同的解释:
Debug:将它解释为一个内存单元,idata是内存单元的偏移地址;
编译器:将[idata]解释为直接数"idata".可能把偏移地址先送入BX中,再用[bx]就可以当偏移地址来用。


在一般的PC机中,DOS方式下,DOS和其他合法的程序一般都不会 使用0:200-0:300(00200h-00300h)的256个字节空间。正常情况下是0.


第六章 包含多个段的程序
在代码段中存放数据
assume cs:code
code segment
dw 1234H,1343H,0112h   //dw  define word定义字类型,因为在最前面,其偏移地址为0,2,4
start:
  ...
code ends
end start


assume cs:code
code segment
dw 1234H,1343H,0112h   //dw  define word定义字类型,因为在最前面,其偏移地址为0,2,4
dw 0,0,0,0 //这部分空间可以当栈来用。
start:
  ...
code ends
end start


代码段、数据段、栈放到一个源程序中:
assume cs:code,ds:data,ss:stack
data segment
  dw 0123H,0456H,0789H,0abcH
data ends
stack segment
 dw 0,0,0,0 //db字节单元 dw字单元 dd 双字单元(dword)double word
stack ends
code segment
start: mov ax,stack
mov ss,ax
mov sp,8 //ss:sp指向栈顶
mov ax,data
mov ds,ax
mov bx,0 //ds:bx指向数据段第一个单元
mov cx,4
      s:push [bx]
      ....
code ends
end start


第七章 更灵活的定位内存地址的方法
SI和DI是8086CPU中和BX功能相近的寄存器, SI和DI不能够分成两个8位寄存器来使用。
第八章 数据处理的两个基本问题
自定义的描述性符号:reg(表示一个寄存器)和sreg(表示一个段寄存器)
reg的集合包括:ax,bx,cx,dx,ah,al,bh,bl,ch,cl,dh,cl,sp,bp,si,di;
sreg的集合包括:ds,ss,cs,es.
1、在8086CPU中,只有bx,si,di,bp这4个寄存器可以用在"[...]"中来进行内存单元的寻址。
2、只要d [...]中使用寄存器bp,而指令中没有显性地给出段地址,段地址就默认在SS中。
在没有寄存器名存在的情况下,用操作符byte ptr或word ptr指明内存单元的长度
mov word ptr ds:[0],1
inc byte ptr [bx]
div指令 //除法指令
dup指令 //用于数据的重复
db 3 dup (0,1,2)   等效  db 0,1,2,0,1,2,0,1,2


第九章 转移指令的原理
可以修改IP,或同时修改CS和IP的指令统称为转移指令。
8086CPU的转移指令分为以下几类:
1)无条件转移指令(如:jmp是)
2)条件转移指令
3)循环指令(如:loop)
4)过程
5)中断
9.1 操作符offset
操作符offset在汇编语言中是由编译器处理的符号,它的功能是取得标号的偏移地址。
start:mov ax,offset start ;相当于mov ax,0
由于转移指令对IP的修改范围不同,段内转移又分为:短转移和近转移。
短转移IP的修改范围为-128 to 127
近转移IP的修改范围为-32768 to 32767
jmp short 标号 //段内短转移
jmp near ptr 标号 //段内近转移
jmp far ptr 标号 //实现段间转移
jmp 16位寄存器
转移地址在内存中的jmp指令
(1) jmp word ptr 内存单元地址(段内转移)
(2) jmp dword ptr 内存单元地址(段间转移)
jcxz指令 为有条件转移指令,所有的有条件转移指令都是短转移。
jcxz 标号(如果(cx)=0,转移到标号处执行。)
loop 标号 ((cx)=(cx)-1,如果(cx)不等于0,转移到标号处执行


第十章 call和ret指令
这两指令都是转移指令,它们都修改IP,或同时修改CS和IP,它们经常被共同用来实现子程序的设计。
ret 相当 pop IP
retf 相当 pop IP  pop CS
CALL指令执行时进行两步操作:(1)将当前的IP或CS和IP压入栈中;(2)转移。
mul指令


第十一章 标志寄存器
标志寄存器:(1)用来存储相关指令的某些执行结果; (2)用来为CPU执行相关指令提供行为依据;
   (3)用来控制CPU的相关工作方式。
标志寄存器中存储的信息通常被称为程序状态字(PSW)
8086CPU的flag寄存器的结构如图
15  14  13  12  11  10  9  8  7  6  5  4  3  2  1  0
                OF  DF  IF TF SF ZF    AF    PF    CF
PF标志:奇偶标志位
SF标志:符号标志位
CF标志:进位标志位
OF标志:溢出标志位
adc opt1,opt2 //opt1=opt1+opt2+CF  带进位加法指令
sbb opt1,opt2 //opt1=opt1-opt2-CF带借位减法指令
cmp opt1,opt2 //opt1-opt2  但并不保存结果,只影响标志寄存器
DF标志:方向标志位
DF=0 每次操作后SI,DI递增
DF=1 每次操作后SI,DI递减
pushf的功能是将标志寄存器的值压栈
popf从栈中弹出数据,送入标志寄存器中。


第十二章  内中断
当cpu内部有以下事件发生就会产生相应的中断信息:
(1)除法错误 0
(2)单步执行 1
(3)执行int0指令 4
(4)执行int指令 int n n为字节型立即数
中断向量,就是中断处理程序的入口地址,中断向量表,就是中断处理程序的入口地址的列表。
中断处理程序编写步骤:
(1)保存乃至的寄存器
(2)处理中断
(3)恢复用到的寄存器
(4)用iret指令返回
iret指令的功能用汇编语法描述为:
POP IP
POP CS
POSF
8086中 内存0000:0000-0000:03E8,大小约1KB的空间是系统存中断处理程序入口地址的中断向量表。8086支持256个中断,实际上很少。
rep movsb指令从一处复制到另一处


第十三章 int指令
int n
(1) 取中断类型码n;
(2) 标志寄存器入栈,IF=0,TF=0
(3) CS,IP入栈;
(4) (IP)=(n*4),(CS)=(n*4+2)
例子:
编写、安装中断7ch的中断例程,功能:求一word型数据的平方。
参数:(ax)=要计算的数据
返回值:dx,ax中存放结果的高16位和低16位
应用举例:求2*3456^2
assume cs:code
code segment
  start:mov ax,3456
int 7ch
add ax,ax
adc dx,dx
mov ax,4c00h
int 21h
  code ends
  end start
安装程序如下:
assume cs:code
code segment
  start: mov ax,cs
mov ds,ax
mov si,offset sqr
mov ax,0
mov es,ax
mov di,200h
mov cx,0ffset sqrend-offset sqrend
cld
rep movsb
mov ax,0
mov es,ax
mov word ptr es:[7ch*4],200h
mov word ptr es:[7ch*4+2],0
mov ax,4c00h //程序返回  调用第21h号中断例程的4ch号子程序,功能为程序返回。
int 21h
    sqr: mul ax
iret
  sqrend:nop
pop IP
pop CS
popf
BIOS 和 DOS所提供的中断例程
  在系统板的ROM存放着一套BIOS(基本输入输出系统),BIOS主要包含以下几部分内容:
  (1)硬件系统的检测和初始化程序;
  (2)外部中断和内部中断的中断例程;
  (3)用于对硬件设备进行I/O操作的中断例程;
  (4)其他和硬件系统相关的中断例程。
 操作系统DOS也提供了中断例程,从操作系统的角度来看, DOS的中断例程就是操作系统向程序员提供的编程资源。
 
 第十四章 端口
 PC机系统中,和CPU通过总线相连的芯片除各种存储器外,还有以下3种芯片:
 1、各种接口卡(比如:网卡,显卡)上的接口芯片,它们控制接口卡进行工作;
 2、主板上的接口芯片,CPU通过它们对部分外设进行访问;
 3、其他芯片,用来存储相关的系统信息,或进行相关的输入输出处理。
 在这些芯片中,都有一组可以由CPU读写的寄存器。可见,从CPU的角度,将这些寄存器都当作端口,对它们进行统一编址,从而建立了一个统一的端口
 地址空间,每一个端口在地址空间中都有一个地址。
CPU可以直接读写3个地方的数据:
1、CPU内部的寄存器;
2、内存单元;
3、端口
端口地址和内存地址一样,端口的读写指令只有两条:in 和 out ,分别用于从端口读取数据和往端口写入数据。
在in和out指令中,只能使用ax或al来存放从端口中读入的数据或要发送到端口的数据,访问8位端口时用al,访问16位端口时用ax。
CMOS RAM芯片,一般简称为CMOS.其特征如下:
1、包含一个实时钟和一个128个存储单元的RAM存储器;
2、该芯片靠电池供电;
3、128个字节的RAM中,内部实时钟占用0-0DH单元来保存时间信息,其余大部分单元用于保存系统配置信息,
    供系统启动时BIOS程序读取,BIOS也提供了相关的程序,使我们可以在开机的时候配置CMOS RAM中的系统信息;
4、该芯片内部有两个端口,70H为地址端口,71H为数据端口。
shl shr逻辑左移/逻辑右移,移出位放入CF中,用0递补。


第十五章 外中断
1、可屏蔽中断:CPU可以不响应的外中断。当CPU检测到可屏蔽中断信息时,如果IF=1,则CPU在执行完当前指令后响应中断,
引发中断过程;如果IF=0,则不响应可屏蔽中断。
2、不可屏蔽中断:CPU必须响应的外中断。对于8086CPU,不可屏蔽中断的中断类型码固定为2,所以中断过程中,不需要取中断类型码。
键盘输入:一般将按下一个键时产生的扫描码称为通码,松开一个键产生的扫描码称为断码。扫描码长度为一个字节,通码最高位是0,断码是1.
断码=通码+80H
1、数据传送指令:MOV、PUSH、POP、PUSHF、POPF、XCHG。。。
2、算术运算指令:ADD SUB ADC SBB INC DEC CMP IMUL IDIV AAA。。。
3、逻辑指令:AND OR NOT XOR TEST SHL SHR SAL SAR ROL ROR RCL RCR 。。
4、转移指令:无条件转移指令JMP、条件转移指令JCXZ、JE、JB、JA、JNB、JNA。。、循环指令LOOP、过程CALL、RET、RETF、中断INT、IRET
5、处理机控制指令:这些指令对标志寄存器或其他处理机状态进行设置,比如:CLD、STD、CLI、STI、NOP、CLC、CMC。。
6、串处理指令:这些指令对内存中的批量数据进行处理。MOVSB、MOVSW。。。


第十六章 直接定址表
  在标号后面加有“:"的地址标号,只能在代码段中使用,不能在其他段中使用。
通过依据数据,直接计算出所要找的元素的位置的表,我们称其为:直接定址表


第十七章 使用BIOS进行键盘软件和磁盘读写
键盘输入执行INT 9中断嗸,从60H端口读出扫描码,并将其转化为相应的ASCII码或状态信息,
存储在内存的指定空间(键盘缓冲区或状态字节)中。
BIOS提供了INT 16H中断例程供程序员调用。INT 16H中断例程中包含的一个最重要的功能是从键盘缓冲区中读取一个键盘输入,该功能的编号为0.
MOV AH,0
INT 16H 这两条指令完成从键盘缓冲区中读取一个键盘输入,并且将其从缓冲区中删除。


附注:
  8086/8088不具备实现一个完善的多任务操作系统的功能;
  80386划时代,它可以在3个模式下工作:(80386之后都支持这3种方式)
  1)实模式:工作方式相当于一个8086;
  2)保护模式:提供支持多任务环境的工作方式,建立保护机制(这与VAX等小球鞋机类似);
  3)虚拟8086模式:可从保护模式切换至其中的一种8086工作方式,这种方式的提供使用户可以方便地在保护模式下运行一个或多个原8086程序。
  DOS加载后CPU仍以实模式工作,WINDOWS加载后CPU就以保护模式运行,在WIDOWS中运行一个DOS下的程序,那WINDOWS将CPU切换到虚拟8086模式下运行该程序。
  


       







































































0 0
原创粉丝点击