Java教程

微机笔记3——汇编语言程序设计

本文主要是介绍微机笔记3——汇编语言程序设计,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

汇编语言基本元素

汇编语言的语句格式

[标识符] 指令助记符 [操作数] [;注释]

  • 标识符 : 给指令或某一存储单元地址所起的名字称为标识符
  • 指令助记符 :表示不同操作的指令
  • 操作数 : 指令执行的对象,可能有一个、两个、没有或者多个
  • 注释

汇编语言运算符

  • 算术、逻辑、关系运算符 eg:+、-、×、 / 、 AND、OR、LT

  • 取值运算符
    a) $ 运算符
    $:当前地址偏移量的值
    b) SEG 和OFFSET
    SEG: 求标号或变量的段地址
    OFFSET: 求标号或变量的偏移地址
    c) TYPE 返回标号或存储器操作数的类型值
    在这里插入图片描述
    d) LENGTH和SIZE(对用DUP定义数据的情况下)
    LENGTH:返回一个与存储器操作数相联系的基本数据个数
    SIZE:返回一个为存储器操作数分配的字节数
    关系:SIZE=LENGTH × TYPE

  • 属性运算符
    用来给指令中的操作数指定一个临时的属性,而暂时忽略操作数定义时的属性。
    PTR 定义操作数为新的类型
    一般格式:类型 PTR 操作数
    功能:建立一个存储器操作数,它与其后的存储器操作数有相同的段地址和偏移地址,但有不同的类型。

表达式

1) 常数
二进制(B),八进制(Q),十六进制(H),十进制(D)(默认),字符和字符串
2)常量操作数
3)存储器操作数
存储器操作数有三个属性:

  1. 段属性(SEG) : 所对应存储单元的段地址
  2. 偏移量属性(OFFSET) :所对于存储单元在所在段内的偏移地址(距段起点的字节数)
  3. 类型属性(TYPE)
    变量的类型是占用存储单元的字节数,分为: DB(1个字节)DW(2个字节)DD(4个字节)
    标号的类型则反映了相应存储单元地址在作为转移或调用指令的目标操作数时的寻址方式,可
    有两种情况,即NEAR和FAR
    4)常量表达式 例如 PORT、VAL+1、OFFSET SUM 、SEG SUM 、 TYPE CYCLE
    5)地址表达式 例如 SUM+2、CYCLE-5

汇编语言程序汇编步骤

1)编写源程序;2)汇编;3)连接;4)调试。

伪指令

数据定义伪指令

DB:定义字节,其后的每个操作数占有一个存储单元,连续存放;
DW:定义字,其后的每个操作数占有两个字节;
DD: 定义双字,其后每个操作数占4个字节;
若仅保留单元,不初始化,用?代替初值; ARRAY DB 100 DUP(?)
若数据重复,用 n DUP( )代替,n为重复次数。DATA1 DB 100 DUP(‘AB’)

符号定义伪指令

① EQU伪指令给符号定义一个值。在程序中,凡是出现该符号的地方,汇编时均用其值代替。
一般格式:标识符 EQU 表达式
TIMES EQU 50
DATA DB TIMES DUP (?)
②PURGE伪指令用来释放由EQU伪指令定义的变量,这样这些变量就可以被重新定义。
PURGE TIME
TIME EQU 100
用EQU伪指令定义的变量值在程序运行过程中不能改变,若要改变这些变量的值必须
先由PURGE伪指令释放,再重新定义。
③“=”伪指令也可给变量赋值。使用“=”伪指令定义的变量值不用释放就可重新定义。
一般格式:标识符 = 表达式
BETA = TIMES-2
BETA = TIMES+5 ;重新赋值

段定义伪指令

段名 SEGMENT [定位类型][组合类型][类别]
段名 ENDS

  • 定位类型:表示本段起始地址位于何处
    每256个地址为一页(PAGE),每页的起始地址为二进制:
    **** **** **** 0000 0000
    16进制:00H
    每16个地址为一段(PARA),每段的起始地址为二进制:
    * **** **** **** 0000
    16进制:****0H
    段是默认的定位类型。
    每2个地址为一个字(WORD),每个字的起始地址为偶数;
    最基本的类型是字节(BYTE),每个字节只包含一个地址,可以是内存的任何空间。
  • 组合类型
    NONE: 表示本段与其他段不发生任何关系,该段有自己的段基址,是默认的组合关系。
    PUBLIC:在满足定位类型的前提下与其他模块的同名段连接在一起,形成一个新的逻辑段,共用一个段基址。
    COMMON: 表示产生一个覆盖段。连接时,把本段与其他也用COMMON说明的同名段置成相同的起始地址,重叠在一起,共享相同的存储区,其段长度由最长的段确定。
    STACK: 在每个汇编程序中,只能必须有一个堆栈段,连接时,将本段与其他也用STACK说明的同名段连接成一个连续的STACK段,编译程序自动初始化SS和SP寄存器,使SS的内容为该连续段的段基址,SP指向堆栈底部加1的存储单元。
    MEMORY: 表示本段在存储器中应定位在所有其他段的最高地址。以首先遇到的具有memory组合类型的段为准,其他段认为是common型的
    AT<表达式>: 表示本段从表达式指定的地址处开始装入,这样,在程序中用户就可以直接定义段地址,这种方式不适用于代码段。
  • 类别
    是用单引号括起来的字符串,以表明该段的类别,如代码段(CODE)、数据段(DATA)、堆栈段(STACK)等

设定段寄存器伪指令

一般格式:ASSUME 段寄存器:段名[,段寄存器:段名,…]
功能:通知汇编程序,哪一个段寄存器是该段的段寄存器,以便对使用变量或标号的指令汇编出正确的目的代码。

  注意 :在装入程序中DS寄存器由于被用作其它用途,因此,在用户程序中必须用两条指令对DS进行初始化,以装入用户的数据段段地址。当使用附加段时,也要用MOV指令给ES赋段地址。
  CODE  SEGMENT
  ASSUME    CS:CODE,DS:DATA,SS:STACK
  MOV    AX,DATA  ;DATA段值送AX
  MOV  DS,AX   ;AX内容送DS,DS才有实际段值
  CODE  ENDS 

过程定义伪指令

在程序设计中,可将具有一定功能的程序段看成为一个过程(相当于一个子程序),它可以被别的程序调用。
过程名 PROC [类型] ; 类型由FAR和NEAR来确定,如果缺省类型,则默认为近过程。
过程体
RET ; 过程体内至少有一条RET指令
过程名 ENDP
注意 : PROC和ENDP要成对出现。
call 调用过程

宏指令

宏指令定义格式:
宏指令名 MACRO <形参列表>
汇编程序段(宏体)
ENDM

定位伪指令

功能:指定在其后的指令或数据存放的偏移地址。
格式:ORG 表达式
CODE SEGMENT
ORG 0100H
MOV AX, 0
CODE ENDS ; 指定MOV指令放在代码段中偏移地址为0100H开始的位置。
DATA SEGMENT
ORG 2000H
NUM DB 0,5
DATA ENDS ; 指定NUM指向数据段中偏移地址为2000H开始的位置。

汇编结束伪指令

一般格式: END 表达式

汇编程序设计

顺序、分支、循环程序设计

子程序设计

入口参数:由主程序传给子程序的参数
出口参数:子程序运算完传给主程序的结果。

参数传递方法

  • 利用寄存器 : 最常见方法,把所需传递的参数直接放在主程序的寄存器中传递给子程序。
  • 利用存储单元 ; 把所需传递的参数直接放在子程序调用指令之后或通过数据区传递。
  • 利用堆栈 : 将参数压入堆栈,在子程序运行时从堆栈中取参数.

DOS功能调用

1)在显示器上显示单个字符(2号功能)
功能:在屏幕的光标处显示单个字符
入口参数:要显示字符的ASCII码放在DL中
出口参数:无
MOV DL, ‘A’ ; 显示字符A
MOV AH, 2 ; 提供调用功能号
INT 21H ; 系统功能调用
2)在屏幕上显示字符串(9号功能)
功能:在屏幕上当前光标处输出存储在内存数据段的一串字符串,该字符串以‘ ’ 结 束 。 入 口 参 数 : D S : D X 指 向 欲 显 示 字 符 串 的 首 址 出 口 参 数 : 无 D A T A S E G M E N T S T R I N G D B ‘ I a m a s t u d e n t . ’结束。 入口参数: DS:DX指向欲显示字符串的首址 出口参数:无 DATA SEGMENT STRING DB ‘I am a student. ’结束。入口参数:DS:DX指向欲显示字符串的首址出口参数:无DATASEGMENTSTRINGDB‘Iamastudent.’
DATA ENDS
MOV DX, OFFSET STRING ; 指向字符串首址
MOV AH, 9 ; 提供调用功能号
INT 21H ; 系统功能调用
3) 带显示的键盘输入(1号功能)
功能:等待键盘输入,直到按下一个键。
入口参数:无
出口参数:键入键的ASCII码放在AL中,并在屏幕上显示该键。
MOV AH, 1 ; 提供调用功能号
INT 21H ; 系统功能调用 ; 程序运行到此停下,等待用户键盘输入
MOV [2000H], AL ; 用户从键盘键入的键的ASCII码进入AL中
4)不带显示的键盘输入(7号功能)
功能:等待键盘输入,直到按下一个键。
入口参数:无
出口参数:键入键的ASCII码放在AL中,但在屏幕上没有显示,常用于输入密码。
MOV AH, 7 ; 提供调用功能号
INT 21H ; 系统功能调用
MOV [2000H], AL
该功能与1号功能类似,只是字符不在屏幕上显示。
5)字符串输入(10号功能)
功能:等待从键盘输入一串字符到存储区的数据段,直到按下回车结束输入。
入口参数:DS:DX指向接收字符串的内存地址的首址,该地址的第一个字节是由用户设置的可输入字符串的最大字符数(含回车)
出口参数:存放输入字符串存储区的第二个字节是实际输入的字符数(不含回车),实际输入的字符串从该存储区的第三个字节处开始存放。
6)程序结束返回DOS( 4C号功能 )
功能:将控制权移交DOS。
入口参数:无
出口参数:无
MOV AH, 4CH
INT 21H

这篇关于微机笔记3——汇编语言程序设计的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!