汇编语言笔记

核心:消息机制,内存保护机制。
计算机语言:机器语言,汇编语言,高级语言。
汇编的优点

  • 直接访问与硬件相关的存储器或I/O端口。
  • 对生成的二进制代码进行完全的控制。
  • 避免因共同访问或硬件设备共享引起的死锁。
  • 根据特定的代码进行优化,提高运行速度。
  • 最大限度的发挥硬件的功能。

8086处理器:16条数据线,20条地址线,寻址范围2^20=1MB
通用寄存器

  • AX:累加器,存放操作数或者运算结果。
  • BX:基址寄存器,存放操作数的偏移地址,或者数据。
  • CX:计数寄存器,用于循环指令、移位指令的隐含计数控制。
  • DX:源变址寄存器,与AX组合存放双字型寄存器,DX存高位。DX也用来存储I/O的端口地址。
  • SI:源变址寄存器,源操作数的地址指针。
  • DI:目的变址寄存器,目的操作数的地址指针。
  • BP:堆栈基址寄存器,堆栈中操作数的偏移地址。
  • SP:栈顶指针,栈顶的地址。

段寄存器:是一种专用寄存器,用于存储器寻址。

  • CS:代码段,存放当前正在运行的程序代码。
  • DS:数据段,当前程序所用的数据,源操作数。
  • SS:堆栈段,存放子程序的入口地址。
  • ES:数据段,辅助的数据存储区,目的操作数的存放位置。

字符三属性
1)变量的段属性
变量的段属性(地址)是指定义变量所在段的段首址,当需要访问该变量时,该段首址一定要在某一段寄存器中。
2)变量的偏移属性
变量的偏移属性(地址)是指变量所在段的段首址到该变量定义语句的字节距离。
3)变量的类型
是指存取变量中的数据时所需要的字节数,也是存取变量数据的交换单位。它可以是字节类型、字类型、双字类型、四字类型、十字节类型。这些类型的选择由定义该变量时所使用的数据定义伪指令确定。
变量的定义
变量一般在数据段或附加数据段中使用数据定义伪指令DB、DW、DD、DQ和DT来定义。定义变量的一般格式:
[变量名] 数据定义伪指令 表达式 [,…]
其中,用DB定义的变量为字节类型的变量;用DW定义的变量为字类型变量;用DD定义的是双字类型的变量;用DQ定义的是四字类型的变量;用DT定义的是十字节类型的变量。变量名由用户所取,定义变量时可以省略。表达式确定了变量的初值。

    Count  db  10
    Buf    dw  1,2,3,4,5 
    Char   db  ‘AB’
   高级语言的变量定义:
    Char  c1,c2,c3;
    Int  a,b,c,d
    Float  x,y,z

数据传送指令
数据传送指令负责在寄存器或内存单元之间进行数据、地址或立即数的传输。
主要包括:一般数据传送指令(MOV、XCHG)、堆栈操作指令(PUSH、POP)、标志寄存器传送指令(PUSHF、POPF、LAHF、SAHF)、地址传送指令(LEA、LDS、LES)、输入/输出指令(IN、OUT)。在这些指令中,除了SAHF、POPF两指令外,其它均不影响标志位。
这里主要介绍MOV、XCHG、LEA、LDS、LES指令的语句格式和功能。见课本例题。
算数运算指令
算术运算指令是指对二进制数进行加、减、乘、除运算的指令。
主要包括:加法指令(ADD、ADC、INC),减法指令(DEC、NEG、SUB、SBB、CMP),乘法指令(IMUL、MUL),除法指令(IDIV、DIV)和符号扩展指令(CBW、CWD、CDQ)。
在这些指令中,除符号扩展指令之外,均会不同程度地影响标志寄存器中的标志位。
下面将主要讨论以上各指令的汇编语句格式及功能。见课本例题。
移位指令
(1)算数逻辑移位指令
1)算术左移和逻辑左移指令
语句格式;SAL OPD,1 或 SHL OPD,1
SAL OPD,CL 或 SHL OPD,CL
2)算术右移指令
语句格式:SAR OPD,1或SAR OPD,CL
3)逻辑右移指令
语句格式:SHR OPD,1或SHR OPD,CL
1)循环左移指令
语句格式:ROL OPD,1或ROL OPD,CL
2)循环右移指令
语句格式:ROR OPD,1 或ROR OPD,CL
3)带进位的循环左移指令
语句格式:RCL OPD,1或RCL OPD,CL
4)带进位的循环右移指令
语句格式:RCR OPD,1或RCR OPD,CL
字符串操作指令共有五条,包括:
传送字节(或字)串的指令MOVS,
搜索字节(或字)串的指令SCAS,
比较字节(或字)串的指令CMPS,
取字节(或字)串的指令LODS,
存储字节(或字)串的指令STOS。
程序结构

NAME  <模块名>      ;可有可无
TITEL  <正文>         ;可有可无
STACK PARA STACKSTACK’
                ;此处输入堆栈段代码
STACK ENDS
DATA  SEGMENT
                ;此处输入数据段代码
DATA  ENDS
CODE  SEGMENT
          ASSUME  CS:CODE,DS:DATA,SS:STACK
START:MOV AX,DATA
            MOV DS,AX
                 ;此处输入代码段代码
            MOV AH,4CH
            INT 21H
SUB_NAME  PROC  <TYPE>
                  ;此处输入子程序指令
              RET
SUB_NAME  ENDP.
CODE  ENDS
          END  START

例子:

NAME   E456.ASM
TITLE  DISPLAY-STRING
DATA  SEGMENT                    ;定义数据段
STRING DB ‘HOW DO YOU DO !’,1310,‘$’ ;定义输出字符串,$为串结束符
DATA  ENDS
STACK SEGMENT PARA STACK         ;定义堆栈段
           DW 20H DUP (0)
STACK ENDS
CODE  SEGMENT                    ;定义代码段
          ASSUME CS:CODE,DS:DATA,SS;STACK
START: MOV AX, DATA
            MOV DS, AX           ;置数据段基地址
           CALL DISPLAY          ;调子程序DISPLAY
           MOV AH, 4CH               
           INT 21H               ;并返回DOS
  DISPLAY PROC
       MOV DX, OFFSET STRING
       MOV AH, 99号DOS功能调用,输出字符串
       INT 21H
       RET                       ; 返回子程序调用处
   DISPLAY ENDP
CODE   ENDS
   END START                     ;主程序结束

软件环境
为运行汇编语言程序,需要用到以下工具软件:
(1)编辑程序,如EDIT.COM;
(2)汇编程序,如MASM.EXE;
(3)连接程序,如LINK.EXE;
(4)调试程序,如DEBUG.EXE。
寻址方式
通常,执行一条带有操作数的指令需要指明两个问题,一是进行什么操作?二是操作数在那里?我们将寻找数据和指令存放地址的方式称为寻扯方式。操作数在计算机运行过程中可能存储的物理位置有指令、CPU、存储器、接口等;不同的存储位置所采用的寻址方式不同。
有效地址的组成
如果一个操作数存放在存储器中,那么有效地址可以由以下四部分组成。
1.位移量(displacement)是存放在指令中的一个8位、16位和32位的数,但它不是立即数,而是一个地址。
2.基址(base)是存放在基址寄存器中的内容。它是有效地址中的基址部分,通常用来指向数据段中数组或字符串的首地址。
3.变址(index)是存放在变址寄存器中的内容。它通常用来访问数组中的某个元素或字符串中的某个字符。
直接寻址
例3.2 MOV AX,[2000H]
说明:源操作数采用直接寻址方式,指令码下一字单元的内容2000H为源操作数的EA,操作数存放在存储器中。
执行前:(DS)=3000H,
执行后:(AX)=5050H
例3.3 MOV AX,BUFA
说明:源操作数采用直接寻址方式,指令码下一字单元的内容为变量BUFA的EA,操作数存放在存储器变量BUFA所指向的存储单元中。指令功能是将字类型变量BUFA的内容送入AX之中。
执行前:假定BUFA在数据段中定义,EA=1000H,(DS)=2000H,(AX)=1122H,(21000)=1259H,
执行后:(AX)=1259H
综合例题1
编程实现把buf1存储空间的内容移动到buf2存储空间中去。

STACK  SEGMENT  STACK
       DB 200 DUP(0)
STACK  ENDS
DATA1  SEGMENT
BUF1   DB 20H,21H,22H,23H,24H,25H,26H,27H,28H,29H
DATA1  ENDS
DATA2  SEGMENT
BUF2   DB 10 DUP(0)
DATA2  ENDS
CODE   SEGMENT
  ASSUME
     CS:CODE,DS:DATA1,ES:DATA2,SS:STACK
START: MOV AX, DATA1
      MOV DS, AX
      MOV AX, DATA2
      MOV ES, AX
      MOV SI,OFFSET BUF1 ;BUF1的EA→SI,确定SI指向

   MOV DI,OFFSET BUF2 ;BUF2的EA→DI,确定DI指向
   MOV CX, 10         ;10→CX
NEXT:MOVAL,DS:[SI ;([SI]])→AL
    MOV ES:[DI],AL   ;(AL) →[DI]
    INC SI         ;(SI)+1→SI,SI指针下移 
    INC DI       ;(DI)+1→DI,DI指针下移 
    DEC CX       ;(CX)-1→CX,循环次数减1
    JNZ NEXT       ;若(CX)≠0段内直接跳转NEXT指令处
结束用户程序,返回DOS状态
EXIT:  MOV AH,4CH
      INT 21H
 CODE   ENDS
        END  START 

汇编语句
种类:
汇编语言有3种语句类型,指令语句、伪指令语句、宏指令语句。指令语句是可执行语句,在汇编时可产生供机器执行的二进制目标代码。
例4.1 mov ax, 1000h
反汇编代码:0B10:0100 B80010 MOV AX,1000
伪指令语句是不可执行语句,在汇编时不产生目标代码,汇编程序主要利用它分配存储单元和定义程序段等。
例4.2 X dw 1000h
汇编程序在汇编时为变量X分配1个字存储单元,初值是1000h。
宏指令语句要求先定义后使用,它是一个宏名代替宏体的过程。
键盘输入任一按键,用十进制输出相应按键的ASCII值

CODE SEGMENT
      ASSUME CS:CODE
START: MOV AH, 1
       INT 21H      ;读入一个按键
       MOV AH, 0    ;AX保存按键的ASCII
       MOV BL, 100
       DIV BL       ;ASCII除以100,取百位数字
       MOV CL, AL   ;CL存放百位数字
       ADD CL, 30H  ;CL存放百位数字的ASCII
       MOV AL, AH
       MOV AH, 0
       MOV BL, 10
       DIV BL       ;ASCII除以10,取十位数字
       ADD AL, 30H
ADD AH, 30H
       MOV BX, AX   ;AX存放十位数字和个位数字
       MOV AH, 2
       MOV DL, 13
       INT 21H      ;输出回车
       MOV DL, 10
       INT 21H      ;输出换行
       MOV DL, CL
       INT 21H      ;输出百位数字
       MOV DL, BL
       INT 21H      ;输出十位数字
       MOV BL, BH
INT 21H      ;输出个位数字
       MOV AH, 4CH
       INT 21H
CODE  ENDS 
        END START

计算Z=((W-X)/10*Y)的平方值

DATA SEGMENT
W  DB -128
X  DB 127
Y  DB -100
R  DB 0
Z  DD 0
DATA ENDS
CODE SEGMENT
     ASSUME CS:CODE,DS:DATA,SS:STACK
BEGIN: MOV AX,DATA
       MOV DS,AX
MOV AL,X
       CBW
       MOV BX,AX
       MOV AL,W
       CBW
       SUB AX,BX
       MOV BL,10
       IDIV BL
       MOV R,AH
       IMUL Y
       IMUL AX
       MOV WORD PTR Z,AX
       MOV WORD PTR Z+2,DX
       MOV AH,4CH
       INT 21H
CODE  ENDS
      END BEGIN

以X为首地址的存储单元中存放20个无符号数,试从中找出最大值送入Y单元中

程序编写如下:
DATA      SEGMENT
X         DB  11221324567678556444
          DB  56646345433247899969
Y         DB ?
DATA      ENDS
CODE      SEGMENT
  ASSUME  CS:CODE,DS:DATE
MAIN      PROC  FAR
START:   PUSH  DS
          MOV  AX,0
          PUSH  AX
MOV  AX,DATA
          MOV  DS,AX
          MOV  AL,X
          MOV  BX,OFFSET X
          MOV  CX,19  ;置比较次数
  L1:   INC  BX
         CMP  AL,[BX]
         JAE  L2
         XCHG  AL,[BX]
  L2:   LOOP  L1
         MOV  Y,AL
         RET
MAIN     ENDP
CODE     ENDS
         END  START

汇编语言高级编程
1、宏汇编
2、结构和记录
3、32位字长编程
4、汇编语言混合编程
汇编语言高级编程汇编语言高级编程

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值