实用汇编程序子程序

合集下载

汇编语言第5章王爽版(子程序调用指令)

汇编语言第5章王爽版(子程序调用指令)

Call
add64 mov ah,4ch int 21h main endp ;主程序结束
;子过程ADD64开始 add64 proc push bp ; mov bp,sp push bx push si push di push cx pushf ;保存现场 mov si,[bp+4] ; mov bx,[bp+6] mov di,[bp+8] mov cx,[bp+10] ;读取参数 cld
结构化程序设计51子程序的概念52子程序的定义调用和返回53子程序的现场保护与参数传递54子程序设计55子程序的嵌套与递归调用56宏汇编程序设计教学基本内容51子程序的概念1子程序
第5章
结构化程序设计
教学基本内容
5.1 子程序的概念 5.2 子程序的定义、调用和返回 ** 5.3 子程序的现场保护与参数传递** 5.4 子程序设计 *
主程序和子程序间的关系:调用子程序的程序称为主调程序或 主程序,被调用的程序称为子程序。 2、程序中使用子程序的好处 子程序作为一个功能性模块,供一个程序甚至多个程序使用: 可以简化源程序结构; 提高程序的可读性与可维护性; 有利于代码复用; 提高程序的设计效率。
5.2 子程序的定义、调用和返回
1、子程序的定义:由子程序定义伪指令PROC和ENDP来完成。其 格式如下:
code SEGMENT begin: CALL sub1 CALL sub2 CALL sub3 MOV AH, 4CH INT 21H sub1 PROC 、、 RET ENDP PROC 、、 RET ENDP PROC 、、 RET ENDP
sub1 sub2
sub2
sub3
sub3

51单片机实用子程序(汇编)

51单片机实用子程序(汇编)

《MCS-51单片机实用子程序库(96年版)》周航慈目前已有若干版本的子程序库公开发表,它们各有特色。

笔者在1988年也编制了两个子程序库(定点子程序库和浮点子程序库),并在相容性、透明性、容错性和算法优化方面作了一些工作。

本程序库中的开平方算法为笔者研究的快速逼近算法,它能达到牛顿迭代法同样的精度,而速度加快二十倍左右,超过双字节定点除法的速度。

经过八年来全国广大用户的实际使用,反馈了不少信息,陆续扩充了一些新的子程序,纠正了一些隐含错误,成为现在这个最新版本。

本子程序库对《单片机应用程序设计技术》一书附录中的子程序库作了重大修订:(1)按当前流行的以 IBM PC 为主机的开发系统对汇编语言的规定,将原子程序库的标号和位地址进行了调整,读者不必再进行修改,便可直接使用。

(2)对浮点运算子程序库进行了进一步的测试和优化,对十进制浮点数和二进制浮点数的相互转换子程序进行了彻底改写,提高了运算精度和可靠性。

(3)新增添了若干个浮点子程序(传送、比较、清零、判零等),使编写数据处理程序的工作变得更简单直观。

在使用说明中开列了最主要的几项:标号、入口条件、出口信息、影响资源、堆栈需求,各项目的意义请参阅《单片机应用程序设计技术》第六章 6.3.7 节的内容。

程序清单中开列了四个栏目:标号、指令、操作数、注释。

为方便读者理解,注释尽力详细。

子程序库的使用方法如下:1.将子程序库全部内容链接在应用程序之后,统一编译即可。

优点是简单方便,缺点是程序太长,大量无关子程序也包含在其中。

2.仅将子程序库中的有关部分内容链接在应用程序之后,统一编译即可。

有些子程序需要调用一些低级子程序,这些低级子程序也应该包含在内。

优点是程序紧凑,缺点是需要对子程序库进行仔细删节。

(一)MCS-51定点运算子程序库及其使用说明定点运算子程序库文件名为DQ51.ASM,为便于使用,先将有关约定说明如下:1.多字节定点操作数:用[R0]或[R1]来表示存放在由R0或R1指示的连续单元中的数据。

“汇编语言与微机原理”课程教学中汇编子程序实验设计

“汇编语言与微机原理”课程教学中汇编子程序实验设计

5 8 ・
Co mp u t e r Er a No. 2 2 01 3
“ 汇 编语言与 微机原理’ ’ 课 程教学中 汇编子 程序实 验设计
赵 永标 。张 其林 ,詹 彬 ,康长 青
( 湖北文理学院数学与计算机科学学院,湖北 襄阳 4 4 1 0 5 3 )
摘 要 :“ 汇编语 言与微 机原理” 是 计算机科 学与技术 专业 的必修基 础课 程。在教 学中汇编语 言子程序 实验设计普遍存
关键词 :汇编语言 ;子程序 ;宏 ;中断 ;实验设计 中图分类号 : G6 4 2 文献标志码 : B 文章 编号 : 1 0 0 6 — 8 2 2 8 ( 2 0 1 3 ) 0 2 — 5 8 — 0 2
Ex p e r i me n t a l d e s i g n o f a s s e mb l y s u b — r o u t i n e s i n “ a s s e mb l y l a n g u a g e a n d mi c r o c o mp u t e r p r i n c i p l e ’ ’
Z h a o Y o n g b i a o ,Z h a n g Qi l i n ,Z h a n Bi n ,Ka n g C h a n g q i n g
( S c h o o l o f M a t h e m a t i c s a n d C o m p u t e r S c i e n c e , H u b e i U n i v e r s i t y f o A r t a n d S c i e n c e , X i a n g y a n g , H u b e i 4 4 1 0 5 3 ,C h i n a )

实用汇编程序子程序

实用汇编程序子程序

(7) 标号:DIVD 功能:双字节二进制无符号数除法
入口条件:被除数在R2、R3、R4、R5中,除数在R6、R7中。
出口信息:OV=0 时,双字节商在R2、R3中,OV=1 时溢出。
影响资源:PSW、A、B、R1~R7 堆栈需求: 2字节
DIVD: CLR C ;比较被除数和除数
LCALL BCDA ;按多字节BCD码加法处理
CPL C ;将补码加法的进位标志转换成借位标志
MOV F0,C ;保护借位标志
LCALL NEG1 ;恢复减数[R1]的原始值
MOV C,F0 ;恢复借位标志
RET
NEG1: MOV A,R0 ;[R1]十进制取补子程序入口
MOV F0,C
CLR C
SUBB A,R7
ANL C,/F0
JC DV52
MOV R4,A
DV52: CPL C
MOV A,R3
RLC A
MOV R3,A
DJNZ R6,DV51
MOV A,R4 ;四舍五入
ADD A,R4
JC DV53
SUBB A,R7
PUSH PSW ;保存结果的符号
LCALL DIVD ;计算两个绝对值的商
JNB OV,DVS1 ;溢出否?
POP ACC ;溢出,放去结果的符号,保留溢出标志
RET
DVS1: POP PSW ;未溢出,取出结果的符号
MOV R4,#0
MOV R5,#0
MDSE: JB F0,MDS2 ;用补码表示结果
MOV A,R2
ADDC A,B
MOV R2,A
RET

第5章 汇编语言程序

第5章 汇编语言程序

Y
条件满足?
N
处理段
例5-5 设内部RAM30H,31H单元存放两个无符号数, 将大数存在31H,小数存于30H。 ORG 1000H START:CLR C MOV A,30H SUBB A,31H JC NEXT ;次序符合,返回 MOV A,30H ;交换 XCH A,31H MOV 30H,A NEXT: NOP SJMP $ END
$
5-3 分支程序
由条件转移指令构成程序判断框,形成程序分支结构。 5-3-1 单重分支程序 一个判断决策框,程序有两条出路。 两种分支结构: 例1 求R2中补码绝对值,正数不变, 影响条件 负数变补。
MOV A,R2 JNB ACC.7,NEXT;为正数? CPL A ;负数变补 INC A MOV R2,A NEXT:SJMP NEXT ;结束
五、对源程序进行交叉汇编得到机器代码; 反汇编 —— 分析现成产品的程序,要将二进制 的机器代码语言程序翻译成汇编语言源程序。
六、程序调试。
通过微计算机的串行口(或并行口)把机器代 码传送到用户样机(或在线仿真器)进行程序 的调试和运行。
5.1.3评价程序质量的标准
(1)程序的执行时间。 (2)程序所占用的内存字节数。 (3)程序的逻辑性、可读性。 (4)程序的兼容性、可扩展性。 (5)程序的可靠性。
方法二:采用除10H取余数将BCD拆开 ORG 1000H MOV A,20H; 2B 1T MOV B,#10H ; 3B 2T DIV AB ; 1B 4T ORL B,#30H ; 3B 2T MOV 22H,B ; 3B 2T ORL A,#30H; 2B 1T MOV 21H,A ; 2B 1T SJMP $ END;7条指令、16个内存字节、13个机器周期。

浅谈汇编语言中子程序的设计

浅谈汇编语言中子程序的设计
教材新探
r 。+ ”+ +
“+ + ” + + ‘+ + “+ “+ 。
。+ ’+ + ’
‘ ’ +
“+ ’+ ’
“+

浅谈汇编 中子 语言
■+ . . . .+ ” + . + 一 + . . + 一 + . . + - + 一 + + 一 + ” + 一 + ・ ・ 一 + + 一 + ・ ・

是 否按 “ 进 先 出” 后 的原 则 组 织 的 。 () 2堆栈保 护。子程 序是利用调用 C I AL 指令 和返 回 R T 指令来 实现正确 的调用 和返 回 的。因 E
为C Au 命令执 行 时压 入堆栈 的断 点地 址就 是供 子程序返 回主程序 时的地址 , 编程 时一定 要注 意子
程 序 的类 型 属 性 , 是 段 内 调 用 还 是 段 间 调 用 。段 即 内调 用 和 返 回为 N A 属 性 , 问 调 用 和 返 回 为 E R 段 F R 属性 。8 8 / 0 8的 汇编 程 序用 子 程序 定 义 A 0 68 8 P ( 的 类 型 属 性 来 确 定 C L和 R T 指令 的 属 R) C AL E 性 。如 果 所 定 义 的 子 程 序 是 F AR 属 性 , 么 对 它 那 的调用和返 回一定都是 F R A 属性 ; 如果所定义的子 程 序 是 NE R A 属性 , 么 对 它 的 调 用 和 返 回 也 一 定 那 是 NE R A 属 性 。这 样 用 户 只 是 在 定 义 子 程 序 时 考 虑它的属性 , C I 而 AL 和 R T指 令 的 属 性 就 可 以 E 由 汇 编 程 序 来 确 定 了 。另 外 , 入 子 程 序 后 再 使 用 进 堆 栈 时 也 必 须 保 证 压 人 和 弹 出 字 节 数 一 致 , 果 在 如 这 里 堆 栈 存 取 出错 , 然 会 导 致 返 回地 址 的 错 误 。 必 2 参 数传 递 . 主程序在调用子程序 时 , 经常要 向子程 序传递 些参数或控 制信息 , 子程序执行后 , 也常需要把运 行的结果返 回调用程序 。这种信息传递称 为参数传 递, 其常用 的方 法有 寄存 器传 递 、 内存 固定单 元传 递 、 栈传递 。 堆 ( ) 存 器 传 递 。 由 主 程 序 将 要 传 递 的参 数 装 1寄 入事先 约定 的寄存 器 中, 转入子 程序后 再取 出进行 处 理 , 种 方 法 受 C U 内 部 寄 存 器 数 量 限 制 , 此 这 P 因 只适 于传 递 少 量 参 数 的 场 合 , 一 些 常 见 的 软 件 延 如 时子程序 , 均是利用某寄存器传递循环计数 器初值 。 ( ) 过 内存 固 定 单 元 的 传 递 。此 方 法 适 于 大 2通 量传递参数时使用 , 它是在 内存 中开辟特 定 的一片 区域用于传递参数 。主程序和子程序都按事先约定 在指定 的存储单元 中进行数据 交换 , 这种 方法要 占

汇编实验报告(实验二)

汇编实验报告(实验二)

实验二循环与子程序程序设计一、实验目的1)加深对循环结构的理解。

2)掌握循环程序的设计方法。

3)学习子程序的定义和调用方法。

4)掌握子程序、子程序的嵌套、递归子程序和结构。

5)掌握子程序设计、编制及调试。

6)熟练掌握DEBUG的常用命令,学会用DEBUG调试程序。

二、实验内容3)编制在屏幕上显示九九乘法表的程序。

4)编制在屏幕上显示用*组成的三角形的程序。

6)编写一个递归子程序,计算指数函数Xn的值,其中X,n从键盘输入。

三、程序内容3)data segmentdata endscode segmentassume cs:code;ds:datastart:mov ax,datamov ds,axmov bl,30hmov bh,31hmov cl,blone:add bl,1mov dl,blmov ah,2int 21hmov dl,'*'mov ah,2int 21hmov dl,bhmov ah,2int 21hmov dl,'='mov ah,2int 21hand bl,0fhand bh,0fhmov al,bhimul blmov ah,0hmov ch,0ahidiv chmov dh,ahadd al,30hcmp al,30hjz threetwo:mov dl,almov ah,2hint 21hadd dh,30hmov dl,dhmov ah,2int 21hadd bl,30hadd bh,30hmov dl,20hmov ah,2int 21hcmp bl,bhjl onemov dl,0ahmov ah,2int 21hmov dl,0dhmov ah,2int 21hmov bl,cladd bh,1hcmp bh,3ahjl onejmp exitthree:mov al,20hjmp twoexit:mov ah,4chint 21hcode endsend start4)code segmentassume cs:code,ds:data,ss:stackstart:mov al,1mov bl,1l:add al,30hmov dl,almov ah,02hint 21hpush ax mov dl,'*' mov ah,02h int 21hpop ax push axadd bl,30h mov dl,bl mov ah,02h int 21hpop ax push ax mov dl,'=' mov ah,02h int 21hpop axsub al,30h sub bl,30h push bx push axmul blcall result mov dl,' ' mov ah,02h int 21hpop axpop bxinc alcmp al,bl jbe lmov dl,0ah mov ah,02h int 21hmov dl,0dh mov ah,02h int 21hcmp bl,8ja kmov al,1inc bljmp lk:mov ah,4ch int 21hresult:mov cx,0 aaaa:mov bx,10mov dx,0div bxpush dxinc cxmov dx,0cmp ax,0jne aaaabbbb:pop bxjmp lastcccc:last:cmp bx,39hja aboveadd bl,30hmov dl,blmov ah,02hint 21hloop bbbbretabove:add bx,37hmov dl,blmov ah,02hint 21hloop bbbbcode endsend start四、实验结果3)4)。

汇编语言常用子程序

汇编语言常用子程序

二、汇编语言常用子程序1、拆字与拼字:【例1】将 AX 中的四位 BCD 码从高到低依次存放到 CX所指的四个内存单元中。

【例2】将存放在CX所指的四个内存单元中的四位 BCD 码依从高到低顺序压缩到AX中。

2、数字与 ASCII 码之间的相互转换:十进制数字 0~9的 ASCII 码是 30H~39H ,所以只要将十进制数(BCD 码)加 30H 就是对应的 ASCII 码。

十六进制数转换成 ASCII 码可分成两段, 0~9的 ASCII 码是 30H~39H ,即加 30H ;A~F 的ASCII 码是 41H~45H ,即加 37 H。

【例1】将 AX中的四位 BCD 码化成 ASCII 码从高到低依次存放到字符串变量STR 中。

【例2】将AX中的 16 位二进制数化成四位十六进制数 ASCII 码从高到低依次存放到字符串变量 STR 中。

【例3】将字符串 STR 中的四位十六进制数的 ASCII 码化成 16 位二进制数放到AX中。

3、利用加减法及移位指令做乘法:1)左移指令可将操作数乘 2 的整数次方(2、4、8、16);右移指令可将操作数除以 2 的整数次方。

若操作数是无符号数,用逻辑移位指令;若操作数是有符号数,用算术移位指令。

【例1】将AX中的二进制数乘以 8。

【例2】将AX中的带符号二进制数除以 4。

2)将移位指令和加减法结合起来可完成乘数不是 2 的整数次方的乘法运算。

【例1】将AX中的二进制数乘以 10。

【例2】将AX中的二进制数乘以 7。

4、二进制数与十进制数的转换1)二化十:将二进制数转换为十进制数的一种常用算法是将被转换的二进制数依次被 10i(对 16 位二进制数,i为 4、3、2、1、0)除,所得的商即为该十进制数位的值,其余数再被下一个 10i 除。

一般用减法代替除法,即一边减 10i,一边计数器加 1,直到不够减再进行下一位 10i-1。

以求得十进制数的各位数。

20个简单汇编语言程序

20个简单汇编语言程序

20个简单汇编语言程序以下是20个简单的汇编语言程序示例:1. 计算两个数的和:MOV AX, 5。

ADD AX, 3。

这段代码将 5 存储在 AX 寄存器中,然后将 3 加到 AX 中,最终 AX 中的值为 8。

2. 比较两个数的大小:MOV AX, 5。

CMP AX, 3。

这段代码将 5 存储在 AX 寄存器中,然后将 AX 中的值与 3 进行比较。

3. 循环打印数字:MOV CX, 10。

MOV AX, 1。

LOOP_START:MOV DL, AL.ADD DL, 48。

MOV AH, 2。

INT 21h.INC AL.LOOP LOOP_START.这段代码使用循环打印数字 1 到 10。

4. 计算阶乘:MOV CX, 5。

MOV AX, 1。

LOOP_START:MUL CX.LOOP LOOP_START.这段代码计算 5 的阶乘,并将结果存储在 AX 寄存器中。

5. 判断奇偶数:MOV AX, 7。

AND AX, 1。

这段代码将 7 存储在 AX 寄存器中,然后将 AX 中的值与 1进行与运算,结果为 1,表示奇数。

6. 字符串反转:MOV SI, OFFSET str.MOV DI, OFFSET str.MOV CX, LENGTHOF str.DEC CX.REVERSE_LOOP:MOV AL, [SI]MOV DL, [DI+CX]MOV [DI+CX], AL.MOV [SI], DL.INC SI.LOOP REVERSE_LOOP.这段代码将字符串 `str` 反转。

7. 计算斐波那契数列:MOV CX, 10。

MOV AX, 0。

MOV BX, 1。

FIB_LOOP:ADD AX, BX.XCHG AX, BX.LOOP FIB_LOOP.这段代码计算斐波那契数列的前 10 个数。

8. 判断一个数是否为质数:MOV AX, 17。

MOV BX, 2。

CHECK_PRIME:XOR DX, DX.DIV BX.CMP DX, 0。

汇编语言程序汇总

汇编语言程序汇总

例:延时程序,多重循环实现软件延时。 DELAY:MOV DX,3FFH TIME:MOV AX,0FFFFH TIME1:DEC AX NOP JNE TIME1 DEC DX JNE TIME RET
内循环控制变量AX,初值=FFFFH 外循环控制变量DX,初值=3FFH
五、字符串处理程序
字符:ASCII码 说明:
MOV PRODUCT[BX+2], AX
MOV PRODUCT[BX+4], DX
PUSHF
; 保存后一次相加的进位标志
MOV AX, MULNUM[BX+2] ; A→AX
MUL DI
; A×C
POPF;标志出栈
ADC DX,0 ADC AX, PRODUCT[BX+4] ; 与部分积4的相应部分相加 ADC DX, 0 MOV PRODUCT[BX+4], AX MOV PRODUCT[BX+6], DX RET START ENDP CODE ENDS END BEGIN
START PROC FAR
; 定义子程序
ASSUME CS:CODE,DS:DATA,SS:STACK
BEGIN: PUSH DS
;(4)置子程序返回地址
MOV AX,0
PUSH AX
MOV AX,DATA
;置DS
MOV DS,AX
MOV AX,STACK
;置SS
MOV SS,AX
MOV AX,TOP
mov dl,0 ;串长度初始DL=0
mov al,cr ;结束符→AL
again:scasb
;搜索串
je done;找到转DONE,停止搜索
inc dl

实用汇编子程序举例 4-4

实用汇编子程序举例 4-4

余数左移
移位计数器置 8
清CY进位位,余数左移一位 标志位← 高位← 低位← CY
余数(高位)—除数
Y
标志位=1 N Y CY=0 N
够减 商上1
不够减 恢复余数
保存余数
次数-1 =0
N
图4.24 部分余数左移算法流程图
Y 结束
(2) 汇编语言源程序。 ;程序名:DDIV ;功能:16位∕8位无符号数除法 ;入口参数:被除数存放在R6、R5(R6高8位,R5低8位) 中,除数存放在R2中 ;出口参数:商存放在R5中,余数存放在R6中
ANL
PUSH CLR
A,#0FH
ACC C
;屏蔽掉高4位
;将A暂存到堆栈中 ;清CY
SUBB JC LOOP
A,#0AH
;A-10 ;判断有否借位 ;如果没有借位,表示 A≥10
POP ACC
ADD A,#37H
SJMP
LOOP: POP ADD FINISH: POP RET
FINISH
ACC A,#30H PSW ;否则A<10
与实现双字节乘法的部分积右移算法类似,双字节除
法采用部分余数左移的算法。该算法仿照手算的方法编制, 基本思想如下:
商数 除数√被除数 - 除数 余数 - 除数 商上0,并恢复减法前的余数 余数 - 除数 …
;试做减法,够减商上1
;再试做减法,不够减,
;再做减法
手工算法中,习惯将余数右移对齐。在计算机中,保 留了手工算法的特点,但采用部分余数左移的方法。部分 余数左移算法流程图如图4.24所示。
MOV
DIV
B,#100
AB ;除法指令,A/B →商在A中,余数在B中

汇编延时1s的延时子程序

汇编延时1s的延时子程序

汇编延时1s的延时子程序一、延时子程序的概念延时子程序是指在程序中设置一个时间延迟,使得程序在执行到该子程序时暂停一段时间后再继续执行下一条指令。

在汇编语言中,常用的延时子程序有软件延时和硬件延时两种。

二、软件延时的实现方法1. 循环计数法循环计数法是一种简单而常用的软件延时方法。

其原理是利用CPU进行循环计数,当计数器达到设定值后,即完成了指定的时间延迟。

2. 空循环法空循环法是在循环体内不执行任何有意义的操作,只进行空转等待的方法。

其原理是利用CPU进行忙等待,当指定的时间到达后再继续执行下一条指令。

三、硬件延时的实现方法硬件延时是通过外部电路或芯片来实现的。

常用的硬件延时器有555定时器和8254可编程定时器等。

四、汇编语言实现1s延时子程序以下以循环计数法为例,介绍如何使用汇编语言实现1s延时子程序。

1. 程序思路:(1)将需要等待的时间转换为机器周期;(2)循环计数,当计数器达到指定值时,跳出循环。

2. 程序代码:delay:mov cx, 0FFFFh ;将计数器初始化为最大值mov dx, 0FFFFhdelay1:loop delay1 ;循环计数dec dx ;减少dx的值jnz delay1 ;如果dx不为0,则继续循环dec cx ;减少cx的值jnz delay1 ;如果cx不为0,则继续循环ret ;延时结束,返回3. 程序说明:(1)mov cx, 0FFFFh:将CX寄存器初始化为最大值,即65535;(2)mov dx, 0FFFFh:将DX寄存器初始化为最大值,即65535;(3)loop delay1:循环计数,每次减少CX的值,当CX的值为0时跳出循环;(4)dec dx:每次减少DX的值;(5)jnz delay1:如果DX的值不为0,则跳转到delay1标号处继续执行循环;(6)dec cx:每次减少CX的值;(7)jnz delay1:如果CX的值不为0,则跳转到delay1标号处继续执行循环;(8)ret:延时结束,返回。

几个简单汇编程序

几个简单汇编程序

03
汇编语言的应用领域
汇编语言广泛应用于系统软件、嵌入式系统、游戏开发等领域。由于汇
编语言具有直接控制硬件的能力,因此在底层系统开发中具有不可替代
的作用。
汇编语言的未来发展趋势
高级汇编语言的兴

随着计算机技术的不断发展,高 级汇编语言逐渐兴起。高级汇编 语言在保持底层硬件控制能力的 同时,提高了编程的效率和可读 性。
系统软件编程
1 2 3
系统内核开发
汇编语言是系统内核开发的重要工具,用于编写 操作系统底层的核心代码,如内存管理、进程调 度等。
系统工具与驱动程序
汇编语言常用于编写系统工具和硬件驱动程序, 如磁盘驱动、网络驱动等,以实现与硬件的直接 交互。
系统性能优化
汇编语言可以用于优化系统软件的性能,通过对 指令集的精细控制和优化,提高程序的执行效率。
预处理
在汇编之前,通常会进行预处理。 预处理器根据预处理指令(例如 #include)将头文件的内容插入 到源代码中。
符号解析
汇编器在汇编过程中会解析源代码 中的符号(例如变量和函数名)。 如果符号未定义,则会产生错误。
代码生成
最后,汇编器将解析后的指令和数 据转换成机器语言目标代码。
链接过程
静态链接
01 一个典型的汇编语言程序包括程序头、程序 体和程序尾三个部分。
02
程序头通常包含程序名、版本信息、版权声 明等。
03
程序体由一系列的汇编指令组成,用于实现 特定的功能。
ห้องสมุดไป่ตู้04
程序尾通常包含程序的结束标志和注释信息 。
02 简单汇编程序示例
计算两个数的和
汇编指令
MOV AX, [num1]、ADD AX, [num2]、MOV [result], AX

常用汇编子程序

常用汇编子程序

一、前言科技的进步需要技术不断的提升。

一块大而复杂的模拟电路花费了您巨大的精力,繁多的元器件增加了您的成本。

而现在,只需要一块几厘米见方的单片机,写入简单的程序,就可以使您以前的电路简单很多。

相信您在使用并掌握了单片机技术后,不管在您今后开发或是工作上,一定会带来意想不到的惊喜。

二、单片机简介我国开始使用单片机是在1982 年,短短五年时间里发展极为迅速。

1986 年在上海召开了全国首届单片机开发与应用交流会,有的地区还成立了单片微型计算机应用协会,那是全国形成的第一次高潮。

截止今日,单片机应用技术飞速发展,我们上因特网输入一个“单片机”的搜索,将会看到上万个介绍单片机的网站,这还不包括国外的。

与它相应的专业杂志现在也有很多,比如由单片机界的权威何立民主编的《单片机与嵌入式系统应用》杂志现以风靡电子界,在2003年7月,(91 猎头网)在上海、广州、北京等大城市所做的一次专业人才需求报告中,单片机人才的需求量位居第一。

一块小小的片子,为何有这样的魔力?我们首先从它的构成说起:单片机,亦称单片微电脑或单片微型计算机。

它是把中央处理器(CPU)、随机存取存储器(RAM)、只读存储器(ROM)、输入/输出端口(I/0)等主要计算机功能部件都集成在一块集成电路芯片上的微型计算机。

计算机的产生加快了人类改造世界的步伐,但是它毕竟体积大。

微计算机(单片机)在这种情况下诞生了,它为我们改变了什么?纵观我们现在生活的各个领域,从导弹的导航装置,到飞机上各种仪表的控制,从计算机的网络通讯与数据传输,到工业自动化过程的实时控制和数据处理,以及我们生活中广泛使用的各种智能IC 卡、电子宠物等,这些都离不开单片机。

以前没有单片机时,这些东西也能做,但是只能使用复杂的模拟电路,然而这样做出来的产品不仅体积大,而且成本高,并且由于长期使用,元器件不断老化,控制的精度自然也会达不到标准。

在单片机产生后,我们就将控制这些东西变为智能化了,我们只需要在单片机外围接一点简单的接口电路,核心部分只是由人为的写入程序来完成。

汇编语言之子程序

汇编语言之子程序

汇编语言之子程序汇编语言是一种底层编程语言,是计算机指令的集合表示形式。

在汇编语言中,子程序是一段独立的、可重复使用的代码片段,可以在程序中被多次调用。

子程序可以帮助我们实现代码的模块化,提高代码的可读性和可维护性。

本文将介绍如何在汇编语言中使用子程序以及其工作原理。

一、子程序的定义和使用在汇编语言中,子程序由一系列指令组成,这些指令可以完成特定的功能。

子程序可以通过call指令被调用,执行完子程序后会返回到调用子程序的指令处,继续执行程序的下一条指令。

在使用子程序前,我们需要先定义子程序。

定义子程序的语法如下:```subroutine_name:; 子程序代码ret```其中,subroutine_name是子程序的名称,可以根据实际需求自定义。

ret指令用于返回到调用子程序的指令处,继续执行程序的下一条指令。

调用子程序的语法如下:```call subroutine_name```其中,subroutine_name是要调用的子程序的名称。

二、传递参数和返回值子程序可以接收参数,并且可以有返回值。

在调用子程序时,可以通过寄存器或栈来传递参数。

在子程序内部,可以通过相应的寄存器或栈地址来获取参数的值。

例如,我们定义一个计算两个数之和的子程序add:```add:mov ax, [bp+4] ; 获取第一个参数的值add ax, [bp+6] ; 获取第二个参数的值ret```在主程序中调用add子程序:```mov ax, 5 ; 第一个参数mov bx, 10 ; 第二个参数call add ; 调用add子程序; 此时ax寄存器中的值为15,即5+10的结果```在子程序add中,我们通过寻址方式获取传递的参数,并将计算结果存入ax寄存器中,供主程序使用。

三、保存和恢复寄存器在汇编语言中,调用子程序时需要保存和恢复寄存器的值,以保证程序的正确执行。

在调用子程序前,我们可以使用push指令将需要保存的寄存器值压栈,然后在子程序的开头使用相应的pop指令将值弹出并恢复。

汇编语言程序 掌握子程序的设计范文精简处理

汇编语言程序 掌握子程序的设计范文精简处理

汇编语言程序掌握子程序的设计汇编语言程序掌握子程序的设计子程序的定义和使用,我们需要了解子程序的定义和使用。

在汇编语言中,子程序通常由一段带有入口点和出口点的代码块组成。

入口点是子程序被调用的位置,而出口点是子程序执行完毕后返回的位置。

下面是一个简单的子程序的定义示例:; 子程序的说明subroutine:; 子程序的代码逻辑ret在上面的示例中,`subroutine` 是子程序的入口点,`ret` 是子程序的出口点。

当程序执行到 `ret` 指令时,将返回到调用子程序的位置继续执行后续的代码。

调用子程序的方法是使用 `call` 指令,以指令的形式告诉处理器需要调用的子程序入口点的位置。

例如:call subroutine这将会跳转到 `subroutine` 的入口点开始执行子程序的代码,然后在子程序执行完毕后返回到 `call` 指令的下一条指令继续执行后续的代码。

子程序的设计原则设计一个高效和可重用的子程序需要遵循一些设计原则:1. 单一责任原则一个子程序应该只负责一个特定的任务或功能。

这样可以使子程序的设计更加清晰和可重用。

2. 输入和输出参数子程序应该通过参数来接收输入的数据,并将处理后的数据通过参数返回。

这样可以增加子程序的灵活性和可重用性。

3. 注释和文档为子程序添加详细的注释和文档,可以使其他程序员更容易理解和使用子程序。

注释应该清晰地描述子程序的功能、输入和输出参数以及注意事项。

4. 错误处理子程序应该具备良好的错误处理机制,它应该能够在遇到错误时返回错误码或抛出异常。

这样可以提高程序的可靠性和可维护性。

5. 可测试性设计可测试的子程序是很重要的。

你可以为每个子程序编写对应的测试用例,以确保子程序的正确性和稳定性。

子程序的优化技巧除了以上的设计原则,还有一些优化技巧可以提高子程序的性能:1. 寄存器的使用在子程序中尽可能地使用寄存器进行计算和存储临时数据,而不是使用内存。

因为寄存器的读写速度要远快于内存,可以显著提高程序的执行效率。

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

实用汇编程序实用汇编程序实用汇编程序实用汇编程序实用汇编程序实用汇编程序实用汇编程序实用汇编程序实用汇编程序实用汇编程序(一) MCS-51定点运算子程序库及其使用说明定点运算子程序库文件名为DQ51.ASM,为便于使用,先将有关约定说明如下: 1.多字节定点操作数:用[R0]或[R1]来表示存放在由R0或R1指示的连续单元中的数据。

地址小的单元存放数据的高字节。

例如:[R0]=123456H,若(R0)=30H,则(30H)=12H,(31H)=34H,(32H)=56H。

2.运算精度:单次定点运算精度为结果最低位的当量值。

3.工作区:数据工作区固定在PSW、A、B、R2~R7,用户只要不在工作区中存放无关的或非消耗性的信息,程序就具有较好的透明性。

(1) 标号: BCDA 功能:多字节BCD码加法入口条件:字节数在R7中,被加数在[R0]中,加数在[R1]中。

出口信息:和在[R0]中,最高位进位在CY中。

影响资源:PSW、A、R2 堆栈需求: 2字节BCDA: MOV A,R7 ;取字节数至R2中MOV R2,AADD A,R0 ;初始化数据指针MOV R0,AMOV A,R2ADD A,R1MOV R1,ACLR CBCD1: DEC R0 ;调整数据指针DEC R1MOV A,@R0ADDC A,@R1 ;按字节相加DA A ;十进制调整MOV @R0,A ;和存回[R0]中DJNZ R2,BCD1 ;处理完所有字节RET(2) 标号: BCDB 功能:多字节BCD码减法入口条件:字节数在R7中,被减数在[R0]中,减数在[R1]中。

出口信息:差在[R0]中,最高位借位在CY中。

影响资源:PSW、A、R2、R3 堆栈需求: 6字节第 1 页BCDB: LCALL NEG1 ;减数[R1]十进制取补LCALL BCDA ;按多字节BCD码加法处理CPL C ;将补码加法的进位标志转换成借位标志MOV F0,C ;保护借位标志LCALL NEG1 ;恢复减数[R1]的原始值MOV C,F0 ;恢复借位标志RETNEG1: MOV A,R0 ;[R1]十进制取补子程序入口XCH A,R1 ;交换指针XCH A,R0LCALL NEG ;通过[R0]实现[R1]取补MOV A,R0XCH A,R1 ;换回指针XCH A,R0RET(3) 标号: NEG 功能:多字节BCD码取补入口条件:字节数在R7中,操作数在[R0]中。

出口信息:结果仍在[R0]中。

影响资源:PSW、A、R2、R3 堆栈需求: 2字节NEG: MOV A,R7 ;取(字节数减一)至R2中DEC AMOV R2,AMOV A,R0 ;保护指针MOV R3,ANEG0: CLR CMOV A,#99HSUBB A,@R0 ;按字节十进制取补MOV @R0,A ;存回[R0]中INC R0 ;调整数据指针DJNZ R2,NEG0 ;处理完(R2)字节MOV A,#9AH ;最低字节单独取补SUBB A,@R0MOV @R0,AMOV A,R3 ;恢复指针MOV R0,ARET(4) 标号: BRLN 功能:多字节BCD码左移十进制一位(乘十) 入口条件:字节数在R7中,操作数在[R0]中。

出口信息:结果仍在[R0]中,移出的十进制最高位在R3中。

影响资源:PSW、A、R2、R3 堆栈需求: 2字节BRLN: MOV A,R7 ;取字节数至R2中MOV R2,AADD A,R0 ;初始化数据指针MOV R0,A第 2 页MOV R3,#0 ;工作单元初始化BRL1: DEC R0 ;调整数据指针MOV A,@R0 ;取一字节SWAP A ;交换十进制高低位MOV @R0,A ;存回MOV A,R3 ;取低字节移出的十进制高位XCHD A,@R0 ;换出本字节的十进制高位MOV R3,A ;保存本字节的十进制高位DJNZ R2,BRL1 ;处理完所有字节RET(5) 标号: MULD 功能:双字节二进制无符号数乘法 入口条件:被乘数在R2、R3中,乘数在R6、R7中。

出口信息:乘积在R2、R3、R4、R5中。

影响资源:PSW、A、B、R2~R7 堆栈需求: 2字节 MULD: MOV A,R3 ;计算R3乘R7MOV B,R7MUL ABMOV R4,B ;暂存部分积MOV R5,AMOV A,R3 ;计算R3乘R6MOV B,R6MUL ABADD A,R4 ;累加部分积MOV R4,ACLR AADDC A,BMOV R3,AMOV A,R2 ;计算R2乘R7MOV B,R7MUL ABADD A,R4 ;累加部分积MOV R4,AMOV A,R3ADDC A,BMOV R3,ACLR ARLC AXCH A,R2 ;计算R2乘R6MOV B,R6MUL ABADD A,R3 ;累加部分积MOV R3,AMOV A,R2ADDC A,BMOV R2,ARET第 3 页(6) 标号: MUL2 功能:双字节二进制无符号数平方 入口条件:待平方数在R2、R3中。

出口信息:结果在R2、R3、R4、R5中。

影响资源:PSW、A、B、R2~R5 堆栈需求: 2字节MUL2: MOV A,R3 ;计算R3平方MOV B,AMUL ABMOV R4,B ;暂存部分积MOV R5,AMOV A,R2 ;计算R2平方MOV B,AMUL ABXCH A,R3 ;暂存部分积,并换出R2和R3XCH A,BXCH A,R2MUL AB ;计算2×R2×R3CLR CRLC AXCH A,BRLC AJNC MU20INC R2 ;累加溢出量MU20: XCH A,B ;累加部分积ADD A,R4MOV R4,AMOV A,R3ADDC A,BMOV R3,ACLR AADDC A,R2MOV R2,ARET(7) 标号:DIVD 功能:双字节二进制无符号数除法 入口条件:被除数在R2、R3、R4、R5中,除数在R6、R7中。

出口信息:OV=0 时,双字节商在R2、R3中,OV=1 时溢出。

影响资源:PSW、A、B、R1~R7 堆栈需求: 2字节DIVD: CLR C ;比较被除数和除数MOV A,R3SUBB A,R7MOV A,R2SUBB A,R6JC DVD1SETB OV ;溢出RET第 4 页DVD1: MOV B,#10H ;计算双字节商DVD2: CLR C ;部分商和余数同时左移一位MOV A,R5RLC AMOV R5,AMOV A,R4RLC AMOV R4,AMOV A,R3RLC AMOV R3,AXCH A,R2RLC AXCH A,R2MOV F0,C ;保存溢出位CLR CSUBB A,R7 ;计算(R2R3-R6R7)MOV R1,AMOV A,R2SUBB A,R6ANL C,/F0 ;结果判断JC DVD3MOV R2,A ;够减,存放新的余数MOV A,R1MOV R3,AINC R5 ;商的低位置一DVD3: DJNZ B,DVD2 ;计算完十六位商(R4R5)MOV A,R4 ;将商移到R2R3中MOV R2,AMOV A,R5MOV R3,ACLR OV ;设立成功标志RET(8) 标号: D457 功能:双字节二进制无符号数除以单字节二进制数 入口条件:被除数在R4、R5中,除数在R7中。

出口信息:OV=0 时,单字节商在R3中,OV=1 时溢出。

影响资源:PSW、A、R3~R7 堆栈需求: 2字节D457: CLR CMOV A,R4SUBB A,R7JC DV50SETB OV ;商溢出RETDV50: MOV R6,#8 ;求平均值(R4R5/R7-→R3)DV51: MOV A,R5RLC A第 5 页MOV R5,AMOV A,R4RLC AMOV R4,AMOV F0,CCLR CSUBB A,R7ANL C,/F0JC DV52MOV R4,ADV52: CPL CMOV A,R3RLC AMOV R3,ADJNZ R6,DV51MOV A,R4 ;四舍五入ADD A,R4JC DV53SUBB A,R7JC DV54DV53: INC R3DV54: CLR OVRET(9) 标号: DV31 功能:三字节二进制无符号数除以单字节二进制数 入口条件:被除数在R3、R4、R5中,除数在R7中。

出口信息:OV=0 时,双字节商在R4、R5中,OV=1 时溢出。

影响资源:PSW、A、B、R2~R7 堆栈需求: 2字节DV31: CLR CMOV A,R3SUBB A,R7JC DV30SETB OV ;商溢出RETDV30: MOV R2,#10H ;求R3R4R5/R7-→R4R5DM23: CLR CMOV A,R5RLC AMOV R5,AMOV A,R4RLC AMOV R4,AMOV A,R3RLC AMOV R3,AMOV F0,CCLR C第 6 页SUBB A,R7ANL C,/F0JC DM24MOV R3,AINC R5DM24: DJNZ R2,DM23MOV A,R3 ;四舍五入ADD A,R3JC DM25SUBB A,R7JC DM26DM25: INC R5MOV A,R5JNZ DM26INC R4DM26: CLR OVRET ;商在R4R5中(10) 标号: MULS 功能:双字节二进制有符号数乘法(补码) 入口条件:被乘数在R2、R3中,乘数在R6、R7中。

出口信息:乘积在R2、R3、R4、R5中。

影响资源:PSW、A、B、R2~R7 堆栈需求: 4字节MULS: MOV R4,#0 ;清零R4R5MOV R5,#0LCALL MDS ;计算结果的符号和两个操作数的绝对值LCALL MULD ;计算两个绝对值的乘积SJMP MDSE ;用补码表示结果(11) 标号: DIVS 功能:双字节二进制有符号数除法(补码) 入口条件:被除数在R2、R3、R4、R5中,除数在R6、R7中。

出口信息:OV=0时商在R2、R3中,OV=1时溢出。

影响资源:PSW、A、B、R1~R7 堆栈需求: 5字节DIVS: LCALL MDS ;计算结果的符号和两个操作数的绝对值PUSH PSW ;保存结果的符号LCALL DIVD ;计算两个绝对值的商JNB OV,DVS1 ;溢出否?POP ACC ;溢出,放去结果的符号,保留溢出标志RETDVS1: POP PSW ;未溢出,取出结果的符号MOV R4,#0MOV R5,#0MDSE: JB F0,MDS2 ;用补码表示结果CLR OV ;结果为正,原码即补码,计算成功RETMDS: CLR F0 ;结果符号初始化MOV A,R6 ;判断第二操作数的符号第 7 页JNB ACC.7,MDS1;为正,不必处理CPL F0 ;为负,结果符号取反XCH A,R7 ;第二操作数取补,得到其绝对值CPL AADD A,#1XCH A,R7CPL AADDC A,#0MOV R6,AMDS1: MOV A,R2 ;判断第一操作数或运算结果的符号JNB ACC.7,MDS3;为正,不必处理CPL F0 ;为负,结果符号取反MDS2: MOV A,R5 ;求第一操作数的绝对值或运算结果的补码CPL AADD A,#1MOV R5,AMOV A,R4CPL AADDC A,#0MOV R4,AMOV A,R3CPL AADDC A,#0MOV R3,AMOV A,R2CPL AADDC A,#0MOV R2,AMDS3: CLR OV ;运算成功RET(12) 标号: SH2 功能:双字节二进制无符号数开平方(快速) 入口条件:被开方数在R2、R3中。

相关文档
最新文档