汇编语言

4. 8086寄存器组
  AX: 累加器,常用于保存临时数据                  §
  BX:基址寄存器,主要用作指针,也可用作数据存储  §__数据寄存器______§
  CX: 计数器                                      §                  §
  DX: 数据寄存器,用于端口操作或临时数据          §                  §
                                                  §                  §_通用寄存器
  SP: 堆栈指针,指向堆栈当前地址                   §__堆栈指针寄存器__§
  BP: 基址指针,常用于指向高级语言堆栈帧          §                  §
  SI: 源操作数指针                                §__变址寄存器______§
  DI:目的操作数指针                              §                  §
 
  IP: 指令指针            §__控制寄存器
  FLAGS: 标志寄存器       §
 
  CS: 代码段寄存器        §
  DS: 数据段寄存器        §__段寄存器
  SS: 堆栈段寄存器        §
  ES:附加段寄存器        §
说明
变址和指针寄存器包括SI、DI、SP、BP4个16位寄存器,主要用于存放某个存储单元的偏移地址。
SI是源变址寄存器,DI是目的变址寄存器,在字符串操作中,SI和DI都具有自动增量或减量的功能。
SP为堆栈指针寄存器,用于存放当前堆栈段中栈顶的偏移地址;BP为基址指针寄存器,用于存放堆栈段中某一存储单元的偏移地址。
CS存放代码段的段首址,指令指针寄存器IP指示代码段中指令的偏移地址。
8086CPU中的指令指针IP,它总是保存下一次将要从主存中取出指令的偏移地址,偏移地址的值为该指令到所在段段首址的字节距离。在目标程序运行时,IP的内容由微处理器硬件自动设置,程序不能直接访问IP,但一些指令却可改变IP的值,如转移指令、子程序调用指令等。
 
标志寄存器
8086CPU中有一个很重要的16位标志寄存器,它包含9个标志位,主要用于保存一条指令执行后,CPU所处状态信息及运算结果的特征。
A.条件标志
(1)进位标志CF
(2)零标志ZF
(3)符号标志SF
(4)溢出标志 OF
(5)奇偶标志 PF
(6)辅助进位标志AF
B.状态控制标志
(1)方向标志DF
(2)中断允许标志IF
(3)追踪标志TF
5. 物理地址的形成
把1M字节地址空间划成若干逻辑段。每个逻辑段必须满足两个条件:一是逻辑段的起始地址(简称段首址)必须是16的倍数;二是逻辑段的最大长度为64K。按照这两个条件,1M字节地址空间最多可划分成64K个逻辑段,最少也要划分成16个逻辑段。逻辑段与逻辑段可以相连,也可以不连,还可以重叠。计算方法:段乘以16加上偏移即物理地址。
 
6. 寻址方式
A. 立即寻址
  例如:mov  ax,35
B. 寄存器寻址
  例如:mov  ax,bx
C. 直接存储器寻址
  例如:       value   dw    10h
                    mov   ax, value        ;//利用 ds段寄存器(默认)计算它在memory中的实际位置
                       mov   ax, ds:33h       ;
                       mov   ss:2, ax         ;//ss * 16 + 2
D. 间接存储器寻址
(1)寄存器间接寻址
     例如:            mov  ax, [bp]          ;//ax值为(ss*16 +bp)指向的地址
(2)变址寻址
     例如:    table   db    100  dup (?)
                       mov   ax, table[bx]    ;//bx是数字下标
(3)基址变址
     例如:            mov   ax, [bx][si]     ;//bx * 16 + si
(4)带位移基址变址
     例如:            mov   ax,table[bx][si] ;//指向table + bx + si
                       mov   ax,10[bp][di]    ;//指向10 + bp + di
E: 跨段问题
MOV AX,DS:[BP]
MOV CX,SS:[SI]
该例中,DS:,SS:均为跨段前缀,此时默认状态无效,操作数的物理地址PA由段寄存器内容左移4位加偏移EA形成。上述2条指令的源操作数物理地址分别为:
PA1  =(DS)左移4位+[BP]
PA2  =(SS)左移4位+[SI]

 
7. 指令系统之数据传送类指令
 
A.通用数据传送指令:
1.传送指令MOV
2.数据交换指令XCHG ----功能:将源地址与目的地址中的内容互换
3.查表转换指令 XLAT
 
B.堆栈操作指令:
1.进栈指令PUSH
2.出栈指令POP

C.标志寄存器传送指令:
1.标志送AH指令LAHF
2.AH送标志指令SAHF
3.标志寄存器进栈指令PUSHF
4.标志寄存器出栈指令POPF

D.地址传送指令:
1.传送偏移地址指令 LEA
   例如:     a    db     ?
                   lea    bx, a ;bx is a's address
2.传送偏移地址及数据段首址指令LDS
   语句格式:LDS  OPD,OPS
   功能:将主存中指定字单元数据送入指定存储器,下一字单元数据送DS寄存器。
 
3.传送偏移地址及附加数据段指令LES ---- 功能:将主存某字单元内容送指定寄存器。
   语句格式:LES  OPD,OPS
   功能:将主存某字单元内容送指定寄存器。即(OPS)→OPD,(OPS+2)→ES。

E.输入输出指令
1.输入指令IN
2.输出指令OUT
 
8. 指令系统之算术运算类指令
 
A.加法指令
1.加1指令  INC
2.加指令ADD
3.带进位加指令ADC
 
B.减运算指令
1.减1指令DEC
2.减指令SUB
3.求补指令NEG
4.带借位减指令 SBB
5.比较指令 CMP ---- 结果只影响标志位
 
C.乘运算指令
1.无符号数乘法指令MUL
2.有符号乘指令IMUL
 
D.除运算指令
1.无符号除指令DIV
2.有符号除指令IDIV
 
E.符号扩展指令
1.字节转换成字指令CBW ---- 将AL中的符号位数据扩展至AH
2.将字转换成双字指令CWD ---- 将AX中的符号位数据扩展至DX
 
F.十进制调整指令
1.压缩BCD码调整指令 DAA
2.非压缩BCD码调整指令 DAS
 

G.非压缩BCD码调整指令
(1)加法的非压缩BCD码调整指令AAA
(2)减法的非压缩BCD码调整指令AAS
(3)乘法的非压缩BCD码调整指令AAM
(4)除法的非压缩BCD码调整指令AAD
 
H.位操作类指令
  逻辑运算指令
1.求反指令NOT
2.逻辑乘指令AND
3.测试指令TEST
4.逻辑加指令OR
5.按位加指令XOR
  移位指令
1.算术左移和逻辑左移指令SAL(SHL)
语句格式:SAL  OPD,1  或SHL  OPD,1
          SAL  OPD,CL或SHL  OPD,CL
功能:将(OPD)向左移动CL指定的次数,最低位补入相应的0,CF的内容为最后移入位的值。
2.算术右移指令SAR
语句格式:SAR  OPD,1或SAR  OPD,CL
CF功能:将(OPD)向右移动CL指定的次数且最高位保持不变;CF的内容为最后移入位的值。
3.逻辑右移指令SHR
语句格式:SHR OPD,1或SHR OPD,CL
功能:将(OPD)向右移动CL规定的次数,最高位补入相应个数的0,CF的内容为最后移入位的值。
4.循环左移指令ROL
语句格式:ROL  OPD,1或ROL  LPD,CL
功能:将目的操作数的最高位与最低位连成一个环,将环中的所有位一起向左移动CL规定的次数。CF的内容为最后移入位的值。
5.循环右移指令ROR
语句格式: ROR  OPD,1或ROR  OPD,CL
功能:将目的操作数的最高位与最低位连成一个环,将环中的所有位一起向右移动CL规定的次数,CF的内容为最后移入位的值。
6.带进位的循环左移指令RCL
语句格式: RCL  OPD, 1或RCL  OPD,CL
功能:将目的操作数连同CF标志一起向左循环移动CL规定的次数。
7.带进位的循环右移指令RCR
语句格式:RCR  OPD,1或RCR  OD,CL
功能:将目的操作数连同CF标志一起向右循环移动所规定的次数。
 
9.指令系统之串操作类指令
1.传送指令MOVS
语句格式:① MOVSB——字节串传送
② MOVSW——字串传送
功能:将以SI为指针的源串中的一个字节(或字)存储单元中的数据传送至以DI为指针的目的地址中去,并自动修改指针,使之指向下一个字节(或字)存储单元。
即:①(DS:[SI])→ES:[DI]。
    ② 当DF=0时,(SI)和(DI)增量。
当DF=1时,(SI)和(DI)减量。
2.串比较指令CMPS 
语句格式:① CMPSB——字节串比较
② CMPSW——字串比较
功能:将SI所指的源串中的一个字节(或字)存储单元中的数据与DI所指的目的串中的一个字节(或字)存储单元中的数据相减,并根据相减的结果设置标志,但结果并不保存。
即:①([SI])-([DI])。
② 修改串指针,使之指向串中的下一个元素。
当DF=0时,(SI)和(DI)增量。当DF=1时,(SI)和(DI)减量。
3.串搜索指令SCAS
语句格式:① SCASB——字节串搜索
② SCASW——字串搜索
功能:AL(字节)或AX(字)中的内容与DI所指的目的串中的一个字节(或字)存储单元中的数据相减,根据相减结果设置标志位,结果不保存,
即:① 字节操作:(AL)-([DI]),字操作:(AX)-([DI])。
② 修改指针使之指向串中的下一个元素。
当DF=0时,(DI)增量。当DF=1时,(DI)减量。
4.从源串中取数指令LODS
语句格式:① LODSB——从字节串中取数
② LODSW——从字串中取数
功能:将SI所指的源串中的一个字节(或字)存储单元中的数据取出来送入AL(或AX)中。
即:① 字节操作:([SI])→AL,字操作:([SI])→AX。
② 修改指针SI,使它指向串中的下一个元素。
当DF=0时,(SI)增量。当DF=1时,(SI)减量。
5.往目的串中存数指令STOS
语句格式:① STOSB——往字节串中存数
②(2)STOSW——往字串中存数
功能:将AL或AX中的数据送入DI所指的目的串中的字节(或字)存储单元中。
即:① 字节操作:(AL)→[DI],字操作:(AX)→[DI]。
② 修改指针DI,使之指向串中的下一个元素。
当DF=0时,(DI)增量)。当DF=1时,(DI)减量。
6.重复前缀指令REP  REPZ  REPNZ
(1)REP   
REP前缀用在MOVS、STOS 、LODS指令前。
功能:每执行一次串指令(CX)-1,直到(CX)=0,重复执行结束。
(2)REPZ 
该指令一般用在CMP、SCAS指令前。
功能:每执行一次串指令(CX)-1,并判断ZF标志是否为0,只要(CX)=0或ZF=0,则重复执行结束。
(3)REPNZ 
该指令一般用在CMPS、SCAS 指令前。
功能:每执行一次串指令(CX)-1,并判断ZF标志是否为0,只要(CX)=0或ZF=1,则重复执行结束。
9.指令系统之 控制转移类指令
A.条件转移指令 JA,JAE,JB,JBE,JC,JE,JG,JGE,JL,JLE,JNA,JNAE,JNB,JNBE,JNC,JNE,JNG,JNGE,JNL,JNLE,JNO,JNP,JNS,JNZ,JS,JO,JP,JPE,JPO,JCXZ
B.无条件转移指令 JMP
C.循环指令 LOOP,LOOPE,LOOPENE,LOOPNZ,
D.子程序调用指令 CALL,RET
E.中断指令 INT,IRET
10.指令系统之处理机控制类指令
A.标志位设置指令
1.进位标志操作指令
2.方向标志操作指令
3.中断标志操作指令
 
B.CPU状态控制指令
1.空操作指令NOP
2.总线封锁前缀指令LOCK
3.暂停指令HLT
4.交权指令ESC
5.等待指令WAIT
11.宏汇编语言之变量定义,如下例:
DATA       SEGMENT
STR1        DB ‘1234’
STR2        DW ‘AB’,‘CD’,‘A’
STR3        DD ‘AB’
DATA       ENDS
 
12.符号地址
NEXT:MOV    AL, [SI] ;带标号NEXT的指令
      DEC    CX
      JNE    NEXT ;标号NEXT作转移指令的操作数
 
13.用算术运算符进行数值表达式运算
NUM1 EQU 25*4 –50 ;NUM1=50
NUM2 EQU NUM1 / 7 ;NUM2=7
NUM3 DB NUM1  MOD  7 ;NUM3=1
VAR1 DB 1,2,3,4,5
VAR2 DB ‘12345’
NUM4 EQU VAR2-VAR1 ;NUM4=5
NUM5 EQU 0FH
MOV AL,NUM5  SHL  4 ;(AL)=11110000B
MOV BL,NUM5  SHR  4 ;(BL)=00000000B
14.逻辑运算符
MOV AL,34H  AND  0FH       ;04H→AL
MOV BL,05H  OR   30H ;35H→BL
MOV CX,NOT  00FFH         ;0FF00H→CX
MOV DX,789AH XOR 000FH ;7895H→DX
 
15.关系运算符
关系运算符包括:相等(EQ),不等(NE),小于(LT),大于(GT),小于等于(LE)及大于等于(GE)。
NUM1 DB 10  LT  5         ;NUM1=0
NUM2 DB 0AAAAH  GT  7FFFH ;NUM2=0FFFFH
MOV AX,‘A‘ EQ  41H ;0FFFFH→AX
MOV BX,NUM2  LT  NUM1 ;0→BX
16.数值返回运算符
(1)SEG 运算符
格式:SEG  变量或标号
功能:分离出其后变量或标号所在段的段首址。例如:
MOV AX,SEG ARR
MOV DS,AX
(2)OFFSET运算符
格式:OFFSET  变量或标号
功能:分离出其后变量或标号的偏移地址。例如:
  MOV  BX,OFFSET BUF
(3)TYPE运算符
格式:TYPE  变量或标号
功能:分离出其后变量或标号的类型。如果是变量,将返回该变量的类型对应字节数;如果是标号,则返回代表标号类型的数值。
(4)LENGTH运算符
格式:LENGTH  变量
功能:取出变量所含的数据存储单元个数。
取出变量占存储单元个数。
DATA SEGMENT
A DB ‘ABCDEF’
B DW 10 DUP(1,2DUP(2))
C DB 3,20 DUP(0)
DATA ENDS
MOV AX,LENGTH  A ;1→AX
MOV BX,LENGTH B ;10→BX
MOV CX,LENGTH C ;1→CX
(5)SIZE运算符
格式:SIZE 变量
功能:取出变量所含的数据存储区大小。其返回值为:
LENGTH  变量 * TYPE  变量
例如:上例中A、B、C三变量:
SIZE A =  LENGTH A*TYPE A = 1
SIZE B =  LENGTH B*TYPE B = 20
SIZE C =  LENGTH C*TYPE C = 1
(6)字节分离运算符
字节分离运算符包括:HIGH和LOW。
格式:HIGH  常量或地址表达式
LOW  常量或地址表达式
功能:HIGH 用来分离出其后16位常量或地址表达式的偏移量的高字节;LOW用来分离出其后16位常量或地址表达式偏移量的低字节。
17.伪指令
A.数据定义伪指令
常用的数据定义伪指令有DB,DW,DD,DQ,DT。
格式:[变量名]  数据定义伪指令 表达式 [,…]
功能:定义数据存储区,类型由数据定义伪指令确定,初值由表达式给定。
B.符号定义伪指令
1).等价伪指令        格式:符号名 EQU 表达式
2).等号伪指令        格式:符号名 = 表达式
3). 定义符号名伪指令   格式:变量名或标号  LABEL  类型
C.段定义伪指令SEGMENT/END
1).段名
段名是为该段起的名字,用来指出汇 编程序为该段分配的存储区起始位置。
2).定位方式
(1)PARA:表示本段必须从能被16整除的地址处开始存放,即段起始地址最低四位必须是0。
(2)WORD:表示本段要从一个偶数地址处开始存放,即段起始地址的最低一位必须是0。
(3)BYTE:表示本段起始地址可以从任一地址处开始存放。
(4)PAGE:表示本段要从能被256整除的地址处开始存放,即起始地址的最低八位必须是0。
D.类别
【例】对连接程序进行连接后存储区各段相对位置分布。
DATA1 SEGMENT ‘DATA’
CODE SEGMENT ‘CODE’
STACK1 SEGMENT ‘STACK’
DATA2 SEGMENT ‘DATA’
STACK2 SEGMENT ‘STACK’
经连接程序连接后,各段的相对位置如下:
DATA1 SEGMENT ‘DATA’
DATA2 SEGMENT ‘DATA’
STACK1 SEGMENT ‘STACK’
STACK2 SEGMENT ‘STACK’
CODE SEGMENT ‘CODE’
E.组合方式
组合方式有六种类型可供选择。
(1)“不选择”
(2)PUBLIC
(3)STACK
(4)COMMON
(5)MEMORY
(6)AT表达式
F.假定伪指令ASSUME
格式:ASSUME  段寄存器:段名 [,段寄存器:段名]
功能:建立段寄存器与段之间的对应关系。该伪指令一般出现在代码段中。
G.置汇编地址计数器伪指令ORG
格式:ORG  数值表达式
功能:将数值表达式的值赋给汇编地址计数器。数值表达式的值须为0~65535之间的非负整数。
H.源程序结束伪指令
格式:END  [表达式]
功能:该语句标志整个程序的结束,是源程序的最后一条语句。
 
18.DOS系统功能调用
DOS系统功能调用的方法一般可分为以下几步
① 设置所要调用功能的入口参数。
② 在AH寄存器中存入所要调用功能的功能号。
③ INT 21H指令自动转入中断子程序入口。
④ 相应中断子程序运行完毕,可按规定取得出口参数。
常用的DOS系统功能调用
1.单字符输入(1号调用)
2.单字符显示(2号调用)
3.打印输出(5号调用)
4.结束调用(4CH号调用)
5.显示字符串(9号调用)
6.字符串输入(10号调用)
例子:在屏幕上显示字符串“Example  of  string  display!”
DATA SEGMENT
     STR DB  0DH,0AH,‘Example  of  string  display!$’
DATA ENDS

STACK SEGMENT  STACK
      DB 100 DUP(0)
STACK ENDS

CODE SEGMENT
     ASSUME DS:DATA,CS:CODE,SS:STACK
 
BEGIN: 
     MOV AX ,DATA
     MOV DS,AX
     LEA DX,STR
     MOV AH ,9
     INT 21H
     MOV AH,4CH 
     INT 21H
CODE ENDS
     END BEGIN
例子:从键盘上输入一串字符到输入缓冲区,然后将输入的字符串在显示器上以相反的顺序显示。
DATA SEGMENT
     INFO1    DB   0DH,0AH,‘INPUT  STRING:$’
     INFO2    DB   0DH,0AH,‘OUTPUT  STRING:$’
     BUFA     DB   81
              DB   ?
              DB   80    DUP    (0)
     BUFB     DB   81    DUP    (0)
DATA ENDS

STACK SEGMENT
              DB 200 DUP(0)
STACK ENDS

CODE SEGMENT
     ASSUME DS:DATA,SS:STACK,CS:CODE
START: 
     MOV AX,DATA
     MOV DS,AX
     LEA DX,INFO1
     MOV AH,9 ;                9号调用,显示输入提示信息
     INT 21H
     LEA DX,BUFA
     MOV AH,10 ;            10号调用,键盘输入字符串到缓                     冲区BUFA
     INT 21H
     LEA SI,BUFA+1        
     MOV CH,0 ;                   取字符长度→CX 
     MOV CL,[SI]
     ADD SI,CX ;SI 指向字符串尾部
     LEA DI,BUFB ;DI指向字符串变量
NEXT: 
     MOV AL,[SI]
     MOV [DI],AL
     DEC SI
     INC DI
     LOOP NEXT
     MOV BYTE  PTR  [DI],‘$’
     LEA DX,INFO2
     MOV AH,9              ;9号调用,显示输出      提示信息
     INT 21H
 
     LEA DX,BUFB
     MOV AH,9           ;反向显示字符串
     INT 21H
     MOV AH,4CH
     INT 21H
CODE ENDS
     END START
 
19.结构化 程序设计
相应的伪指令有:if,then,else,for,while,do,等,如c语言,略去不讲。
 
20.参数传递与堆栈:
函数参数可以用堆栈传递,如push ax,push bx后(这两个参数压入栈中),则调用过程后堆栈如下:
ax值            bp + 10
bx值            bp + 6
函数返回地址    bp + 2
bp值            bp
以后的push操作分别往下压入栈中。
 
21.一个简单例子演示汇编 工具 使用过程
需要的 工具:masm.exe和link.exe,分别是编译器和连接器
程序 源码
;
; first.asm -A first assembly language program
;
; code segment
;
_TEXT     segment word public 'CODE'
          assume  cs:_TEXT,ds:_DATA,ss:_STACk
;
; ADD Two 16 bit values
;
addem proc far
      mov  ax,_DATA
      mov  ds,ax
     
     
      mov  ax,a
      add  ax,b
      mov  c,ax
     
      mov  ax,4c00h
      int  21h
addem endp
_TEXT ends
 
_DATA  segment  word public 'DATA'
      a          dw       3
      b          dw       4
      c          dw       ?
_DATA  ends
 
_STACK segment  para stack 'STACK'
        db       128    dup(?)
_STACK  ends
        end addem
输入上代码,打开dos窗口,命令行输入下语句:
e:/asm>masm first
e:/asm>link first
将会产生一个exe文件。
指向first,什么现象也没有,输入这个命令调试我们的程序:
debug first.exe
-t 指向一条语句
-d 0 显示内存数据
22.转载请保留完整文档,“天衣有缝”原创       2005.01.03 21:00  深圳南山科技园
23.本菜鸟的汇编语言复习之一到此结束,之二即将退出(简单叙述保护模式下汇编语言的 程序设计),敬请关注~
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值