汇编语言程序设计14章

合集下载

汇编语言程序设计

汇编语言程序设计

汇编语⾔程序设计第4章汇编语⾔程序设计§4.1 汇编语⾔的模式⼀、汇编语⾔源程序的⼀般模式[Name 模块名][Title 标题][定义宏][定义数据段][定义附加段][定义堆栈段]定义代码段源程序结束中括号括起的部分可以省略,可见在⼀个汇编语⾔源程序中必须要定义代码段,并且必须有源程序结束指令。

⼆、8086汇编语⾔程序的⼀个例⼦Pg90。

§4.2 语句⾏的构成汇编语⾔中的语句⼀般分为两种类型:指令性语句和指⽰性语句。

指令性语句的格式为:[标号:] 助记符 [操作数1[,操作数2]] [;注释]指⽰性语句的格式为:[名称] 助记符 [参数1,参数2,……] [;注释]标号和名称都是编程⼈员根据需要和⼀定的规则任意取的。

也可以认为汇编语⾔的语句⾏是由标记和分隔符(空格)构成。

⼀、标记1.IBM宏汇编的字符集(1)字母(2)数字符(3)特殊字符2.界符⽤于定界⼀个标记的结束或⼀个标记的开始,本⾝具有⼀定的意义。

3.常量出现在汇编语⾔源程序中的固定值称为常量。

(1)数值常量①⼆进制:以字母B结束。

②⼗进制:以字母D或⽆字母结束。

③⼋进制:以字母Q(或O)结束。

④⼗六进制:以字母H结束。

(2)字符常量指⽤单引号或双引号引起的字符或字符串。

4.标识符由程序员⾃⼰建⽴的字符序列(标号或名称)。

⼀个标识符不能超过31个字符,不能以数字开头。

5.保留字汇编语⾔中具有特殊意义的字符序列。

6.注释⼀⾏中分号以后的部分。

⽤于对⼀段或⼀⾏程序进⾏说明,便于阅读和理解。

⼆、符号具有⼀定意义的字符序列。

1.寄存器名2.变量段属性、偏移属性、类型属性3.标号段属性、偏移属性、类型属性4.常数5.其它三、表达式由操作数和运算符组合⽽成的序列。

1.操作数(1)⽴即数(2)寄存器操作数(3)存储器操作数2.运算符(1)算术运算符+、-、*、/、MOD(求余)(2)逻辑运算符AND、OR、NOT、XOR(3)关系运算符EQ、NE、LT、LE、GT、GE结果为“假”时,返回0,结果为“真”时,返回⼆进制全1。

新版汇编语言程序设计习题答案(钱晓捷主编)电子教案

新版汇编语言程序设计习题答案(钱晓捷主编)电子教案

新版汇编语言程序设计习题答案(钱晓捷主编)新版汇编语言程序设计习题答案(钱晓捷主编)第一章汇编语言基础知识1.1、简述计算机系统的硬件组成及各部分作用1.2、明确下列概念或符号:主存和辅存,RAM和ROM,存储器地址和I/O端口,KB、MB、GB和TB1.3、什么是汇编语言源程序、汇编程序、目标程序?1.4、汇编语言与高级语言相比有什么优缺点?1.5、将下列十六进制数转换为二进制和十进制表示(1)FFH (2)0H (3)5EH (4)EFH(5)2EH (6)10H (7)1FH (8)ABH1.6、将下列十进制数转换为BCD码表示(1)12 (2)24 (3)68 (4)127(5)128 (6)255 (7)1234 (8)24581.7、将下列BCD码转换为十进制数(1)10010001 (2)10001001 (3)00110110 (4)10010000(5)00001000 (6)10010111 (7)10000001 (8)000000101.8、将下列十进制数分别用8位二进制数的原码、反码和补码表示(1)0 (2)-127 (3)127 (4)-57(5)126 (6)-126 (7)-128 (8)681.9、完成下列二进制数的运算(1)1011+1001 (2)1011-1001 (3)1011×1001 (4)10111000÷1001(5)1011 ∧~1011 (8)1011 ⊕ 1001 1001(6)1011 ∨1001(7)1.10 数码0~9、大写字母A~Z、小写字母a~z对应的ASCII码分别是多少?ASCII码为0dh、0ah对应的是什么字符?1.11、计算机中有一个“01100001”编码,如果把它认为是无符号数,它是10进制什么数?如果认为它是BCD码,则表示什么数?又如果它是某个ASCII码,则代表哪个字符?1.12、简述Intel 80x86系列微处理器在指令集方面的发展。

汇编语言程序设计

汇编语言程序设计

第4章 汇编语言程序设计
例4.4 显示两位压缩BCD码值(00~99) ,要求不显示前导0。 本例一方面要排除前导0的情况,另一方面 对于全0情况又必须显示一个0,所以形 成了两个双分支结构的程序。
第4章 汇编语言程序设计 DATA SEGMENT BCD DB 04H ; 给出一个BCD码数据 DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA BEGIN: MOV AX, DATA MOV DS, AX MOV DL,BCD ;取BCD码 TEST DL,0FFH ;如果这个BCD码是0,则显示为0 JZ ZERO TEST DL,0F0H ;如果这个BCD码高位是0,不显示 JZ ONE MOV CL,4 ;BCD码高位右移为低位 SHR DL,CL OR DL,30H ;转换为ASCII码 MOV AH,2 ;显示 INT 21H
第4章 汇编语言程序设计 ADC MOV MOV MUL ADD DX,0 W+4,DX AX,A B+2 W+2,AX ;部分积2的高16位与进位相加 ;结果保存到从W+4开始的内存单元 ;取被乘数的低16位 ;与乘数的高16位相乘,得到部分积3 ;部分积3的低16位与W+2开始的内存单元相加 ;结果保存在从W+2开始的内存单元 ;部分积3的高16位与W+4开始的内存单元及 ;进位相加,结果保存在从W+4开始的内存单元 ;把进位值保存在从W+6开始的内存单元 ;取被乘数的高16位 ;与乘数的高16位相乘,得到部分积4 ;部分积4的低16位与W+4开始的内存单元相加 ;结果保存在从W+4开始的内存单元 ;部分积4的高16位与W+6开始的内存单元及 ;进位相加,结果保存在从W+6开始的内存单元

第四章 汇编语言程序设计

第四章 汇编语言程序设计

一、算术运算符
包括:+,-,*,/(取商),MOD(取余),SHL,SHR 特点:①运算对象及结果均为整数 ②地址只能加减 例: DA1 DA2 MOV MOV MOV MOV DB 1,2,3,4 DB 20 AX,30*5 汇编时 AL,31MOD5 AL,31/5 AL,DA2-DA1
MOV MOV MOV MOV
如:加法:1001、1D、2B……
特点:计算机能够直接识别,执行速度快;
但不方便记忆和编程
2、汇编语言(Assembly Language) 用助记符来表示指令,如:加法:ADD…… 特点:机器不能识别,需翻译;但仍然面向硬件, 执行速度较快;多用于编制系统程序、实时控制和通 信程序。 3、高级语言(High-level Language) 用数学语言和自然语言编程; 如:加法:+,输出:Printf… 特点:编程方便简单,无需了解机器硬件;但机器 不能识别,需要庞大的翻译系统,速度较慢。
类型 返回值 1 2 4 类型 返回值 -1 [FFH] -2 [FEH] DB DW DD
变量
标号
NEAR FAR
数值返回运算符(续)
LENGTH:
•对于一般变量,返回1; •对于DUP定义的变量,返回单元数(直接返回第一
个DUP前的N值); 说明:DUP为复制操作符,格式:N DUP(表达式); N表示复制次数,表达式为复制内容 例:2 DUP(1,2) 等价于 1,2,1,2
则:COUNT的值为5
COUNT表示:DA1,DA2占的字节总数(长度之和) 七、优先级(P136 表4-3)
4.3 伪指令语句
在汇编时进行处理,主要完成变量定义,段定义,
段分配,指示程序开始和结束等功能。

IBM-PC汇编语言程序设计课后习题答案

IBM-PC汇编语言程序设计课后习题答案

第五章试编写一个汇编语言程序,要求对键盘输入的小写字母用大写字母显示出来。

答:程序段如下:BEGIN: MOV AH, 1 ;从键盘输入一个字符的DOS调用INT 21HCMP AL, ‘a’ ;输入字符<‘a’吗JB STOPCMP AL, ‘z’ ;输入字符>‘z’吗JA STOPSUB AL, 20H ;转换为大写字母,用AND AL, 1101 1111B也可MOV DL, AL ;显示一个字符的DOS调用MOV AH, 2INT 21HJMP BEGINSTOP: RET编写程序,从键盘接收一个小写字母,然后找出它的前导字符和后续字符,再按顺序显示这三个字符。

答:程序段如下:BEGIN: MOV AH, 1 ;从键盘输入一个字符的DOS调用INT 21HCMP AL, ‘a’ ;输入字符<‘a’吗JB STOPCMP AL, ‘z’ ;输入字符>‘z’吗DEC AL ;得到前导字符MOV DL, AL ;准备显示三个字符MOV CX, 3DISPLAY: MOV AH, 2 ;显示一个字符的DOS调用INT 21HINC DLLOOP DISPLAYSTOP: RET将AX寄存器中的16位数分成4组,每组4位,然后把这四组数分别放在AL、BL、CL和DL中。

答:程序段如下:DSEG SEGMENTSTORE DB 4 DUP ()DSEG ENDS┇BEGIN: MOV CL, 4 ;右移四次MOV CH, 4 ;循环四次LEA BX, STOREA10: MOV DX, AXAND DX, 0FH ;取AX的低四位MOV [BX], DL ;低四位存入STORE中INC BXSHR AX, CL ;右移四次JNZ A10 ;循环四次完了码B10: MOV DL, STORE ;四组数分别放在AL、BL、CL和DL中MOV CL, STORE+1MOV BL, STORE+2MOV AL, STORE+3STOP: RET试编写一程序,要求比较两个字符串STRING1和STRING2所含字符是否完全相同,若相同则显示‘MATCH’,若不相同则显示‘NO MATCH’。

微机原理与接口技术-汇编语言程序设计

微机原理与接口技术-汇编语言程序设计

4.1.2 8086汇编语言源程序的格式
源程序的一般格式为: NAME1 SEGMENT
语句 语句 NAME1 ENDS NAME2 SEGMENT 语句 语句 NAME2 ENDS END <标号>
第四章 汇编语言 程序设计
4.2 语句的格式
第四章 汇编语言 程序设计
汇编语句分为指令语句和伪指令语句两类,一般都由分 隔符分成的 4 个部分组成。
HLT
;然后停机
NOT DONE : IN AL, PORT_VAL ;未超过时,输入下一字节
ADD SUM, AL
;与以前的结果累加
JMP CODE ENDS ;代码段结束
END START
;整个程序结束
可以看到,8086汇编的一个语句行是由4个部分组成,即
标号 操作码 操作数 ;注释(或名字)
普通高等学校计算机教育“十三五”
微机原理与接口技术
内容导航
CONTENTS
4.1 汇编语言的格式 4.2 语句的格式 4.3 伪指令语句 4.4 指令语句 4.5 汇编语言程序设计及举例
4.1 汇编语言的格式
4.1.1 8086汇编语言的一个例子
第四章 汇编语言 程序设计
MY_DATA SEGMENT ;定义数据段
SUM DB ?
;为符号 SUM 保留一个字节
MY_DATA ENDS
;定义数据段结束
MY_CODE SEGMENT ;定义码段
ASSUME CS :MY_CODE, DS :MY_DATA
;规定 CS 和 DS 的内容
PORT_VA1 EQU 3
;端口的符号名
START :MOV AX, MY_DATA ;DS 初始化为 MY_DATA

汇编语言程序设计(5)

15
例:
第 4 章 汇编语言程序设计简介
ORG 1000H
BUF1: DB 38H, 7FH, 80H
BUF2: DB 45H, 66H
ORG伪指令指定了标号BUF1的地址为1000H, 而DB伪 指令是将其后的二进制数表38H, 7FH, 80H依次存放在1000H, 1001H, 1002H 3 个连续单元之中, BUF2也是一个标号, 其地 址与前一条伪指令连续, 即1003H, 1004H地址单元中依次存 放 45H, 66H。
如果在程序中要多次使用到某一地址,由EQU指令将其赋值 给一个字符名称,一旦需要对其进行变动,只要改变EQU命 令后面的数字即可,而不需要对程序中涉及到该地址的所有 指令逐句进行修改。
13
第 4 章 汇编语言程序设计简介
注意, 由EQU等值的字符名称必须先赋值后使用,且 在同一个源程序中,同一个标号只能赋值一次。 例:
H)=10H。
18
第 4 章 汇编语言程序设计简介
六、BIT——位地址符号指令
指令功能为:将位地址赋值给指定的符号名称,通常用于位符 号地址的定义。
指令如下:
字符名称 BIT 位地址
例如,X1 BIT P1.0
汇编结果为将位地址P1.0赋给变量X1,即在程序中便可 使用X1代替位地址P1.0。
19
(c)多分支
30
第 4 章 汇编语言程序设计简介
2. 一般分支程序结构实例
【例5】 x, y均为8位二进制数, 设 x存入R0, y存入R1, 求解:
1 y 1
0
x0 x0 x0
31
第 4 章 汇编语言程序设计简介
程序如下:
START:
CJNE R0,#00H,SUL1

MCS-51汇编语言程序设计


01:31
单片机原理与接口技术(第2版).李晓林.电子工业出版社
返回目录
2
本章目录
4.2.1 顺序结构程序 4.2.2 分支结构程序 4.2.3 循环结构程序 4.2.4 查表程序 4.2.5 子程序 4.3 汇编语言程序设计实例 习题与思考题
4.1 程序设计概述 4.1.1 程序设计的步骤 4.1.2 程序设计的方法 4.1.3 汇编语言的规范 4.1.4 汇编语言程序编辑和 汇编 4.2 结构化程序设计方法
01:31
单片机原理与接口技术(第2版).李晓林.电子工业出版社
返回目录
15
4.1.3 汇编语言的规范
(5)定义字伪指令 )定义字伪指令DW
[标号:] 标号: DW 16位二进制数表 16位二进制数表
---伪指令 伪指令DW 伪指令
功能: DW 指令是在程序存储器 ( ROM ) 中 , 从指定的 指令是在程序存储器( 功能 : DW指令是在程序存储器 ROM) 地址单元开始,定义若干个16位数据 一个16位数 位数据。 地址单元开始,定义若干个16位数据。一个16位数 要占两个存储单元,其中高8位存入低地址单元, 要占两个存储单元, 其中高 8位存入低地址单元, 位存入高地址单元。 低8位存入高地址单元。 例如: 例如: ORG 1100H 1100H TAB : DW 1234H, 0ABH 10 1234H, 以上伪指令经汇编以后, 将对从1100H 以上伪指令经汇编以后 , 将对从 1100H 开始的若 干内存单元赋值。 干内存单元赋值。
01:31
单片机原理与接口技术(第2版).李晓林.电子工业出版社
返回目录
16
4.1.3 汇编语言的规范
例如:ORG 1100H 例如: TAB :DW 1234H, 0ABH 10 (1100H)=12H (1101H)=34H (1102H)=00H (1103H)=ABH (1104H)=00H (1105H)=0AH

汇编语言程序设计复习

知识点第一章基础知识(1)正负数的补码表示, 掌握计算机中数和字符的表示;eg.假设机器字长为8位,[+3]补=00000011B,[-3]补= 11111101 H 。

十六进制数0FFF8H表示的十进制正数为65528D,表示的十进制负数为-8D。

8位二进制数被看成是带符号补码整数时,其最小值是-128,最大值是 127 。

第二章80x86计算机组织(1)中央处理机CPU的组成和80x86寄存器组,重点:专用寄存器,段寄存器eg: IP寄存器中保存的是?代码段中的偏移地址FLAGS标志寄存器中共有几位条件状态位6位,有几位控制状态位2位,标志寄存器分为哪2类?陷阱标志,中断标志。

(2)存储单元的地址和内容每一个字节单元给以一个唯一的存储器地址,称为物理地址;一个存储单元中存放的信息称为该存储单元的内容。

存储器地址的分段,(低位字节存放)低地址,(高位字节存放)高地址;实模式下逻辑地址、选择器和偏移地址;物理地址的表示段基地址加上偏移地址。

eg.如果SS=6000H,说明堆栈段起始物理地址是_____60000H___。

已知字节(00018H)=14H,字节(00017H)=20H,则字(00017H)为__1420H______。

如果(SI)=0088H,(DS)=5570H,对于物理地址为55788H的内存字单元,其内容为0235H,对于物理地址为5578AH的内存字单元,其内容为0E60H,那么执行指令LDS SI,[SI]以后,(SI)= 0235H ,(DS)= 0E60H .第三章80x86的指令系统和寻址方式与数据有关的寻址方式(立即寻址方式,寄存器寻址方式,直接寻址方式,寄存器间接寻址方式,寄存器相对寻址方式,基址变址寻址方式,相对基址变址寻址方式)和与转移地址有关的寻址方式(段内直接寻址,段内间接寻址,段间直接寻址,段间间接寻址)。

数据传送指令(通用数据传送指令、累加器专用传送指令、输入输出指令)、算术指令(加法指令、减法指令(*加减指令对4个标志位的影响[of,cf,sf,zf])、乘法指令(*乘法指令的要求:目的操作数必须是累加器)、除法指令(*被除数在累加器中,除法指令执行完以后,商和余数在?))、逻辑指令(逻辑运算指令(*XOR,AND,OR,TEST指令及指令执行后对标志位的影响)、移位指令)、串处理指令(与REP相配合工作的MOVS、STOS、LODS 指令,与REPE/REPZ和REPNE/REPNZ联合工作的CMPS、SCAS指令)、控制转移指令(无条件转移指令、条件转移指令、循环指令、子程序调用指令、中断)。

汇编语言程序设计

第四章汇编语言程序设计(assembly languageprogramming)§4.1 汇编语言(assembly language)一.概述汇编语言:一种符号语言,它用助记符表示指令的操作码和操作数,用标号或符号代表地址、常量和变量,与机器语言几乎一一对应汇编语言程序:用汇编语言编写的程序汇编:把汇编语言源程序翻译成机器语言目标程序的过程汇编语言源程序手工汇编或汇编程序机器语言目标程序汇编程序:用来完成汇编工作的程序,有小汇编ASM宏汇编MASM动态调试程序DEBUG二.汇编语言的语句格式: [名称] 指令助记符 [操作数] [;注释]带方括号的项有时可没有,注释项完全可以没有每个部分用空格分开每行最多可有132个字符,但最好不要超过屏宽80语句可分成指令性语句和指示性语句(伪指令语句)指令性语句汇编后可生成机器码[标号:] 指令助记符 [操作数] [;注释]指示性语句指示汇编程序处理一些工作[名称] 伪指令(指示符) [操作数] [;注释]1.名称(或称标识符)给指令或存储单元地址起的名字,由字母、数字、字符组成字母:A~Z ,a~z数字:0~9字符:可打印+-*/=()[]〈〉;.' ’ ,_:?@$&(非打印空格制表符TAB 回车换行)(界符:,;:.()[]〈〉+-*/=?_@&$' ’界符用来表示某个标志的结束)数字不能作名称的第一个字符,圆点.仅能作第一个字符保留字不能作标识符($、?是保留字,与其它字符组合除外)名称最长为31个字符当名称后跟冒号,表示该名称是其后指令的标号,代表该指令的开始地址,其他指令可以用该标号作为转移地址当名称不跟冒号,它可能是标号或变量名,伪指令前的名称不跟冒号冒号隐含NEAR属性,例:供段内调用写成 OUTPUT:OUT DX ,AL供段间调用写成 OUTPUT OUT DX ,AL2.指令助记符8086/8088指令,也可以是伪指令,如果指令有前缀(LOCK、REP等)则前缀和指令用空格分开3.操作数指令执行的对象,可能有一、二个或没有名称指令助记符操作数注释RET ;返回(无操作数)COUNT: INC CX ;CX加1(1个操作数)MOV AL,BL ;ALBL(2个操作数)伪指令可有多个操作数COST DB 3,4,5,6,7,8 ;(6个操作数,用逗号分开)操作数可以是常数、寄存器名、标号、变量、表达式,MOV AX,[BP+4];(第二个操作数为表达式)4.注释可选项,使程序易读,汇编时不作处理注释前面要加分号,它可位于操作数之后,也可位于行首三.常量与变量1.常量,也叫常数,没有属性的纯数,汇编时已确定的值·数字常量为0~65535中的数(16位寄存器使用,伪操作可定义32位),进制加后缀说明,十进制加D(可省),二进制加B,八进制加Q,十六进制加H,若十六进制第一位为字母,则前头应加0·字符和字符串叫串常量,是ASCII码字符串,必须加单(或双)引号例:‘A’,“ABC”,汇编后变成41H,414243H2.变量,用于表达数值(或串)的标识符,有三个属性① 段属性(SEGMENT)② 偏移地址属性(OFFSET)③ 类型属性(TYPE),用DB、DW、DD定义§4.2 伪指令(pseudo-instruction)一.符号定义伪指令1.等值EQU格式:符号名 EQU 表达式用来给符号定义一个值,程序中出现该符号就用其值代替,EQU只能定义一次DATA EQU 1234 ;代表一个数XYZ EQU ALPHA[SI] ;代表一个地址2.等号 =格式:符号名 = 表达式意义与EQU一样,但程序中可重新定义符号的值EMP = 6 ;EMP代表6EMP =EMP + 1 ;EMP现在代表73.解除PURGE格式:PURGE 符号名(符号1,符号2,……,符号n)用于解除所定义的符号使该符号在以后的定义中有效例:原定义 TAB EQU 5可用 PURGE TAB 来解除然后可重新定义 TAB EQU 10二.数据定义伪指令用于预置存储器或定义变量1.定义字节DB格式:[变量名称] DB 表达式例:DATA1 DB 2,3,4,5;从DATA1单元开始存放4字节数据2.定义字DW格式:[变量名称] DW 表达式例:TAB DW 1234H;TAB单元内容为34H,TAB+1单元内容为12H 3.定义双字DD格式:[变量名称] DD 表达式每个数据二字(四字节)低位部分在低地址,高位部分在高地址·用DB/DW/DD定义的数每行不得超过16项,超过16项必须换行DB/DW/DD用法<1> SUM DB ? ;给SUM单元分配一个字节,内容未定<2> TAB DB 20 DUP(0);给TAB开始单元分配20字节,内容为0<3> TIME DW 100 DUP(?);给TIME开始单元分配100字,内容未定<4> ADDR DD TABLE ;TABLE的地址(双字)给ADDR例:DATA SEGMENTORG 100HTABLE DB 1,2,3,4ADDR DD TABLEDATA ENDS假设汇编后DS=13A2H(如果ADDR用DW定义,只得偏移量)(如果TABLE是变量,ADDR得地址,是常量,ADDR得数值)<5> LETTER DB ‘ABCDEFG’;将字符串以ASCII码形式填入LETTER开始的内存<6> HIS DB 3 DUP(‘WELCOME!’,0DH,0AH);从HIS单元开始重复3次存放WELCOME!和回车换行符4.标号LABEL格式:标号名 LEBEL 类型标号用于说明可执行代码在汇编语言程序中的位置,即符号地址,供调用和转移之用标号有三个属性段属性偏移量属性距离属性(即格式中的类型):NEAR(近程)和FAR(远程)NEAR:本标号为段内标号,调用本标号只提供偏移地址,段基址为当前代码段FAR:本标号为段间标号,调用本标号提供偏移地址和段基址一个具有NEAR属性的标号也可用标号加冒号作后缀,并排列在代码行的开头来隐含如 AGAIN LABEL NEARXOR AX,BUFF[BX]可写成 AGAIN:XOR AX,BUFF[BX]例:ROOT LABEL NEAR ;以下程序所用的ROOT标号是段内属性COMP PROC NEAR ;以下程序所用的过程下的标号是段内属性TIME PROC FAR ;以下程序所用的过程下的标号是段间属性三.运算符1.算术运算符+、-、*、/、MOD即加、减、乘、除、除法取余数(如19 MOD 7=5)操作数是数字,结果也是数字存储器地址运算时只有加减,例TAB+2、BETA-5等2.逻辑运算符AND、OR、XOR、NOT即与、或、异或、非操作数是数字,结果也是数字例:AND BX,DAT AND 0FEH3.关系算符EQ、NE、LT、GT、LE、GE即相等、不等、小于、大于、小于等于、大于等于若关系是假结果为0,若关系是真结果为0FFFFH例:MOV BX,PAD LT 3则PAD的值小于3时,汇编成MOV BX,0FFFFH否则,汇编成MOV BX,04.分析运算符可把存储器操作数分解成它的组成部分,如段值、段内偏移量、类型5.合成算符由已存在的存储器操作数生成一个段值与偏移量相同,而类型不同的新的存储器操作数以下讨论分析算符和合成算符1.取段基址SEG它加于一个变量或标号之前,回送段基址,例:ASSUME CS:SEG BEGIN ;令CS为BEGIN程序段段基址MOV AX,SEG VARN ;将VARN的段基址送AX2.取偏移量OFFSET它加于一个变量或标号之前,取其偏移量,例:MOV BX,OFFSET SUM ;将SUM的段内偏移量存入BX3.取类型码TYPE它加于一个变量或标号之前,取其类型代码DB DW DD DQ DT NEAR FAR1 2 4 8 10 -1 -2例:NG1 DB ‘A’,‘D’,3NG2 DW 88,265……MOV AL,TYPE NG1 ;NG1定义字节,AL 1MOV AL,TYPE NG2 ;NG2定义字,AL 24.取长度LENGTH它加于一个变量之前,取分配给变量的项数例:TAB DB 150 DUP(?);150项,150字节FUM DW 150 DUP(?);150项,300字节则,MOV CX,LENGTH TAB ;CX 150MOV AX,LENGTH FUM ;AX 150·注意:LENGTH返回的存储区必须用DUP()来定义,否则返回为1 5.取字节数SIZE它加于一个变量之前,取回变量所占字节总数,有SIZE = LENGTH * TYPE由上例,LENGTH TAB = 150,TYPE TAB = 1LENGTH FUM = 150,TYPE FUM = 2可知: SIZE TAB = 150SIZE FUM = 300以上5个叫数值返回算符6.类型指示PTR格式:类型 PTR 地址表达式表示PTR右边的(存储器)操作数是左边的类型,有:BYTE、WORD、DWORD、NEAR、FAR例:INC BYTE PTR [BX] ;将BX指向的单元字节加1MOV WORD PTR [DI],99 ;立即数99送DI指向的字中JMP NEAR PTR FOK ;以近程方式跳转到FOK(只取FOK偏移地址)7.指定符THIS(合成算符)用于定义当前所指单元中的类型格式:THIS 类型/距离经THIS定义过的标号具有当前汇编段、偏移量和所规定的类型或距离等属性,例:FOOB EQU THIS BYTE;下面的字类型变量FOOW在这里指定为字节型FOOBFOOW DW 120 DUP(?)定义后,对同一数据块(FOOB和FOOW有相同的段和段内偏移量)有两种类型访问FOOB时为字节操作,访问FOOW时为字操作ADD AL,FOOB[3] ;将数组第四字节与AL相加MOV AX,FOOW[4]将数组第五六字节组成的字送AX也可以这样来构成FOOB:FOOB EQU BYTE PTR FOOW又例:DATAF EQU THIS FARDATAN:MOV AX,FOO这时 JMP DATAN为近程转移JMP DATAF为远程转移8.段修改符:用于对某一地址表达式指定临时段基址,如MOV AX,ES:[BX];指定ES为BX的段基址,对当前指令有效9.短程符SHORT与NEAR、FAR功能类似,位移量一字节范围 -128~+127,对应一条短转移指令例:JMP SHORT LAB;转移到标号LAB的地址10.方括号 [ ]表示操作数(加方括号)是一个地址偏移量,不是数值格式:[表达式] 或者 [表达式][ ]例:MOV [BX],AX ;将AX内容送BX所指单元MOV [BX+7],AX ;将AX内容送BX+7所指单元MOV AX,[BX][SI] ;将BX+SI所指单元内容送AX11.取高/低字节HIGH/LOW用来分离常量的高/低字节,对存储器操作数无效例:DATA EQU 789AHMOV AL,HIGH DATA ;AL=78HMOV AL,LOW DATA ;AL=9AH四.段定义伪指令1.SEGMENT—ENDS格式:[段名] SEGMENT [定位类型] [组合类型] [‘类别名’]┇[段名] ENDS·段名·定位类型(Align),给出实际段地点的种类或段长度的信息<1> PARA 段起始地址从一个节(paragraph)的边界开始<2> BYTE 段地址可从任意绝对地址开始<3> WORD 段地址从任意一个字的边界开始<4> PAGE 段地址从某一页的边界开始(一页等于256字节)<5> INPAG 段长度小于一页未说明定位类型时则默认为PARA·组合类型(Combine),又称联合类型,程序中各程序段的连接和定位方法<1> PUBLIC 将段名相同的程序段(亦称模块)依此紧密连接,但彼此不相互覆盖<2> COMMON将段名相同的程序段连接,各段都从同一地址开始<3> AT表达式段定位在由表达式(结果必须是常数)所指定的节的边界上例:AT 1234H,则段地址被定位在物理地址为12340H处,如果希望从12345H开始,则在SEGMENT命令的下一行写上ORG 5AT 不能向前引用<4>STACK 表示这个段是运行期间的堆栈段<5>MEMORY 该段是相互连接的几个段中地址最高的段<6>NONE本段与其他段无组合关系未说明联合类型时则默认为NONE,不和别的段连接·‘类别名’(Class),也叫组名,加单引号,汇编后类别名相同的程序段代码集中在一起定位,形成一个统一的物理段,类别名可自定,约定的有CODE (代码段)、DATA(数据段)、STACK(堆栈段)、CONST(常数)、MEMORY(存储)等2.ASSUME段寄存器说明伪指令,指明所定义的段名所使用的段寄存器(告诉汇编程序在运行期间通过哪一个段寄存器寻址才能找到所要的指令和数据),本语句一般在定义的代码段中第一条出现格式:ASSUME 段寄存器:段名 [,…]例: ASSUME CS:CODE,DS:DATA ;用SEGMENT—ENDS定义ASSUME CS:SEG KGF,DS:SEG BEGIN;由算符定义ASSUME ES:NOTHING ;用关键字定义,表示不使用ES(取消ES段寄存器)(保留字NOTHING在这里作为一个段名参数,ASSUME NOTHING表示取消所有段寄存器,各个段寄存器只能在指令性语句中由MOV指令赋值)·ASSUME只是设定段寄存器与逻辑段的对应关系,并没给段寄存器装入实际值,所以程序中必须对DS、ES、SS赋值,而CS由系统赋值3.ORG定点伪指令(段内定位),用以确定下一条指令(或变量)在当前段中的偏移地址格式:ORG 表达式表达式以65536(64K)为模计算,超过64K则取其余数本语句前未定义过的变量不可出现在表达式中,表达式可包含$(程序计数器当前值)如:ORG OFFSET $+1000表达式必须为正值,若为负值,就会从当前段的地址高端开始表达式最好不要写成OFFSET $-1000,以免把汇编过的1000个字节覆盖掉ORG指令不能带标识符,如START:ORG 0和SKIP ORG 100都是错的例:CODE SEGMENT ;段起始ORG 100H ;本程序代码从偏移地址100H开始装入ASSUME CS:CODE ;装入代码段地址到CS中START:IN AL,30H ;程序段SHL AL,1OUT 32H,ALJMP STARTCODE ENDS ;程序段结束END START ;汇编结束例:DATA SEGMENTORG 50HDAT DW 1,2,$+1┇DATA ENDS注意DAT不能定义为字节,否则与$不匹配五.过程定义伪指令格式:过程名 PROC 属性┇过程体RET过程名 ENDP·过程名不可缺省,它和标号一样有三个属性:段属性、偏移地址属性、距离属性·距离属性在PROC后指定,有NEAR和FAR,如果希望过程能让别的程序调用,则必须是FAR属性·一个过程允许多个入口,入口处有标号,标号要说明距离属性例:延时100ms子程序DELAY PROC ;隐含NEARMOV BL,10 4TDLY1: MOV CX,2801 ;内循环延时10ms 10TWAIT0: LOOP WAIT0 9/5T DEC BL 2TJNZ DLY1 8/4TRET 8TDELAY ENDP六.结束伪指令·NAME:给模块(源程序)命名格式:NAME 模块名称它出现在源程序的最前端·END:汇编结束格式:END [标号名]它通知汇编程序本模块汇编到此结束标号名是可选项,若选取,应指向执行本程序的起始地址若一个源程序是多模块,只有主模块的END后加标号,子模块只有END七.宏指令宏指令:在汇编语言源程序中多次重复出现的程序段,用一个名字来定义,然后当成一条指令来使用宏汇编:源程序中的宏指令经汇编程序翻译后扩展成对应程序段的机器码宏指令用MACRO—ENDM来定义,如:CRLF MACROMOV DL,0DHMOV AH,02HINT 21H┇ENDM(CRLF作回车换行)§4.3 汇编语言程序设计(assembly language programming)一.设计要求1.程序简明、易读、易调试、易修改2.程序占用内存要少(包括程序长度及运行时所需空间)3.程序运行速度要快二.基本设计方法1.选择合适的计算方法2.绘制程序流程图3.编制程序4.上机调试三.汇编语言程序格式和基本结构一般一个完整的汇编语言程序至少应包括以下三个程序段简化段格式:.MODEL SMALL.STACK 64H.DATA……;紧接指令代码从偶地址开始存放.CODESTART: MOV AX,@DATAMOV DS,AX……END STARTDATA SEGMENT ‘DATA’┇数据段DATA ENDSSTACK SEGMENT ‘STACK’┇堆栈段STACK ENDSCODE SEGMENT ‘CODE’ASSUME CS:CODE,DS:DATA,SS:STACKSTART:MOV AX,DATAMOV DS,AXMOV AX,STACKMOV SS,AX┇代码段CODE ENDSEND START程序的基本结构分为顺序结构、分支结构、循环结构和子程序结构(一)顺序结构一种简单程序,按顺序执行例1.将200H单元的低4位和高4位分别送入201H和202H单元的低4位,这二单元的高4位清0200HX X201H 0202H 0DATA SEGMENTORG 200HBCD DB 47HDB 2 DUP(?)DATA ENDSSTACK SEGMENTSTA DB 20 DUP(?)TOP EQU LENGTH STASTACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTART:MOV AX,DATAMOV DS,AXMOV AX,STACK MOV SS,AXMOV AX,TOPMOV SP,AXMOV BX,OFFSET BCD MOV AL,[BX]AND AL,0FHMOV [BX+1],AL MOV AL,[BX]MOV CL,4ROL AL,CLAND AL,0FHMOV [BX+2],AL HLTCODE ENDS END START例2.将ADDR1和ADDR2两单元开始的二个16位无符号数相加,考虑到进位,将其结果存放在SUM开始的三个单元中DATA SEGMNETADDR1 DW 7854HADDR2 DW 9981HSUM DB 3 DUP(0)DATA ENDSSATCK SEGMENTSTA DB 20 DUP(?)TOP EQU LENGTH STASTACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTART: MOV AX,DATAMOV DS,AXMOV AX,STACKMOV SS,AXMOV AX,TOPMOV SP,AXMOV AX,ADDR1ADD AX,ADDR2MOV WORD PTR SUM,AXADC SUM+2,0HLTCODE ENDSEND START例3.查表将DATA1单元中字节类型数据(0~0FH)转换成ASCII码,并存入ASCII单元中DATA SEGMENTASCTAB DB 30H,31H,32H,33H,34H,35H,36H,37HDB 38H,39H,41H,42H,43H,44H,45H,46HDATA1 DB 09HASCII DB ?DATA ENDSSTACK SEGMENT STACKDW 10 DUP(?)STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTART PROC FARASCTAB 30 031 1┇93941 A42 B┇46 F┇ASCIIPUSH DSMOV AX,0PUSH AXMOV AX,DATAMOV DS,AXMOV BX,OFFSET ASCTABMOV AL,DATA1XLATMOV ASCII,ALRETSTART ENDPCODE ENDSEND START例4.将200H和201H单元字节的高4位对调,低4位不变CODE SEGMENT200H201HORG 200HDATA1 DB 0F3H,47HASSUME CS:CODE,DS:CODESTART:MOV AX,CODEMOV DS,AXMOV CL,4MOV AX,WORD PTR DATA1 ;AX=47F3HROL AX,CL ;AX=7F34H ROL AH,CL ;AX=F734H ROL AL,CL ;AX=F743H MOV WORD PTR DATA1,AXHLTCODE ENDSEND START(二)分支结构通过判断产生分支,借助于条件转移指令跳转到相应的分支地址执行分支程序分支程序由三部分组成① 测试部分,负责产生决定分支的条件② 定向部分,根据测试条件是否满足,决定程序是否分支③ 标注部分,标明分支的去向利用跳转表也可使程序转移到分支地址例1.16位二进制补码X在DATA1单元,求其绝对值送DATA2单元(设X≠8000H)∣X∣= X,X≥0-X, X<0DATA SEGMENTDATA1 DW 9F87HDATA2 DW ?DATA ENDSSTACK SEGMENTSTA DB 20 DUP(?)TOP EQU LENGTH STA STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACK START:MOV AX,DATAMOV DS,AXMOV AX,STACKMOV SS,AXMOV AX,TOPMOV SP,AXMOV AX,DATA1AND AX,AXJNS ABS0NEG AXABS0: MOV DATA2,AXHLTCODE ENDSEND START例2.多重分支学生成绩按分数段划分为:A、90~100(5AH~64H)B、80~89 (50H~59H)C、70~79 (46H~4FH)D、60~69 (3CH~45H)E、 <60 ( <3CH)已知分数存放在MARK单元,请用ASCII码的A、B、C、D、E去代表MARK单元中的分数所属的段,并存于GRADE单元DATA SEGMENTMARK DB 81GRADE DB ?DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATAMOV DS,AXMOV BX,OFFSET MARKMOV AL,[BX]CMP AL,3CHJC LPECMP AL,46HJC LPDCMP AL,50HJC LPCCMP AL,5AHJC LPBMOV AL,41H ;‘A’JMP SHORT DONELPB: MOV AL,42H ;‘B’JMP SHORT DONELPC: MOV AL,43H ;‘C’JMP SHORT DONELPD: MOV AL,44H ;‘D’JMP SHORT DONELPE: MOV AL,45H ;‘E’DONE: MOV BX,OFFSET GRADE MOV [BX],ALHLTCODE ENDSEND START法2:直接查表转换(顺序结构)DATA SEGMENTTAB DB ‘EEEEEEDCBAA’MARK DB 81GRADE DB ?DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA START:MOV AX,DATAMOV DS,AXMOV BX,OFFSET TABMOV AL,MARKMOV AH,0MOV CL,10DIV CLXLATMOV GRADE,ALHLTCODE ENDSEND START(三)循环结构使机器重复执行一系列指令,是一种闭合的分支结构循环程序由四部分组成① 初始化部分(或预置部分),负责设置循环初值② 处理部分,循环过程的主体③ 控制部分,修改初值,判断是否循环循环次数由一计数器控制循环次数由某一指定条件是否满足来决定④ 结束部分,处理循环程序的最后结果例1.将DTAB单元开始的一组字节补码数(≤255个)求平均值,结果存入AVE单元,若结果为负,在SYM置FFH否则置0DATA SEGMENTDTAB DB 0FDH,0FCH,05H,0F8H,……DB 08H,25H,83H,97H,……COUNT EQU $-DTABAVE DB ?SYM DB ?DATA ENDSSTACK SEGMENT STACKSTA DB 20 DUP(?)STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACK AVER PROC FARSTART:PUSH DSMOV AX,0PUSH AXMOV AX,DATAMOV DS,AXLEA BX,DTABMOV CX,COUNTXOR DX,DXNEXT: MOV AL,[BX]CBWADD DX,AXINC BXLOOP NEXTMOV AX,DX MOV CL,COUNTIDIV CLMOV AVE,ALMOV SYM,0AND AL,ALJNS DONEMOV SYM,0FFHDONE: RETAVER ENDPCODE ENDSEND START循环控制方法:循环次数由计数器控制例2.将8位二进制小数规格化设需规格化的小数在DATA1单元,要求规格化后使其最高位为1,并存入DATA2单元,办法是把小数左移至最高为位为1为止,左移次数存入DATA3单元,若小数是0,则在DATA2和DATA3单元存入0示例:DATA1 DATA2 DATA322H 88H 02H01H 80H 07HCBH CBH 00H00H 00H 00HDATA SEGMENTDATA1 DB 22HDATA2 DB ?DATA3 DB ?DATA ENDSSTACK SEGMENTSTA DB 20 DUP(?)TOP EQU LENGTH STA STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTART:MOV DATAMOV DS,AXMOV AX,STACKMOV SS,AXMOV AX,TOPMOV SP,AXMOV CL,0MOV AL,DATA1 ;取数AND AL,AL ;设ZF、SF标志JZ DONECHKSF:JS DONEINC CLADD AL,AL ;左移一位JMP SHORT CHKSFDONE: MOV DATA2,ALMOV DATA3,CLHLTCODE ENDSEND START循环控制方法:循环次数由某一指定条件是否满足来决定例3.多重循环将n个无符号字节数从小到大排序,方法是依此比较相邻两单元的数,若前小后大不交换第一轮比较n-1次,最大数沉底(高地址)第二轮比较n-2次,次大数沉到最大数上面第n-1轮比较完若在某一轮比较时没有出现交换,说明顺序已排好,不必后续比较,故设交换标志AH=1代表不交换,AH=2代表有交换DATA SEGMENTLIST DB 18,6,11,3,1,2,3,9,8,7,6 DB 111,110,99,112,115,114,113,98,96,97 COUNT EQU $-LISTDATA ENDSSTACK SEGMENT STACKSTA DW 10 DUP(?)STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSET PROC FARSTART:PUSH DSMOV AX,0PUSH AXMOV AX,DATAMOV DS,AXMOV DX,COUNT-1 ;n-1轮(外循环)EXGO:MOV CX,DX ;每轮次数(内循环)MOV AH,01H ;交换标志MOV BX,OFFSET LIST ;数据块首址INGO: MOV AL,[BX]INC BXCMP AL,[BX]JC NEXT ;数1小,不交换XCHG AL,[BX] ;数1>数2,交换DEC BXXCHG AL,[BX]INC BX ;恢复数据指针MOV AH,02H ;有交换标志NEXT: LOOP INGODEC DXJZ DONEDEC AHJNZ EXGODONE: RETSET ENDPCODE ENDSEND START(四)子程序结构基本要求:① 子程序的开始(入口处)应给予一个标号,结束处有返回指令② 通用子程序要说明入口条件(入口参数)和出口条件(出口参数)③ 调用子程序要注意保护现场和恢复现场调用—返回的堆栈操作:CALL target ;段内SPSP-2,[SP+1,SP] IP,IPIP+disp段间SPSP-2,[SP+1,SP] CS,CSsegSPSP-2,[SP+1,SP] IP,IPoffsetRET ;段内IP [SP+1,SP],SPSP+2;段间IP [SP+1,SP],SPSP+2CS [SP+1,SP],SPSP+2RET n ;如上操作后SPSP+n·子程序入口标号应说明距离属性·对于一个FAR过程,过程初必须先保护程序段前缀中的中断指令INT 20H 的断点地址(DS:0000),它是一个程序正常结束退出的中断处理程序例1.将内存200H单元开始的一个五字节十六进制数显示出来(低位在低地址)DATA SEGMENTORG 200HNUM DB 9AH,78H,56H,34H,12HDATA ENDSSTACK SEGMENTSTA DB 20 DUP(?)TOP EQU LENGTH STASTACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTART:MOV AX,DATAMOV DS,AXMOV BX,5MOV AX,STACKMOV SS,AXMOV SP,TOPMOV SI,OFFSET NUMNEXT: MOV DH,[SI+BX-1] ;(不用AL,因调用MOV DL,DH ; display返回时DL→AL)MOV CL,4ROL DL,CLAND DL,0FHCALL DISPLAYMOV DL,DHAND DL,0FHCALL DISPLAYDEC BXJNZ NEXTMOV AX,4C00HINT 21HDISPLAY PROC NEARADD DL,30HCMP DL,3AHJB OKADD DL,07H;(如果DL=3AH,3AH+7=41H是‘A’)OK: MOV AH,02HINT 21HRET。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档