汇编语言1数值运算程序设计
汇编语言程序设计

汇编语⾔程序设计第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。
汇编语言程序设计

6)组合运算符(属性修改运算符) ① PTR运算符:运算符PTR可以指定或修改存储器操作数的 类型。注意,这种修改是临时性的,仅在该语句内有效。 下面是使用PTR运算符的例子: 例10 INC BYTE PTR[BX] 该语句的目的操作数是内存单元,用寄存器作为地址指 针。如果仅仅使用[BX]来表示该操作数,则汇编该语句时 ,不能确定该存储单元是字节单元还是字单元。因此,必 须使用BYTE PTR说明它为字节操作数(若为字操作数, 则使用WORD PTR说明)。
4)分析运算符:分析运算符有:SEG、OFFSET、TYPE、 LENGTH和SIZE。 ① SEG运算符:利用SEG运算符可以得到一个标号或变量的段 基值。下面的指令将ARRAY的段基值送给DS寄存器。 例4 MOV AX,SEG ARRAY MOV DS,AX ② OFFSET运算符:利用OFFSET运算符可以得到一个标号或 变量的偏移量。下面的指令将STRING的偏移地址送给DX。 例5 MOV DX,OFFSET STRING ③ TYPE运算符:运算符TYPE的运算结果是一个数值,这个数 值与操作数类型的对应关系见表4-1。
4.1.3
汇编语言的表达式
(3)表达式。表达式是操作数常见的形式,它由常数、变量 、标号通过操作运算符连接而成。 汇编语言中有:算术运算符、逻辑运算符和关系运算符等 。 1)算术运算符:常用的有:+(加)、–(减)、*(乘)、/ (除)和MOD(模运算)等,算术运算的结果是一个数值 。 例1 MOV AX,VARX+2 表示VARX的地址加2后对应的存储字单元内容送给AX。 2)逻辑运算符:AND(逻辑“与”)、OR(逻辑“或”) 、NOT(逻辑“非”)和XOR(逻辑“异或”)。逻辑运算 用于数值表达式中对数值进行按位逻辑运算,并得到一个数 值结果。 例2 MOV AL,0FH AND 35H 表示将0FH与35H按位相与后得到05H送给AL, 这条指令 与MOV AL, 05H 等效。
8086汇编语言程序设计——第一个程序

8086汇编语⾔程序设计——第⼀个程序本系列以80X86系列微型计算机为基础,以MASM5.0为汇编上机实验环境,重点介绍Intel8086指令系统。
Intel8086指令系统中有100多条指令,利⽤这些指令可以编写出复杂的程序实现更多功能。
汇编语⾔是直接控制计算机硬件⼯作的最简便的语⾔。
学习了汇编语⾔可具有在CPU寄存器级上进⾏控制和操作的能⼒,可获得直接对计算机硬件底层编程的经验。
⼀个计算的例⼦例 *编写⼀个汇编语⾔程序,实现下列公式计算。
假设X=4,Y=5汇编指令如下:如果在DEBUG下⽤A命令输⼊这些指令,必须把X、Y换成具体的数值;Z、Z1是存储单元地址,最后两条指令可写为MOV [0],AL和MOV [1],AH,这样才能⽤T命令执⾏。
D:\dos〉DEBUG-AMOV AL,4ADD AL,5MOV BL,8IMUL BLMOV BL,4MOV BH,0SUB AX,BXMOV BL,2IDIV BLMOV [0],ALMOV [1],AH采⽤DEBUG的A命令输⼊程序的做法明显不⽅便,⼀是⽆法给出变量名即符号地址,⼆是调试修改程序不便。
1. 编写⼀个完整的汇编语⾔源程序需要增加段定义伪指令和定义数据存储单元伪指令等必须有的伪指令。
伪指令与C语⾔等⾼级语⾔中的说明性语句的含义类似,起到说明作⽤。
⽤记事本gedit或者vi编写,保存到dos⽬录下注释符号为;号2. 汇编、链接、执⾏汇编语⾔源程序既可以⽤⼤写字母也可以⽤⼩写字母书写。
汇编语⾔程序建⽴及汇编过程如图所⽰。
⽤户编写的源程序要经汇编程序MASM汇编(翻译)后⽣成⼆进制⽬标程序,⽂件名默认与源程序同名、扩展名为.OBJ;再经过LINK连接⽣成可执⾏程序,⽂件名默认与源程序同名、扩展名为.EXE。
注意:源程序⼀定要和MASM和LINK⽂件放在同⼀个⽂件夹中。
执⾏MASM和LINK命令时需要按多次回车。
3. 在DEBUG下执⾏程序MOV AH,4C指令对应的偏移地址是0023,这就是断点(所谓断点,就是程序执⾏到该处停下来不再继续)。
汇编语言程序设计方法

C 名字前加 下划线
从右到左 调用程序
是
SYSCALL
从右到左 被调用程序
是
STDCALL 名字前加
下划线 (注)
被调用程序
是
PASCAL 名字变大写
BASIC 名字大写
FORTRAN 名字大写
从左到右 被调用程序
是
从左到右 被调用程序
是
从左到右 被调用程序
是
12
PROTO是过程声明伪指令,用于事先声明过程的结构。它的格 式如下:
结束处理部分
AGAIN: ADD AX,CX
;从20,19,……2,1倒序累加到AX
LOOP AGAIN ;每循环一遍,CX自动减1
MOV SUM,AX ;将累加和送入SUM单元
.EXIT 0
END
初始化部分
循环结束? 是 否
工作部分 修改部分 结束处理部分
7
二、用MASM 6.x循环控制伪指令实现循环结构
.CODE
.STARTUP
MOV AL, B
IMUL AL
MOV BX,AX MOV AL,A
;BX中为B的平方
IMUL C
MOV CX,4
IMUL CX
;AX中为4AC
.IF SWORD PTR BX>=AX ;比较B的平方和4AC的大小
MOV SIGN,1
;条件成立,SIGN得到1
.ELSE
MOV SIGN,0
.IF 条件表达式 ;条件为真(非0),执行分支体
分支体
[.ELSEIF 条件表达式
分支体
;前面IF条件为假,并且当前ELSEIF条件为真执行分支体
[.ELSE
;前面IF条件为假执行分支体
汇编语言系列之汇编实现简单数学运算

汇编语⾔系列之汇编实现简单数学运算⽬录1.计算S=1+2×3+3×4+4×5+···+N(N+1)1.1设计要求:1.2设计思路:1.3程序清单:1.4程序运⾏结果及分析:2.计算N!2.1设计要求:2.2设计思路:2.3程序清单:2.4程序运⾏结果及分析:软件:emu8086语⾔:汇编语⾔(Assembly)注意:本⽂列出了两种算术运算的代码,全部代码为博主独⾃⼀⼈编写,会有瑕疵,谨慎使⽤。
1.计算S=1+2×3+3×4+4×5+···+N(N+1)1.1设计要求:设计程序,实现数学公式S=1+2×3+3×4+4×5+···+N(N+1)的算法。
数值N由加键盘输⼊,计算结果在显⽰终端输出。
设计要求:计算结果不超过⼗六位寄存器的存储能⼒,如有溢出提⽰错误。
1.2设计思路:输⼊N值然后把N给BH作为循环次数,通过循环实现乘和累加计算,结果为⼗六进制,通过除以10得到⼗进制,存⼊堆栈再依次输出。
1.3程序清单:DATA SEGMENTpkey DB 0dh,0ah,"pleas input N end by ';' :$"over DB 0AH,0DH,"overflow!",0dh,0ah,'$'result DB 0dh,0ah,'result is:','$'DAT1 DB 8 DUP(0)DATA ENDSSTACK SEGMENTSSTACK DB 100 DUP(0)STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTATE:MOV AX,DATAMOV DS,AXLEA SI,DAT1 ;开辟缓冲区LEA DX,pkeyMOV AH,9INT 21H ;DOS功能调⽤,输出字符串LLP:MOV AH,1INT 21H ;DOS功能调⽤,输⼊N值SUB AL,2FHINC DX ;DX计数MOV [SI],AL ;将输⼊的数据存在SI缓冲区INC SICMP AL,0CH ;输⼊为封号结束输⼊JNZ LLPSUB SI,2CMP DX,02H ;DX不为2表⽰输⼊为两位数JNZ LLLPLLP1:MOV CX,1MOV BL,2 ;赋初始值JMP LPLLLP:MOV DI,SISUB DI,1SUB [DI],1MOV AL,10MUL [DI]ADD [SI],AX ;输⼊是两位数时⼗位乘10加个位SUB AH,AHJMP LLP1LP: MOV BH,[SI] ;把循环次数给BHMOV AL,BLINC BLMUL BL ;BL(加1)和AL(原值)相乘给AXADD CX,AX ;AX和CX相加给CX,通过循环实现累加JO OOF ;如果溢出重新输⼊CMP BH,BL ;判断是否达到N值JNZ LPMOV AX,CXMOV CX,0AHMOV BX,0LOP:MOV DX,0DIV CX ;AX表⽰的32位数除以10,商放在AX,余数放在DX INC BXADD DX,30HPUSH DX ;将余数依次压⼊栈CMP AX,0JNZ LOP ;商不为0继续除10LEA DX,resultMOV AH,9INT 21H ;DOS功能调⽤,输出字符串OUTPUT:POP DXMOV AH,2INT 21H ;DX中数据依次出栈并显⽰DEC BXJNZ OUTPUT ;出栈完成后停⽌JMP STATEOOF:LEA DX,overMOV AH,09HINT 21H ;DOS功能调⽤,溢出显⽰JMP STATECODE ENDSEND STATE1.4程序运⾏结果及分析:乘法和累加计算根据流程图⼀步步赋值即可得到,在输⼊两位数和结果转⼗进制输出时遇到了⿇烦,通过查找资料不断尝试,最终找到了简单的解决办法,即输⼊两位时移位累加,输出除以10存⼊堆栈并依次输出显⽰。
汇编语言程序设计数学表达式的计算

南昌航空大学实验报告年月日课程名称:汇编语言程序设计实验名称:数学表达式的计算班级:学生姓名:学号:指导教师评定:签名:一.实验目的1.熟悉汇编语言源程序的组织;2.掌握利用顺序结构编写简单程序的方法;3.进一步熟悉程序的调试过程,对自己编写的程序进行调试。
二.实验内容1.完成以下内容1)设W、X、Y、Z均为16位带符号数。
2)要求完成计算表达式(W-(X*Y+Z-220))/X。
3)将表达式的商和余数存入数据区RESULT单元开始的区域中。
提示及要求:1)W、X、Y、Z可以利用DW或者WORD进行定义,数据大小根据自己需要进行设置2)RESULT单元要定义的足够大可以存放运算结果3)注意使用带符号的算术运算指令4)判断并理解计算机中除法的溢出。
5)提前写好预习报告,对报告中的源代码进行上机实现,记录实验结果。
2.实现自然数求和程序提示:1)利用等差数列求和公式计算2)提前写好预习报告,对报告中的源代码进行上机实现,记录实验结果。
三.实验过程和程序过程:鼠标双击启动win32.bat。
Masm编译环境启动后是一个控制台。
输入命令:make32 shiyan输入命令:shiyan程序:1.DA TA SEGMENTW DW 100X DW 5Y DW 2Z DW 200DA TA ENDSCODE SEGMENTASSUME CS:CODE,DS:DA TASTART:MOV AX,DA TASMOV DS,AXMOV AX,XIMUL YADD AX,ZSUB AX,220MOV BX,WSUB BX,AXMOV AX,BXIDIV XMOV AX,4C00HINT 21HCODE ENDSEND START2.四.实验结果和分析1结果:W 100X 5Y 2Z 200商是22 ,余数是0。
2结果:N为100求和结果为5050。
五.实验体会这次实验主要是学会了如何运用数值表达式的计算,熟悉了汇编语言源程序的组织,掌握利用顺序结构编写简单程序的方法,进一步熟悉程序的调试过程,对自己编写的程序进行调试。
汇编语言程序设计

…… 跳转到出口处end
……
casen:
跳转到出口处end ……
(执行条件n成立的语句)
end 分支结束出口
图9.13 汇编语言多重分支方第式14页
2021/12/8
下面我们用相应的例子来详细的说明这两种分支结构。
例 阶跃函数
说明:这是一个典型的双分支结构,输入值大于等于0时则返回1,输入值小于0时返 回0。r1>=0?r1=0r1=1退出图9.14 阶跃函数流程图NY
//与0比较 //大于等于0则跳转到非负数处理 //小于0则返回0 //跳转到程序结束处
//大于0,则返回1
第16页
2021/12/8
3、循环程序设计
(1) 循环程序的结构形式
循环程序可以有两种结构形式,一种是WHILE_DO结构 形式;另一种是DO_UNTIL结构形式。如图9.16所示.
初始化
初始化
入口参数:R1;(有符号数) 出口参数:R1
流程图如图9.14所示。
N
Y
R1>=0 ?
r1=0
r1=1
退出
图9.14 阶跃函数流程图
第15页
2021/12/8
程序的代码如下: .PUBLIC F_Step; .CODE F_Step: .proc CMP R1,0; JGE ?negtive; R1 = 0; JMP ?Step_end; ?negtive: R1 = 1; ?Step_end: RETF; .ENDP
1.4 嵌套与递归
1、 子程序的嵌套
子程序嵌套就是指子程序调用子程序。其中嵌套的层数称为嵌套深度。图9.27表
示了三重嵌套的过程。
SUB1
主 程 序
第四章-汇编语言程序的设计

第四章汇编语言程序设计本章的汇编语言程序设计的主要容有:汇编语言程序设计概述、汇编语言程序的结构形式、汇编语言的伪指令。
(一个单片机应用系统和其它计算机系统一样,在完成一项具体工作的时候,它要按照一定的次序,去执行操作,这些操作实际上就是由设计人员,以单片机能够接受的指令编制的程序,那么无论计算机也好,单片机也好,实际上编制程序的过程,就是用计算机来反映设计者的编程思想,那么这一章中,我们将向大家介绍怎样使用单片机指令系统来编制一些应用程序。
在介绍之前,我们还是来学习汇编语言的一些基础知识)4.1 汇编语言程序设计概述1、计算机的汇编语言以助记符表示的指令,每一条指令就是汇编语言的一条语句。
(汇编语言程序设计实际上就是使用汇编指令来编写计算机程序。
汇编语言的语句有严格的格式要求)2、汇编语言的语句格式MCS-51汇编语言的语句格式表示如下:[<标号>]: <操作码> [<操作数>]; [<注释>]标号:指令的符号地址,有了标号,程序中的其它语句才能访问该语句。
①标号是由1~8个ASCII字符组成,但头一个字符必须是字母,其余字符可以是字母、数字或其它特定字符。
②不能使用汇编语言已经定义了的符号作为标号,如指令助记符、伪指令记忆符以及寄存器的符号名称等。
(同一个标号在程序中只能定义一次,不能重复定义;一条语句可以有标号,也可以没有标号,所以是否有标号,取决于程序中是否需要访问该语句。
)操作码:规定语句执行的操作容,操作码是以指令助记符表示的,是汇编指令格式中唯一不能空缺的部分。
操作数:给指令的操作提供数据或地址。
注释:是对语句或程序段的解释说明。
(在单片机中,这四个部分怎么加以区分呢?使用分界符)分界符(分隔符):用于把语句格式中的各部分隔开,以便于编译程序区分不同的指令段。
冒号(:)用于标号之后空格()用于操作码和操作数之间逗号(,)用于操作数之间,分割两个以上的操作数分号(;)用于注释之前。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
; NAME EX—05—2
DATA SEGMENT
X
DD 12345678H; 32位被乘数
Y
DD 567890ABH; 32位乘数
RESULT DW 4 DUP(0)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
START: MOV AX, DATA
MOV MOV MOV MOV MUL MOV MOV MOV MOV MUL ADD ADC MOV
5.3 多字节除法
设有一个64位数除16位数,则商可能仍是64位, 而余数为16位。 若用一般的除法,则很难进行 处理。 如果用被除数连续减去除数得到商,很 可能要减亿万次,计算机将用很长时间才能完成 这么大的运算量。
如果在进行最高位除法时,高16位被除数为0, 然后将被除数最高16位送AX,除数放在CX中, 这样, 除法肯定不会产生溢出。第一次除法后 的余数放在DX中, 作为第二次除法的高16位, 将下一个被除数16位送AX, 再进行除法, 用这 种方法,可以顺利地完成整个除法运算。
ADDHEX: LODSB ADC STOSB INC LOOP MOV INT
COSEG END
FIRST AL, [BX]
DEST BX ADDHEX AH, 4CH 21H ENDS START
5.2 多字节乘法运算 设有两个32位二进制数, 相乘的结果将是一 个64位范围内的二进制数。 如果将一个乘数分 为两个字, 被乘数也分为两个字, 分别按字进 行相乘。 例如被乘数的两个字分别为X1和X0, 乘数的两个字分别为Y1和Y0, 则:
DS, AX SI, OFFSET RESULT AX, WORD PTR X CX, WORD PTR Y CX [SI], AX [SI+2], DX AX, WORD PTR X CX, WORD PTR Y+2 CX [SI+2], AX WORD PTR[SI+4], DX AX, WORD PTR X+2
MOV CX, WORD PTR Y
MUL CX
ADD [SI+2], AX
ADC [SI+4], DX
ADC WORD PTRRD PTR X+2
MOV CX, WORD PTR Y+2
MUL CX
ADD [SI+4], AX
ADC [SI+6], DX
MOV AH, 4CH
例5.1 设多字节的被加数从FIRST单元开始存放, 多 字节的加数从SECOND单元开始存放, 相加后的 结果从DEST单元开始存放, 设字节数为5。 则程 序如下:
NAME EX—05—1
; MULTIPLE BYTES-ADDITION
DATA
SEGMENT
FIRST
DB 1AH, 25H, 4EH, 60H, 3DH
INT
21H
CODE ENDS
END START
程序分析:
以上程序很容易看懂, 在进行加法时, 216和 232只要分别位移一个字或两个字再进行加法即 可。
相对[SI], [SI+2]为高位字; 而[SI+4] 和[SI+6]又是[SI]字的更高一位字或两位 字。
当ADC指令加一个立即数0时, 由于没声明是 字节0还是字0, 所以′WORD PTR′不能省去, 否则就会在汇编时出错。
5.4 BCD数的算术运算 8088指令系统提供了若干条BCD调整指令, 但这些指令只能对用BCD码表示的一位或两位 十进制数操作,范围狭小。
例5.3 设被除数为8个字节的X, 而除数为两个字 节的Y, 商放在RESULT中, 仍采取高字节放在 高地址, 余数放在EXTRA中。 程序如下:
;NAME EX—05—3
DATA
SEGMENT
X DQ 1234567890ABCDEFH
Y DW 1234H
RESULT DW 4 DUP(0)
EXTRA DW 0
第5章 数值运算程序设计
5.1 两个多字节数的加减运算
这里所指的两个多字节数的加减运算, 包括 二进制数的加减运算和组合的BCD数加减运算
由于8088内部寄存器是16位的, 因此不能直 接进行多字节数的加减运算。
高位加法指令应采用ADC指令; 减法指令应 采用SBB指令。
1. 两个多字节数的二进制加法运算
DATA
ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
START: MOV MOV MOV MOV MOV DIV MOV MOV DIV MOV
AX, DATA DS, AX CX, Y DX, 0 AX, WORD PTR X+6 CX WORD PTR RESULT+6, AX AX, WORD PTR X+4 CX WORD PTR RESULT+4, AX
MOV DIV MOV MOV DIV MOV MOV MOV INT CODE END
AX, WORD PTR X+2 CX WORD PTR RESULT+2, AX AX, WORD PTR X CX WORD PTR RESULT, AX EXTRA, DX AH, 4CH 21H ENDS START
Y=(Y1)(Y0)=(Y1)*216+(Y0) X=(X1)(X0)=(X1)*216+(X0) X*Y=((Y1)*216+(Y0))*((X1)*216+(X0))
=(Y1)*(X1)*232+(Y1)*(X0)*216+ (Y0)*(X1)*216+(Y0)*(X0)
例 5.2 两 个 32 位 数 分 别 为 X 和 Y , 乘 积 放 在 RESULT开始的四个字中, 低位字节放在低地 址中。 程序如下:
SECOND DB 80H, 49H, 62H, AEH, 4EH
DEST
DB 5 DUP(?)
DATA ENDS COSEG SEGMENT ASSUME CS:COSEG, DS:DATA, ES:DATA START:
MOV AX, DATA MOV DS, AX MOV ES, AX MOV SI, OFFSET FIRST MOV BX, OFFSET SECOND MOV DI, OFFSET DEST MOV CX, LENGTH DEST CLD CLC