1、1汇编语言的实例设计【摘要】本文研究并介绍了汇编语言,利用汇编语言编写了一下典型的实例。第一章是汇编语言的一些简介;第二章总结了一些汇编语言的作用和特点;第三章中利用汇编语言编写了一些典型的实例来加深对汇编语言的认识。【Abstract】 The first chapter is a short introduction assembly language. The second chapter summarizes some assembly language functions and features. The third chapter using assembly language
2、some typical examples to deepen the understanding of assembly language.【关键字】汇编语言;实例设计【keywords】Assembly Language,;example design2目录1 引言2 汇编语言的作用和特点2.1 汇编语言的作用2.2 汇编语言的主要特点3 汇编语言典型实例设计3.1 条件转移指令3.2 算术运算指令3.3 移位运算指令3.4 综合实例4 结束语参考文献31 引言。 2计算机的工作是依靠机器语言来实现的,而机器语言由于编写的程序不易读、出错率高、难以维护等原因,不能得到广泛应用。在机器语言的
3、基础上,用助记符代替操作码,用地址符号(Symbol)或标号(Label)代替地址码。这样用符号代替机器语言的二进制码,就把机器语言变成了汇编语言。由于在某些领域中汇编语言的特点较适合编写程序,因此汇编语言得到了广泛的应用。 52汇编语言的作用和特点2.1汇编语言的作用汇编语言是面向机器的程序设计语言。汇编语言是汇编指令集、伪指令集和使用它们规则的统称。汇 编 语 言 直 接 同 计 算 机 的 底 层 软 件 甚 至 硬 件 进 行 交互 , 它 的 作 用 主 要 体 现 在 :(1)能 够 直 接 访 问 与 硬 件 相 关 的 存 储 器 或 I/O 端 口 。 (2)能 够 不 受
4、编 译 器 的 限 制 , 对 生 成 的 二 进 制 代 码 进 行 完 全 的 控 制 。 (3)能 够 对 关 键 代 码 进 行 更 准 确 的 控 制 , 避 免 因 线 程 共 同 访 问 引 起 死 锁 。(4)能 够 根 据 特 定 的 应 用 对 代 码 做 最 佳 的 优 化 , 提 高 运 行 速 度 。(5)能 够 最 大 限 度 地 发 挥 硬 件 的 功 能 。2.2汇编语言的主要特点一方面,汇编语言指令是用一些具有相应含义的助忆符来表达的,所以,它要比机器语言容易掌握和运用,但另一方面,它要直接使用 CPU 的资源,相对高级程序设计语言来说,它又显得难掌握。 34
5、汇编语言程序归纳起来大概有以下几个主要特点:(1)与机器相关性汇编语言指令是机器指令的一种符号表示,而不同类型的 CPU 有不同的机器指令系统,也就有不同的汇编语言,所以,汇编语言程序与机器有着密切的关系。由于汇编语言程序与机器的相关性,所以,除了同系列、不同型号 CPU 之间的汇编语言程序有一定程度的可移植性之外,其它不同类型(如:小型机和微机等)CPU 之间的汇编语言程序是无法移植的,也就是说,汇编语言程序的通用性和可移植性要比高级语言程序低。(2)执行的高效率正因为汇编语言有“与机器相关性”的特性,程序员用汇编语言编写程序时,可充分发挥自己的聪明才智,对机器内部的各种资源进行合理的安排,
6、让它们始终处于最佳的使用状态,这样做的最终效果就是:程序的执行代码短,执行速度快,这也是汇编语言程序执行高效率的原因之一。(3)编写程序的复杂性汇编语言是一种面向机器的语言,其汇编指令与机器指令基本上一一对应,所以,汇编指令也同机器指令一样具有功能单一、具体的特点。要想完成某件工作,就必须安排 CPU 的每步工作另外,在编写汇编语言程序时,还要考虑机器资源的限制、汇编指令的细节和限制等等。由于汇编语言程序要安排运算的每一个细节,这就使得编写汇编语言程序比较繁琐、复杂。一个简单的计算公式或计算方法,也要用一系列汇编指令一步一步来实现。(4)调试的复杂性在通常情况下,调试汇编语言程序要比调试高级语
7、言程序困难,其主要原因有四:汇编语言指令涉及到机器资源的细节,在调试过程中,要清楚每个资源的变化情况; 程序员在编写汇编语言程序时,为了提高资源的利用率,可以使用各种实现技巧,而这些技巧完全有可能破坏程序的可读性。这样,在调试过程中,除了要知道每条指令的执行功能,还要清楚它在整个解题过程中的作用; 高级语言程序几乎不显式地使用“转移语句 ”,但汇编语言程序要用到大量的、各类转移指令,这些跳转指令大大地增加了调试程序的难度。如果在汇5编语言程序中也强调不使用“转移指令” ,那么,汇编语言程序就会变成功能单调的顺序程序,这显然是不现实的。3汇编语言典型实例设计3.1条件转移指令例 1:将内存中表
8、list 中的前 10 个数求和(设每个数为 16 位)C 语言:int count=10;int sum=0; int i=0;while (count0)sum=sum+Listi;count=count-1;i=i+1;汇编语言:MOV CX , 10 ; countMOV AX , 0 ; sumMOV DI , 0 ; 偏移地址Start: CMP CX , 0JE end ; (CX)=0 时转移ADD AX , ListDISUB CX , 1ADD DI , 2JMP startEnd6例 2:统计表 List 中前 100 个字节中的“0” , “=0”, “0) CA+;e
9、lse if (Listi=0) CE+;else CB+;汇编语言MOV CX,0MOV CA,0MOV CB,0MOV CE,0S:CMP CX,10JE endMOV DI,0ADD CX,1CMP ListDI,0JBE nextADD CA,1JMP Cnext: CMP ListDI,0JE next1ADD CB,1JMP Cnext1: ADD CE,1C: ADD DI,1JMP SEnd73.2算术运算指令例 3:分析“ADD AX,BX”:设执行前(AX)=35C9H, (BX)=726DH执行后(AX)=A836H,BX 不变, SF=1, PF=1, 2F=0, 0F
10、=1, CF=0, AF=1例 4:分析“SUB CX,BX”:设执行前(CX)=1296H, (DS)=2000H,(BX)=100H,(20100H)=3DH,(20101H)=28H, 由BX寻址得到数据283DH;执行后:(CX)=0EA59H,BX 不变, SF=1, PF=1, 2F=0, 0F=0, CF=1, AF=1例 5:分析“IMUL BL”:设执行前(AL)=05H, (BL)=F7H,(补)=-9执行后(AX)=FFD3H(即-(05*09)的补码)例 6:分析“IDIV VL”:设执行前(AX)=FF05H, (BL)=17H,(补)=-9执行后(AL)=F6H(-
11、10 的补,为商),(AH)=EBH(-21 的补,为余数)例 7:对长数的运算 求“7H0A15BEH”“30517A6BH”加法:MOV AX,15BEHADD AX,7A6BHMOV DX,7H0AHADD DX,3051H减法:MOV AX,15BEHSUB AX,7A6BHMOV DX,7H0AHSBB DX,3051H83.3移位运算指令例 8:将 AL 中压缩的 BCD 码转化为两个字节的 ASCII 码送 BX,设(AL)=a 1a0HMOV BH,AL; 备份MOV CK,4; 设移位次数SHR BH,CL; (BH)=0a1HADD BH 30H; 调为 ASCII 码MO
12、V BL,AL; 另一备份AND BL 0FH; (BH)=0a2HADD BL,30H; 调为 ASCII 码例 9:不用乘法指令编写程序段实现 AX(AX)*10用移位指令 1SHL AX,1; *2MOV BX,AX; 备份SHK AX,1; *2SHL AX,1; *2ADD AX,BX用加法指令 2ADD AX,AXMOV BX,AXADD AX,AXADD AX,AXADD AX,BX注:(AX)*10=(AX)*(23+2)=(AX)*23+(AX)*2=(AX)*2)*2)*2+(AX)*293.4 综合实例例 10:设变量 char 中存储了一个字符,若七位大写则将其改为小写
13、MOV AL,char;CMP AL,A;JB exit;CMP AL,Z;JA exit;ADD char,20H;该指令只在大写时被执行(小写字母的 ASCII 码比大写的大 20H)exit:例 11:求 DX:AX(共 32 位)的相反数NOT AXNOT DXADD AX,1ADC DX,0例 12:求 55 矩阵的转置兼程序格式识别DATA segment A DW 20,50,90,30,51;DW 40,50,96,30,81DW 36,53,93,80,56DW 20,53,80,36,51DW 26,68,93,30,58DATA endsSTACK segment PAR
14、A STACK STACKSTAPN DW 20 DUP(?)TOP LABEL WORDSTACK ends10Code segmentAssume CS:Code,DS:DATA,SS:STACKSTART: MOV AX,DATAMOV DS,AXMOV AX,STACKMOV SS,AXMOV AX,offset TopMOV SP,AXMOV CX,4;MOV BX,0;Loop1: push CX;MOV SI,2MOV DI,2Loop2: push ABXSIpush ABXDIpop ABXSIpop ABXDIADD SI,2ADD DI,2Loop Loop2;ADD B
15、X,0CH;Pop CX;Loop Loop1;MOV AH,4CHInt 21Hcode endsend start例 13:以十六进制显示变量 bhout 中的一个字节11MOV AL,bhout; (AL)=x4x3x2x1y4y3y2y1Band AL,1111000B; (AL)=x4x3x2x10000BMOV CL,4; 设置移位次数SHR AL,CL; (AL)=0000x4x3x2x1BMOV BL,bhout; (BL)=x4x3x2x1y4y3y2y1BAnd BL,00001111B;(BL)=0000y4y3y2y1BMOV CX,2; 设置循环次数(显示两个字符)M
16、OV BH,AL (BH)=0000x4x3x2x1Bpbh1: CMP BH,10;JB pbh2; (BH)10 时转移ADD BH,37H;数字 AFASCII 码JMP pbh3pbh2: ADD BH,30H;数字 09ASCII 码pbh3: MOV AH,02; 带 21H 号程序的第 2 号MOV DK,BH; 被显示字符的 ASCII 码INT 21H; 调用 DOS 的第 21H 号程序MOV BH,BL;(BH)=0000y4y3y2y1B 下一次被显示Loop pbh1例 14:将 BX 中存储的数以十六进制显示出来MOV CX,1dPUSH CXMOV CX,10dP
17、USH CXMOV CX,100dPUSH CXMOV CX,1000dPUSH CXMOV CX,10000d12PUSH CXMOV CX,5; 循环 5 次S: POP BP; (BP)除数(10000,1000,1000,10,1)MOV AX,BX; (BX)/(BX) 商DX 余数ALMOV DX,0DIV BPMOV BX,X; remainder to BXMOV DL,AL; quotient to DLADD DL,30H convert to ASCIIMOV AH,02INT 21hLoop S例 15:扬声器发声控制程序(61H 号端口可认为是一个控制端口)约定该位取
18、 0 时关闭 2 号定时器控制其他设备的控制位 该位是扬声器的开关(1:打开 0:关闭)code segment 代码段开始main proc far 主过程开始assume cs:code,ds:code 代码段和数据段重合org 100h 让下列可执行命令从 100h 处开始存储Start: MOV dx,100 循环次数In AL,61H 输入端口的初始信息and AL,11111100B 使 b1= b0=0(关闭扬声器)Sound: XOR AL,00000010B 使 b1取反,b 0=0(控制扬声器的命令字)Out 61H ,AL 将新的命令字送到控制端口(控制收声)端口 b7b
19、6b5b4b3b2 b1 b061H X 013MOV CX,140H 设循环次数Wait1: Loop wait1 (什么都不做的空循环)Dec DXjNE Sound (DX)0 时转 Sound 处int 20H 结束运行的固定用法main endp 主过程结束code ends 代码段结束end start例 17:用汇编语言实现计算机之间的通讯接收代码之前测试数据是否准备好PUSH DX 保护 DX,DX 将用于纯端口地址MOV DX,03FDH 状态口地址COM-IN1:IN AK,DX 读状态信息TEST AL,00000001B S0=0 说明还未准备好数据JE COM_IN1
20、 继续测试状态MOV DX,03F8H 数据口地址IN AL,DX 输入数据MOV ,AL 数据存入内存 其他处理POP DX 回复 DX 原有的值发送代码之前测试是否有空Push DXPUSH AX 要发送的信息入栈MOV DX,03FDHCOM_OUT1:IN AL,DXTEST AL,00000010B S1=0 说明数据端口不空,不能再收送JE COM_OUT114POP AX 得发送数据MOV DX,03F8HOUT DX,AL POP DX4 结束语本文对机器语言汇编语言进行了介绍。通过一些典型的汇编语言实例设计,来探讨汇编语言的作用特点和应用前景。参考文献:1徐培福主编,计算机组成与结构,第二版,电子工业出版社,20062李铭,汇编语言与高级语言的混合编程, 电脑编程技巧与维护 ,2004 年10 期3王志军 房生凯,汇编语言程序设计,大连理工大学出版社,2003 4刘泰康 安风生,86 系列微处理器进展与技术特点分析, 电脑开发与应用 ,1995 年 01 期5美Smotherman Mark,History of Multithreading,2005 年