Chapter04_汇编语言程序设计
四章汇编语言程序设计ppt课件

ENDS,ASSUME,END ,…. 保留字:SEGMENT ENDS OFFSET SIZE DB
DW DD MOV PUSH ADD SUB MUL DIV INC DEC LOOP PROC ENDP CALL RET END
类别名
CODE、DATA、STACK(同名同类别段连续存放)
第4章 汇编语言程序设计
伪操作命令之三:段定义伪指令
段寄存器说明伪指令ASSUME
ASSUME 段寄存器名:段名[段寄存器名:段名[…..]]
例:
CODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK
MAIN:
……
CODE ENDS ENDS MAIN
;指定第一条要执行的指令标号
注:1、该伪指令用于明确用SEGMENT定义的段的类型, 使编译程序能生成目标代码程序。
2、在源程序中,该伪操作放在可执行程序的前面。 3、该指令没有给段寄存器赋予实际的初值。这项工作要通
过写指令来完成,其中代码段不需要赋值。
+、-、*、/、MOD、SHL、SHR 都可应用于数字运算。 +、- 可以用于表示存储器操作数的地址,或两个存储器
单元(同一段内)的地址偏移量之差。 例:SUM - 2
CYCLE - GO
第4章 汇编语言程序设计
运算符之二:逻辑运算符
AND、OR、XOR、NOT 按位的逻辑运算 例:IN AL,PORT_VAL
DATA2 DB 0C1H,36H,9EH,0D5H,20H;加数
DATA ENDS;数据段结束
CODE SEGMENT;定义代码段
第4章汇编语言程序设计知识PPT课件

┇
(1500H)=72H, (1501H)=34H, (1502H)=00H,
(1503H)=8AH,(1504H)=00H, (1505H)=10H。
(1506H)=00H,(1507H)=48H (H的ASCII值)
第24页/共61页
§4.2 伪指令
7、DS 定义存储空间命 令
格式:DS 表达式 功能:在汇编时,从指定地址开始保留DS之后表达式的值所
第15页/共61页
§4.2 伪指令
1、ORG 汇编起始地址命令
格式:ORG 16位地址
功能:规定该伪指令后面程序的汇编地址,即汇编后生成目
标程序存放的起始地址。
例如:
ORG 2000H
START:MOV A,#64H
┇
规定了START的地址是2000H,又规定了汇编后的第一条指令 码从2000H开始存放。
§4.2 伪指令
例如:
ORG 2000H DB 0A3H
LIST:DB 26H,03H STR: DB ‘ABC’
┇
A3H 26H 03H 41H 42H 43H
2000H 2001H 2002H 2003H 2004H 2005H
经汇编后:(2000H)=A3H, (2001H)=26H, (2002H)=03H, (2003H)=41H, (2004H)=42H, (2005H)=43H,
第31页/共61页
§4.4 汇编语言程序的基本结构
1、顺序程序 2、分支程序 3、循环程序
第32页/共61页
§4.4 汇编语言程序的基本结构
1、顺序程序
顺序程序是最简单的程序结构,也称直线程序。 程序按顺序一条一条地执行指令。这类程序是所有复杂程序的基础。 要写出高质量的程序还是需要掌握一定的技巧,需要熟悉指令系统,正确地选择 指令,最大限度地优化程序。
第4章-汇编语言程序设计

*
目标文件中的段与目标存储器之间的关系:
目标文件
目标存储器
.bss
.data
.text
RAM
E2PROM
ROM
第4章 汇编语言程序设计
*
3. 段定义伪指令
汇编器对段的处理是通过段伪指令来区别各个段的,并将段名相同的语句汇编在一起。 汇编器有5条伪指令可识别汇编语言程序的各个部分:
;初始化数据段 ;3组数据放入.data段 ;在.bss段保留10个单元 ;0123h放入.data段 ;初始化文本段 ;1字指令 ;2字指令 ;2字指令
;初始化数据段 ;3组数据放入.data段
第4章 汇编语言程序设计
*
汇编语言源程序:
链接器能够读/写所有类型的COFF文件,默认时链接器生成的是COFF2文件,采用-vn链接选项可以选择不同类型的COFF文件。
第4章 汇编语言程序设计
*
4.2.1分段结构 所谓“段”就是在存储器映像中占据连续空间的一段独立的代码或数据。每个目标文件都分成若干段。
COFF目标文件包含以下三个默认的段: .text 段:通常内含可执行代码; .data段:通常内含已初始化数据; .bss段:是为没有初始化的数据保留空间的。
第4章 汇编语言程序设计
*
C源文件
C编译器
汇编 源文件
汇编器
汇编 源文件
COFF 目标文件
链接器
可执行的 COFF文件
宏源文件
存档器
宏库
存档器
目标 文件库
建库工具
运行时 支持库
EPROM 编程器
交叉引用 列表器
调试工具
绝对地址 列表器
第04章 汇编语言程序设计 39页 0.2M PPT版

MOV AL,10100000B OR 00000101B ;(AL)←10100101B
例4-4 关系运算符的应用
MOV AX,5 EQ 101B ;(AX)←0FFFFH
MOV BH,10H GT 16 ;(BH)←0
例4-5 数值返回运算符的应用
K1 DB 30H,31H,32H
K2 DW 4041H,4043H
(4)STACK
(5)MEMORY
(6)AT表达式
4. 类别名
返回
4.2.4 段寻址伪指令
格式:
ASSUME 段寄存器名:段名,段寄存器名:段名,……
例4-15 求从NUM开始的12个无符号字节数的和,结果放在SUM字单元中。
DATA SEGMENT NUM DB 95H,83H,36H,2DH DB 33H,22H,1AH,34H DB 62H,45H,75H,49H SUM DW ?
例4-13
STR1 DB ‘COMPUTER’ ;定义一个字符串,字符串的首地址为STR1 STR2 DW ‘AA’,‘BC’,‘DE’ ;给两个字符组成的字符串分配两个字节存储单元 DATA DW ?,?,? ;为DATA预留6个存储单元
例4-14
DATA1 DB 20 DUP(?) ;为变量DATA1分配20个字节的空间,初值为任意值 DATA2 DW ? ;为变量DATA2分配2个字节的空间,初值为任意值 DATA3 DB 20 DUP(30H) ;为变量DATA3分配20个字节的空间,初值均为30H
K3 DW 20H DUP(0)
K4 DD 50515253H
MOV AL,TYPE K1 ;等效于MOV AL,1
MOV AH,TYPE K2 ;等效于MOV AH,2
汇编语言程序设计

第四章汇编语言程序设计(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。
微机原理 第04章 汇编语言程序设计

2.定义字(DW) DW(Define Word) 定 义 一 个 字 ( 两 个 单 元 ) 。 DW伪操作后面的每个操作数都占用两个字节, 在内存中存放时,低字节在前,高字节在后。 DW的格式和表达式与DB类似。例如: DATA2 DW 1234H,5678H,9ABCH BUFFER DW 50 DUP(?)
第四章 汇编语言程序设计
第一节 汇编语言源程序 汇编语言是用指令的助记符、符号地址、标 号和伪指令等来书写程序 一、汇编语言源程序的结构 一个完整的汇编语言源程序通常由若干个逻 辑段(SEGMENT)组成,包括代码段、数据 段、附加段和堆栈段,它们分别映射到存 储器中的物理段上
[例4-1] 两个字(A6B8H, 206DH)相加
二、汇编语言语句类型及格式
指令性语句的格式: [标号:] [前缀] 操作码 [操作数[,操作数]] [;注释] 例如指令性语句: START: MOV AX,DATA ;将立即数DATA送累加器AX 指示性语句的格式: [名字] 伪操作 [操作数[,操作数,…] [;注释] 例如指示性语句: DATA1 DB 56H,78H,9AH ;定义字节型数据,“DB”是伪操作
使用变量时需注意以下两点: ⑴ 变量的类型与指令的要求要相符。例如指令 MOV AX,VAR中,要求VAR必须定义为字类型变 量。 ⑵ 在定义变量时,变量名对应的是数据区的首地址。 如果数据区中有多个数据,则对其他数据操作时, 需修改地址。例如: BUFFER DB 56H,78H,9AH … MOV AL,BUFFER+2 ;将9AH送(AL)
汇编语言语句中的操作数
三、数据项及表达式 操作数可以是寄存器、存储器单元或数据项。而数 据项又可以是常量、标号、变量和表达式 1.常量 • 二进制常量 • 十进制常量 • 十六进制常量 • 字符串常量
汇编语言程序设计第4章 顺序程序设计
20
加法运算用指令 ADD 直接完成,得到的结 果为两位十六进制数值,输出时,必须把其一位 一位地转换为对应字符的 ASCII码输出。十六进 制数值转换为对应字符的 ASCII码可用指令 XLAT 完成。其实现方法为:先定义一个内存字节数组 MYSTR,其值为“0123456789ABCDEF”,在用 指令 XLAT进行转换时,用寄存器 BX指向内存字 节数组 MYSTR 的首地址,AL 寄存器内存放需要 转换的一位十六进制数值(即一个四位二进制数) 就可完成。用流程图可表示如图 4.11所示。
12
5)流向线: 由带箭头的线段表示,它表示程序的流向,即 程序执行的顺序关系。如果程序的流向是从上向下 或从左向右,通常可以不画箭头,其余情况需用箭 头指明程序的流向。 结构化程序设计中的 3 种模块(顺序结构模块 、选择结构模块、循环结构模块)可用流程图表示 如下:
13
图 4.5 流向线
14
9
图 4.3 起止框
10
图 4.4 连接框
11
4)连接框: 当一个程序比较大、复杂时,可能需要分布在 几张纸上,或者虽然只在一张纸上,但是流程图中 连接线较多时,常常纵横交错,这时可用连接框表 示两根流向线的连接关系。连接框中常用字母或数 字来表示,框内有相同字母或数字就表示它们有连 接关系。它只有一个入口或出口。
2
1)一个大型程序的开发应当采取“从顶向下 ,逐步求精,模块化”的方法。 2)程序均由三种基本模块(顺序结构、选择 结构、循环结构)组建而成。模块的概念:在结构 化程序设计方法中,一个模块可以是一条指令,一 个程序段,一个过程,不管模块含有多少指令,它 应只有一个入口,一个出口,其内部没有不能被执 行到的指令,没有无限循环。
16
第四章汇编语言程序设计
只有在汇编前的源程序中才有伪指令。 “伪”体现在汇编时,伪指令没有相应的机器代码产生。
§4.1 汇编语言及汇编过程
常用伪指令
1) ORG
汇编起始地址命令
作用
指明后面的程序或数据块的起始地址,是出现在每 段源程序或数据块的开始。
➢ 如不用ORG规定,则汇编得到的目标程序将从0000H开始。
3. 汇编语言程序设计步骤
程序设计实例引入
• 实例 假设一个班有50个人, 共有3门选修课: ➢ 计算机算法 ➢ 服装CAD设计 ➢ 德语 请找出: ➢ 同时选了三门课的同学;
§4.1 汇编语言及汇编过程
• 第一步
问题的解决
如何在计算机中表示选修某门课的所有同学
计算机算法
学生的学号 5 12 23 25 29 39
;71H、11H、11H。
§4.1 汇编语言及汇编过程
注:DB、DW、DS 只能用于程序存储器;而不能用于数据 存储器。
8) BIT 位地址赋值伪指令
功能是将位地址赋予规定的字符名。其中位地址可以是 绝对地址,也可以是符号地址。
格式位: 字符名 BIT
位地址
KEY BIT P1.0
§4.1 汇编语言及汇编过程
单分支结构 多分支结构
§4.2 汇编语言程序的基本结构举例
2. 简单(顺序)程序的设计
例1:将20H单元的两个压缩BCD码拆开变成ASCII码,存入21H、
22H
单元。(假设20H中的BCD码为00110100)
···
什么是BCD码? 什么是ASCII码?
B
A
···
22H 0011 21H 0011 20H 0011 0100
第4章-汇编语言程序设计教案
第四章教学实施计划3课堂教学实施计划第 8 课教学过程设计:复习 0 分钟;授新课 100 分钟讨论 0 分钟;其它 0 分钟授课类型(请打√):理论课√讨论课□实验课□习题课□其它□教学方式(请打√):讲授√讨论□示教□指导□其它□教学手段(请打√):多媒体√模型□实物□挂图□音像□其它□4.1 汇编语言程序设计概述程序实际上是一系列计算机指令的有序集合。
我们把利用计算机的指令系统来合理地编写出解决某个问题的程序的过程,称为程序设计。
程序设计是单片机应用系统设计的重要组成部分,单片机的全部动作都是在程序的控制下进行的。
随着芯片技术的发展,很多标准的或功能型的硬件电路都集成到了芯片中,所以,软件设计在单片机应用系统开发中占的比重越来越大。
一、汇编语言和高级语言汇编语言:用助记符表示的指令称为汇编语言,用汇编语言编写的程序称为汇编语言源程序汇编语言也是面向机器的,它仍是一种低级语言。
汇编语言离不开具体计算机的硬件,与硬件紧密相关。
高级语言:高级语言不受具体“硬件”的限制,具有通用性强,直观、易懂、易学,可读性好等优点。
多数的51单片机用户使用C语言来进行程序设计。
C语言已经成为人们公认的高级语言中高效、简洁而又贴近51单片机硬件的编程语言。
二、汇编语言的特点•助记符指令和机器指令一一对应,所以用汇编语言编写的程序效率高,占用存储空间小,运行速度快,因此汇编语言能编写出最优化的程序。
•使用汇编语言编程比使用高级语言困难,因为汇编语言是面向计算机的,汇编语言的程序设计人员必须对计算机硬件有相当深入的了解。
•汇编语言能直接访问存储器及接口电路,也能处理中断,因此汇编语言程序能够直接管理和控制硬件设备。
•汇编语言缺乏通用性,程序不易移植,各种计算机都有自己的汇编语言,不同计算机的汇编语言之间不能通用。
三、汇编语言的语句格式•指令语句:每一条指令语句在汇编时都产生一个指令代码(也称机器代码),执行该指令代码对应着机器的一种操作。
第四章--汇编语言程序设计.docx
第四章汇编语言程序设计1、编程将片内40H~60H单元中的内容送到以3000H为首的存储区内。
答:MOV R1,#40HMOV R2,#21HMOV DPTR,#3000HL1: MOV A,@R1MOVX @DPTR,AINC R1INC DPTRDJNZ R2,L12、编程计算下列算式的程序(1)23H+45H+ABH+03H=MOV A,#23HADD A,#45HADD A,#0ABHXCH A,B ;溢出处理ADDC A,#00HXCH A,BADD A,#03H ;A中为结果低位,B中为高位(2)CDH+15H-38H-46H=MOV A,#0CDHADD A,#15HSUBB A,#38HSUBB A,#46H(3)1234H+8347H=MOV A,#34HADD A,#47HMOV 30H,AMOV A,#12HADDC A,#83HMOV 31,A ;30H存结果低位,31H存结果高位(4)AB123H-43ADCH=CLR CMOV A,#23HSUBB A,DCHMOV 30H,AMOV A,#0B1HSUBB A,#3AHMOV 31H,AMOV A,#0AHSUBB A,,#04HMOV 32H,A ;30H为低位,32H为高位3、设有两个4位BCD码,分别存放在23H、22H单元和33H、32H单元中,求他们的和,并送入43H、42H单元中(低位在低字节,高位在高字节)。
答: MOV A ,22HADD A ,32HMOV 42H ,AMOV A ,23HADDC A ,33HMOV 43H ,A4、略5、编程计算片内RAM 区50H ~59H 单元中数的平均值,结果存放在5AH 中。
答: MOV R0,#8MOV R1,#50HMOV A ,#00HL1: ADD A ,@R1INC R1DJNZ R0,L1MOV B ,#8DIV ABMOV 5AH ,A6、编写计算下式的程序。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
例3: :
双字节求补 两个字节原码数存在R1、 中 设:两个字节原码数存在 、R0中 求补后结果,存在R3、 中 求补后结果,存在 、R2中。 00H
方法: 方法:
00H R0 R2
机械电子工程学院
-) R1 求补采用“ 原码” 求补采用“模 -原码”的方法,) 原码 的方法,
即用“ 去减 原码” 去减“ 即用“0”去减“原码”。 R3
原码
4.2 简单程序
程序: 程序:
ORG 1000H CLR CLR C A ;CY ;A ;送R2 送 ;A清零 清零 ;高字节求补 高字节求补 ;送R3 送 0 0
;BCDH数送 的低 位 21H 0011 BCDH 数送A的低 数送 的低4位 0000 BCDL 22H 0011 0000 ;完成转换 @R0 完成转换 ;存数 存数 ;原地踏步,相当于停机 原地踏步, 原地踏步
机械电子工程学院
4.2 简单程序
方法1小结: 方法 小结: 小结
以上程序用了8条指令, 个内存字节 执行时间为9个 个内存字节, 以上程序用了 条指令,15个内存字节,执行时间为 个 条指令 机器周期。 机器周期。
机械电子工程学院
4.3 分支程序
流程图: 流程图:
START 吸入 排出 A←(40H)-(41H) CY=1? N (A)-8℃ ℃ CY=1? N 42H←0 END Y Y
故 障
42H←FFH
正常
机械电子工程学院
4.3 分支程序
程序: 程序:
ORG 1000H START:MOV A, 40H : CLR C SUBB A, 41H JC ERROR SUBB A, #8 JC ERROR ;吸入温度值送A 吸入温度值送 ; 0 → CY ; A←(40H)-(41H) ;CY=1,则故障 , ;温度小于 ℃? 温度小于8℃ 温度小于 若CY≠1顺 顺 CY=1转 转 ;是则故障 是则故障 序执行 移 ;工作正常标志 工作正常标志 ;转出口 转出口 CY=1转顺 若CY≠1顺 转 ;设置故障标志 设置故障标志 序执行 移 ;停机
1000H ;取BCD码至 取 码至A 码至 ;除10H取余,使BCDH A 、BCDL B 除 取余, 取余 ; 完成转换 ;存ASCII码 存 码
RAM 20H BCDH BCDL 21H 0011 BCDH 22H 0011 BCDL
MOV A, 20H MOV B,#10H , DIV ORL AB B, #30H
DJNZ R1, LOOP MOV SUM , A SJMP HERE DATA1 DATA 20H SUM DATA 1FH END
;长度减1不为零则转移 长度减 不为零则转移 ;存和 程序主体 汇编结束标志
机械电子工程学院
4.1 概述
评价程序质量的标准: 四、评价程序质量的标准:
① 程序的执行时间 ② 程序所占用的内存字节数目 ③ 程序的逻辑性、可读性 程序的逻辑性、 程序的兼容性、 ④ 程序的兼容性、可扩展性 ⑤ 程序的可靠性 时 间概 空 间念
机械电子工程学院
4.3 分支程序
程序: 程序:
ORG 1000H CLR C MOV A, 30H SUBB A, 31H ;做减法比较两数 做减法比较两数 JC NEXT ;若(30H)小, 若 ) 则转移 CY=1则转移 则转移 若CY≠1则 则 顺序执行 ;交换两数 交换两数
CY=1? N 交换两数 END Y
A
0011 BCDL BCDH 0000 0000 BCDH
;两个 两个BCD数送 数送A 两个 数送 ;BCDL数送 数送22H 数送
XCHD A, @R0 ORL SWAP ORL MOV SJMP END
RAM 20H BCDH BCDL
22H, #30H ;完成转换 完成转换 A A, #30H 21H, A $
第4章 汇编语言程序设计 章
4. 1 概 述 4. 2 简单程序 4. 3 分支程序 4. 4 循环程序 4. 5 查表程序 4. 6 子程序的设计及调用 4. 7 程序设计举例
机械电子工程学院
4.1 概述
汇编语言和高级语言相比具有下列优点: 一、汇编语言和高级语言相比具有下列优点:
①占用的内存单元和CPU资源少 占用的内存单元和 资源少 ②执行速度快 ③有效地利用计算机的专有特性。 有效地利用计算机的专有特性。 专有特性 ④适合实时控制 ⑤可计算程序运行时间 如: 输出操作 MOV P1, A
机械电子工程学院
MOV 42H, #0 SJMP EXIT ERROR:MOV 42H, #0FFH : EXIT: : SJMP $ END
4.3 分支程序
多重分支程序举例
单元存放的是一元二次方程ax 例7:设30H单元存放的是一元二次方程 2+bx+c = 0 : 单元存放的是一元二次方程 根的判别式△ 的值。 根的判别式△= b2 – 4ac的值。 的值 试根据30H单元的值,编写程序,判断方程根的三种情况。 单元的值, 试根据 单元的值 编写程序,判断方程根的三种情况。 中存放“ 代表无实根 代表无实根, 在31H中存放“0”代表无实根, 中存放 存放“ 代表有相同的实根 代表有相同的实根, 存放“1”代表有相同的实根, 存放“ 代表两个不同的实根 代表两个不同的实根。 存放“2”代表两个不同的实根。 解: 为有符号数,有三种情况,即小于零,等于零、 △为有符号数,有三种情况,即小于零,等于零、大 于零。这是一多重分支程序。 于零。这是一多重分支程序。 可以用两个条件转移指令来判断,首先判断符号位, 可以用两个条件转移指令来判断,首先判断符号位, 用指令JNB ACC.7, rel判断, 判断, 用指令 判断 ∆<0; 若ACC.7 = 1,则一定为负数,此时∆< ; ,则一定为负数,此时∆< 判断。 若ACC.7 = 0,则△≥0。此时再用指令 , 。此时再用指令JNZ rel 判断。 若△≠0,则△> 0,否则△= 0。 , ,否则△ 。
解:
可将被转换数除以100,得百位数;余数除以10 ,得百位数;余数除以 可将被转换数除以 得十位数;最后余数即为个位数。 得十位数;最后余数即为个位数。
例如:255(十进制)除以 ,得 2(百位数); (十进制)除以100, (百位数);
余数除以10, (十位数); 余数除以 ,得5(十位数); 最后余数5即为个位数 即为个位数。 最后余数 即为个位数。
机械电子工程学院
4.1 概述
汇编语言程序设计的步骤: 二、汇编语言程序设计的步骤:
①建立数学模型 ②确定算法 ③制定流程图 ④确定数据结构 ⑤写出源程序 ⑥上机调试
三、汇编语言程序的结构
①定义有关字符名 ②定义程序的起始地址 ③程序主体 ④汇编结束标志
机械电子工程学院
内部RAM从DATA1单元开始有一数据块,存放若干 单元开始有一数据块, 例1:内部 从 单元开始有一数据块 无符号数,第一单元为数据块长度,求这些无符号数之和。 无符号数,第一单元为数据块长度,求这些无符号数之和。
SUBB A, R0 MOV R2, A CLR A
;低字节求补 低字节求补
SUBB A, R1 MOV R3 , A
SJMP $ END
机械电子工程学院
4.2 简单程序
例4: :
将内部RAM的20H单元中的 位无符号二进制数, 的 单元中的8位无符号二进制数 将内部 单元中的 位无符号二进制数, 转换为3位 转换为 位BCD码,并将结果存放在 码 并将结果存放在FIRST(百位)和 (百位) SECOND(十位、个位)两个单元中。 (十位、个位)两个单元中。
0 FFH 0 2H 5 5H
4.3 分支程序
简单分支: 测试标志位,判断程序设置的条件。 简单分支: 测试标志位,判断程序设置的条件。 多重分支: 判断2个以上的条件 被称为复合条件。 多重分支: 判断 个以上的条件,被称为复合条件。 个以上的条件, 种选择。 N路分支: 根据程序运行情况,可以有 种选择。 路分支: 路分支 根据程序运行情况,可以有N种选择 利用散转指令JMP @A+DPTR可转向任一处理程序。 可转向任一处理程序。 利用散转指令 可转向任一处理程序 简单分支程序举例: 简单分支程序举例: 设内RAM 30H、31H存放两个无符号数,试比较 存放两个无符号数, 例5 设内 、 存放两个无符号数 两数的大小,较小的数存入30H单元,较大的数 单元, 两数的大小,较小的数存入 单元 存入31H单元。 单元。 存入 单元 解: 这是一个简单分支程序,可以使两数相减,若CY=1, 这是一个简单分支程序,可以使两数相减, , 则被减数小于减数。 指令进行判断。 则被减数小于减数。用JC指令进行判断。 指令进行判断
RAM
转换时, 中的BCD码拆开, 20H BCDH BCDL 码拆开, 转换时,将20H中的 中的 码拆开 21H 0011 BCDH 高四位置为“ 即可。 高四位置为“0011”即可。 即可 ASCII码 码 22H 0011 BCDL
机械电子工程学院
ቤተ መጻሕፍቲ ባይዱ
4.2 简单程序
程序: 程序:
ORG 1000H MOV R0, #22H ;R0 MOV @R0, #0 MOV A, 20H ; 22H 22H 0
方法2: 方法 :
采用除10H取余法将两个 取余法将两个BCD数拆开。 数拆开。 采用除 取余法将两个 数拆开 A BCDH BCDL B 0001 0000 ORL A B A , #30H B
机械电子工程学院
DIV AB
0000 BCDH 0000 BCDL