汇编课程设计 - 图文

更新时间:2024-01-17 05:19:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

攀枝花学院

学生课程设计(论文)

题 目: 判断闰年程序

加减乘除四则计算

学生姓名: 张伟 学 号: 201010801089 所在院(系): 计算机学院 专 业: 计算机科学与技术 班 级: 10级计算机科学与技术2班 指 导 教 师: 蔡旻甫 职称: 讲师

2012 年 1 月 6 日

攀枝花学院学生课程设计(论文) 设计任务书

攀枝花学院本科学生课程设计任务书

题 目 1、课程设计的目的 算术运算程序 通过本课程设计教学所要达到的目的是:1、培养学生理论联系实际的设计思想,提高学生综合运用汇编语言课程的理论知分析问题、解决问题的能力。2、通过查找、运用设计资料,完成工程设计所必备的基本训练。3、使同学们更深入的了解计算机系统内部的有关知识,为以后的学习和系统开发奠定良好的基础。 2、课程设计的内容和要求(包括原始数据、技术要求、工作要求等) 1. 判断闰年程序 设计内容:判断某年是否为闰年。 要求:年份从键盘输入,通过运行计算后,输出相应信息。 设计思路:利用DOS21H中断类型的10号键盘功能调用,将从键盘接收的年份数值型字符串按字节存入缓冲区。,将字符串中的每个字节转换为对应的十进制数值(利用0~9这10个数的ASCII码值比其本身大30H的关系),通过判断某年是否为闰年的表达式,判断输出是否为闰年的信息。 2.产生随机数并运算的程序 设计内容:编程实现产生两个随机数,并能对产生的随机数进行加法和减法运算。 设计思路:利用BIOS功能调用的时钟中断调用(1AH中调用),读取时钟计数器的值,利用随时变化的时间计数产生随机数并进行加法或减法的运算。然后将产生的随机数和运算结果转换为相应的十六进制数表示的ASCII码字符,并将其显示在屏幕上。 3.计算平台长度程序 设计内容:已知一个有序数组a ,其中有n个元素(n为整数),a中相同的元素全部集中在一起,形成一个个“平台”。用汇编语言编程,求出a中最大平台的长度。 要求:程序运行时将提示输入 设计思路:定义6个变量a、b、a0、b0、a1、b1,其中a、b、a0、b0存放从键盘输入的元素,a、b为中间变量,a0始终存放最大平台的元素;a1、b1存放数组相同元素的个数,a1中始终存放着最大平台的长度。总的思路:用回车键来结束键盘的输入。将从键盘输入的第一个元素存入a、a0中,給a1赋1,接收从键盘输入的第二个元素,存入b中,判断两个元素是否相同,若相同,则- 1 -

攀枝花学院学生课程设计(论文) 设计任务书

a1加1,否则将第二个元素存于b0中,给b1赋1。接收从键盘输入的第三个元素,与前一元素比较,若相同,则b1加1,否则,比较前两次的数组元素长度a1和b1,若a1小于b1,则将b0的值赋给a0,b1的值赋给a1。再接收下一元素,重复上述过程,直到输入回车符为止。 4.加减乘除四则计算 设计内容:设计一个能实现加、减、乘、除、取余的程序。 要求:该程序接受从键盘输入的十六进制数,执行相应得计算后,计算结果以十六进制数输出。 设计思路:将键盘输入的表达式预存入一缓冲区中,然后从该缓冲区的第一个字符开始读取判断,当读取到一个有效的表达式时,对表达式进行相应的运算后,输出用十六进制数表示的运算结果;当表达式无效时,输出表达式“ERROR(错误)”的信息或者是有效表达式“JS”的提示信息。 3、主要参考文献 [1]《汇编语言程序设计》,吴向军等,高等教育出版社,2002 [2]《IBM-PC汇编语言及程序设计》(第2版), 沈美明等,清华大学出版社,2001 [3]《IBM-PC汇编语言及程序设计实验教程》,沈美明等,清华大学出版社 ,2001 [4]《汇编语言程序设计》, 钱晓捷等,电子工业出版社,2000 [5]《汇编语言程序设计》, 张志明等,重庆大学出版社,1997 4、课程设计工作进度计划 时间(天) 1 3 内容安排 分析设计准备 编程调试阶段 1 编写课程设计报告 指导教师(签字) 教研室意见: 年 月 日 学生(签字): 日期 年 月 日 接受任务时间: 年 月 日 - 2 -

攀枝花学院学生课程设计(论文) 成绩评定表

课程设计(论文)指导教师成绩评定表

题目名称 评分项目 工作 表现 20% 01 02 03 04 学习态度 科学实践、调研 课题工作量 综合运用知识的能力 判断闰年程序和加减乘除四则计算 分值 6 7 7 10 得分 工作态度。 通过实验、试验、查阅文献、深入生产实践等渠道获取与课程设计有关的材料。 按期圆满完成规定的任务,工作量饱满。 能运用所学知识和技能去发现与解决实际问题,能正确处理实验数据,能对课题进行理论分析,得出有价值的结论。 能独立查阅相关文献和从事其他调研;能提出并评价内涵 遵守各项纪律,工作刻苦努力,具有良好的科学能力 水平 35% 05 应用文献的能力 5 较好地论述课题的实施方案;有收集、加工各种信息及获取新知识的能力。 06 设计(实验)能力,方案的设计能力 计算及计算机应用能力 对计算或实验结果的分析能力(综合分析能力、技术经济分析能力) 插图(或图纸)质量、篇幅、设计(论文)规范化程度 设计说明书(论文)质量 创新 能正确设计实验方案,独立进行装置安装、调试、5 操作等实验工作,数据正确、可靠;研究思路清晰、完整。 07 5 具有较强的数据运算与处理能力;能运用计算机进行资料搜集、加工、处理和辅助设计等。 08 10 具有较强的数据收集、分析、处理、综合的能力。 成果 质量 45% 09 5 符合本专业相关规范或规定要求;规范化符合本文件第五条要求。 综述简练完整,有见解;立论正确,论述充分,结论严谨合理;实验正确,分析处理科学。 对前人工作有改进或突破,或有独特见解。 10 11 30 10 成绩 指导教师评语 指导教师签名: 年 月 日

攀枝花学院学生课程设计(论文) 摘 要

摘 要

通过本学期学习汇编语言,掌握一定的编程技能,汇编语言也是计算机应用中重要的语言之一。本课程设计编写判断闰年程序和加减法四则运算两个程序。程序一功能从键盘输入年份,然后计算判断该年份是否为闰年,判断闰年的规则是:如果某一年能被4整除但不能被100整除或者该年能被400整除,则该年为闰年(程序一为我此次实验的侧重点)。程序二功能从键盘接收输入数字完成加减乘除取余的四则运算。将课本上的子程序调用和宏定义等有关知识和实际应用有机的结合起来,提高分析和解决实际问题的能力;通过对通讯录汇编语言程序代码的阅读、修改、设计,理解和掌握复杂的汇编语言应用程序的编程,从而提高自身实践编程能力。

关键词 汇编,判断闰年,四则运算,DOS功能调用,Debug调试

-I-

攀枝花学院学生课程设计(论文) ABSTRACT

ABSTRACT

Through the semester learning assembly language, to master some programming skills, computer applications in assembly language is an important language. This course is designed to write programs to determine leap year processing subtraction arithmetic two procedures. Program a year from the keyboard function, and then calculate the year to determine whether a leap year, leap year rule is to determine: If a year divisible by 4 but not divisible by 100, or the year divisible by 400, then the year is a leap year. Procedure 2 function digital receive input from the keyboard to complete addition and subtraction multiplication and division to take over the four operations. The textbook definition of a subroutine call and macro and other relevant knowledge and practical application of organic combine to improve the analysis and the ability to solve practical problems; through assembly language code for the book to read, modify, design, understand and master the complex assembly application programming language to enhance their ability to practice programming.

Keywords Compilation,To determine leap year,Arithmetic,DOS function calls,

Debug debugging

-II-

攀枝花学院学生课程设计(论文) 目录

.

目 录

摘 要?????????????????????????????????I ABSTRACT???????????????????????????????II

1课程设计题目描述和运行要求???????????????????????1 1.1题目描述和要求???????????????????????????1

1.1.1判断闰年程序???????????????????????????? 1 1.1.2加减乘除四则计算??????????????????????????1 1.2问题提出????????????????????????????????1 1.3 运行环境????????????????????????????????1 1.4 本课题涉及的知识点???????????????????????????1 2算法设计?????????????????????????????????2 2.1判断闰年程序??????????????????????????????2 2.1.1算法设计思路???????????????????????????? 2 2.1.2 程序流程图???????????????????????????2 2.1.3判断闰年的程序段?????????????????????????? 3 2.1.4调试与运行?????????????????????????????8

2.2 减乘除四则运算???????????????????????????10

2.2.1算法设计思路????????????????????????????10 2.2.2 程序流程图???????????????????????????? 11 2.2.3减乘除四则运算的程序段?????????????????????? 12 2.2.4调试与运行???????????????????????????? 26

3结论????????????????????????????????28

参考文献?????????????????????????????????29

-1-

攀枝花学院学生课程设计(论文) 1 课程设计题目描述和运行要求

1 课程设计题目描述和运行要求

1.1题目描述和要求

1.1.1 判断闰年程序

设计内容:判断某年是否为闰年。

要求:年份从键盘输入,通过运行计算后,输出相应信息。

设计思路:利用DOS21H中断类型的10号键盘功能调用,将从键盘接收的年份数值型字符串按字节存入缓冲区。,将字符串中的每个字节转换为对应的十进制数值(利用0~9这10个数的ASCII码值比其本身大30H的关系),通过判断某年是否为闰年的表达式,判断输出是否为闰年的信息。

1.1.2 加减乘除四则计算

设计内容:设计一个能实现加、减、乘、除、取余的程序。

要求:该程序接受从键盘输入的十六进制数,执行相应得计算后,计算结果以十六进制数输出。

设计思路:将键盘输入的表达式预存入一缓冲区中,然后从该缓冲区的第一个字符开始读取判断,当读取到一个有效的表达式时,对表达式进行相应的运算后,输出用十六进制数表示的运算结果;当表达式无效时,输出表达式“ERROR(错误)”的信息或者是有效表达式“JS”的提示信息。

1.2问题提出

判断闰年:如何接收输入数据(即输入年份,且为正数为有效数)?怎样判断输入年份为闰年?怎样显示判断结果等问题

加减乘除四则计算:怎样解决数据有效性问题?如何数据接收存储问题?计算结果表达及输入时式子表达方式等问题

1.3 运行环境

由于本课程主要是学习16位汇编编程,通过masm5.0编译的程序,在系统为32位XP、dos,或64位Win7环境下无法运行,虚拟机安装32位XP。环境下进行编译,和运行masm5.0编译环境,和编译完成的程序。

1.4 本课题涉及的知识点

- 1 -

攀枝花学院学生课程设计(论文) 2 算法设计

寄存器的使用—通用寄存器、段寄存器、专用寄存器;掌握16/32位微机内存管理模式。各种寻址方式—立即数寻址方式、寄存器寻址方式、直接寻址方式等荀子方式。标识符和表达式—标识符、简单内存变量定义、调整偏移量伪指令、表达式等。微机cpu指令系统—汇编指令格式、指令系统等。程序基本结构—源程序的基本组成、程序基本结构、段的基本属性等。输入与输出和中断,条件转移指令,指令的汇编格式及功能等。

2 算法设计

2.1判断闰年程序

2.1.1算法设计思路

主程序:

显示提示输入年份以及输入的字符内容,和最后输出的判断。 子程序:

1. 判断输入:该模块是对输入的年份的格式的判断,若是错误则显示错误

Error,正确则进行下面的操作。

2. 字符串转换格式:将数字字符串转换成数字,以便进行下面的程序操作。 3. 判断闰年:判断输入的年份是否为闰年,若是则输出“This is a leap

year!”,若不是则输出“This is not a leap year!”,然后退出。

2.1.2 程序流程图

- 2 -

攀枝花学院学生课程设计(论文) 2 算法设计

图2.1

2.1.3判断闰年的程序段

data segment

inbuff db 5,?,5 dup(?)

prompt db 'Please input the year:','$'

- 3 -

攀枝花学院学生课程设计(论文) 2 算法设计

errmsg db 'Input illegal!','$' yes db ' is a leap year','$' no db ' is not a leap year','$' mess db 'Continue?(y/n):','$' newline db 13,10,'$' ;回车换行 data ends code segment main proc far

assume cs:code,ds:data start: push ds sub ax,ax push ax mov ax,data mov ds,ax lop0:

call input call judge lea dx,mess mov ah,09h

int 21h ;是否继续输入年份的判断 mov ah,01h int 21h cmp al,'n' je exit continue:

lea dx,newline mov ah,09h int 21h jmp lop0 exit: ret

main endp

;输入一个具体的年份,并转换成10进制

- 4 -

攀枝花学院学生课程设计(论文) 2 算法设计

;返回:

;(ax)=输入的年份 input proc near push bx push cx push dx s1:

lea dx,prompt mov ah,09h

int 21h ; lea dx,inbuff mov ah,0ah

int 21h ; mov dl,byte ptr inbuff[1] ; cmp dl,4 ; jne error ; mov cx,4 lea bx,inbuff add bx,2 mov ax,0 mov dx,0

lop1: ; mov dl,10 mul dl

mov dl,byte ptr [bx]

sub dl,30h ; cmp dl,0 jb error cmp dl,9 ja error add ax,dx

inc bx ; loop lop1 jmp s2

提示输出 键盘输入

把有效地址为inbuff的字节送给dl 输入的值判断是否为4位数

调用输入不合条件时的错误处理 检查输入有效性 将字符转化为数值 循环体中字符在字符串中的位置bx+1 - 5 -

攀枝花学院学生课程设计(论文) 2 算法设计

error: ;错误处理 lea dx,newline mov ah,09h int 21h lea dx,errmsg mov ah,09h int 21h lea dx,newline mov ah,09h int 21h jmp s1 s2:

mov cx,ax lea dx,newline mov ah,09h int 21h mov ax,cx pop dx pop cx

pop bx ; ret input endp

;判断一个年份是否闰年 ;输入: ;(ax)=年份 judge proc near push bx push cx push dx

push ax ; mov cx,4 lea bx,inbuff add bx,2 lop2:

现场恢复 保存ax;输出要判断的年份 - 6 -

攀枝花学院学生课程设计(论文) 2 算法设计

mov dl,byte ptr [bx] mov ah,02h int 21h inc bx

loop lop2 ;循环输出年份正确时结果中的年份 lop3: pop ax mov dx,0

mov cx,ax ; mov bx,4 ; div bx cmp dx,0 jne notleap mov ax,cx

mov bx,100 ; div bx cmp dx,0

jne isleap mov ax,cx

mov bx,400 ; div bx cmp dx,0 jne notleap isleap: lea dx,yes mov ah,09h int 21h jmp s3 notleap: lea dx,no mov ah,09h int 21h s3:

;保存ax到cx中 判断是否能被4整除 判断是否能被100整除 判断是否能被400整除 换行

- 7 -

攀枝花学院学生课程设计(论文) 2 算法设计

lea dx,newline mov ah,09h

int 21h ;输出年份正确时结果的剩余部分 pop dx pop cx pop bx ret judge endp code ends

end start

2.1.4调试与运行

步骤:

建立“zhang.asm”的文件,其内容即为判断闰年的程序段,然后通过运行“cmd”,用“masm”程序汇编源文件,形成目标文件。看程序段是否存在错误。(调试后,发现不存在错误)

图2.2

- 8 -

攀枝花学院学生课程设计(论文) 2 算法设计

然后在用“link”程序将目标文件形成可执行程序

图2.3

最后运行可执行程序“zhang.exe”,运行程序后,出现界面:

图2.4

- 9 -

攀枝花学院学生课程设计(论文) 2 算法设计

输入“2012”显示“This is a leap years!”;继续,输入“y”,输入“2011显示“This is not leap years!”;结束,输入“n”。如图2.5所示:

图2.5

2.2 减乘除四则运算

2.2.1算法设计思路

设计内容:设计一个能实现加、减、乘、除、取余的程序。

要求:该程序接受从键盘输入的十六进制数,执行相应得计算后,计算结果以十六进制数输出。

设计思路:将键盘输入的表达式预存入一缓冲区中,然后从该缓冲区的第一个字符开始读取判断,当读取到一个有效的表达式时,对表达式进行相应的运算后,输出用十六进制数表示的运算结果;当表达式无效时,输出表达式“ERROR(错误)”的信息或者是有效表达式“JS”的提示信息。

2.2.2程序流程图

- 10 -

攀枝花学院学生课程设计(论文) 2 算法设计

开始 从键盘接收字符表达,放入内存 AL 从内存取第一个字符 AL 从内存取第一字符 空格符/制表符? 是否是回车符?显示键入正确表达式提示信息messl 预置结果 Call uvjg 数制处理 Call uvic 四则运算 Call szys 输入回车换行符 Call crlf 输出结果 Call xujg 保存结果 Call bcjg 显示提示信息mess3 结束 图2.6

- 11 -

攀枝花学院学生课程设计(论文) 2 算法设计

2.2.3减乘除四则运算的程序段

B_P EQU BYTE PTR W_P EQU WORD PTR D_P EQU DWORD PTR CODE SEGMENT

ASSUME CS:CODE,DS:CODE ORG 100H ;主程序开始 NEWSTAR: JMP STAR EVEN NUM1 DW 0,0 NUM2 DW 0,0 NUM3 DW 0,0 JGV4 DW 0,0 YSF LABEL WORD YSF1 DB 0 YSF2 DB 0 JUV DB 0 UV DB 0

;使DS:SI指向第一有效字符 OVERS LABEL NEAR CLD PUSH AX OVERS1: LODSB CMP AL,' ' JZ OVERS1 CMP AL,9 JZ OVERS1 DEC SI CMP AL,13 POP AX

- 12 -

攀枝花学院学生课程设计(论文) 2 算法设计

RET ;输出一个制表符 TAB LABEL NEAR MOV AL,9 JMP SHORT DISP ;输出一个回车换行符 CRLF LABEL NEAR MOV AL,13 CALL DISP MOV AL,10 ;显示一个字符 DISP LABEL NEAR PUSH AX PUSH DX MOV AH,2 MOV DL,AL INT 21H POP DX POP AX RET ;检查是否为运算符 ISYSF LABEL NEAR CLD LODSB CALL ISJJ JZ ISYSF1 CALL ISII JZ ISYSF1 DEC SI ISYSF1: RET ;检查是否是加减运算 ISJJ LABEL NEAR CMP AL,'+'

- 13 -

攀枝花学院学生课程设计(论文) 2 算法设计

JZ ISYSF1 CMP AL,'-' RET ;检查是否为乘除运算 ISII LABEL NEAR CMP AL,'*' JZ ISYSF1 CMP AL,'/' JZ ISYSF1 CMP AL,'\\' RET ;数据输出 ;CX=10 十进制 ;CX=16 十六进制 DOUT LABEL NEAR PUSH AX PUSH BX PUSH DX PUSH BP XOR BP,BP DOUT1: INC BP PUSH AX MOV AX,DX XOR DX,DX DIV CX MOV BX,AX POP AX DIV CX PUSH DX MOV DX,BX OR BX,AX JNZ DOUT1 DOUT2:

- 14 -

攀枝花学院学生课程设计(论文) 2 算法设计

POP AX ADD AL,'0' CMP AL,'9' JBE DOUT3 ADD AL,'A'-'9'-1 DOUT3:

CALL DISP DEC BP JNZ DOUT2 POP BP POP DX POP BX POP AX RET

;输入数据在DX:AX中返回 ;CX=0 数据为10进制 ;CX#0 数据为16进制 DATE LABEL NEAR PUSH BX PUSH BP PUSH DI XOR AX,AX XOR DX,DX DATE1:

MOV DI,AX LODSB CMP AL,'0' JB DATE7 CMP AL,'9' JA DATE6 DATE2:

AND AX,0FH SHL DI,1 RCL DX,1

- 15 -

攀枝花学院学生课程设计(论文) 2 算法设计

MOV BX,DI MOV BP,DX SHL DI,1 RCL DX,1 SHL DI,1 RCL DX,1 JCXZ DATE3 SHL DI,1 RCL DX,1 Jmp short DATE4 DATE3:

ADD DI,BX ADC DX,BP DATE4:

ADD AX,DI ADC DX,0 JMP DATE1 DATE5:

ADD AL,9 JMP DATE2 DATE6:

JCXZ DATE7 CMP AL,'A' JB DATE7 CMP AL,'F' JBE DATE5 CMP AL,'a' JB DATE7 CMP AL,'f' JBE DATE5 DATE7:

MOV AX,DI DEC SI OR DI,DX

- 16 -

攀枝花学院学生课程设计(论文) 2 算法设计

POP DI POP BP POP BX RET

;数据1与数据2根据YSF1进行加减运算 JSJJ LABEL NEAR MOV AX,NUM2 MOV DX,NUM2+2 CMP YSF1,'+' JZ JSJJ1 SUB NUM1,AX SBB NUM1+2,DX JMP SHORT JSJJ2 JSJJ1:

ADD NUM1,AX ADC NUM1+2,DX JSJJ2: RET

;数据1与数据2根据YSF1进行乘除运算 JSII1 LABEL NEAR

MOV BX,OFFSET NUM1 JMP SHORT JSII2_1

;数据2与数据3根据YSF2进行乘除运算 JSII2 LABEL NEAR

MOV BX,OFFSET NUM2 JSII2_1: DB 66H MOV AX,[BX] DB 66H MOV CX,[BX+4] CMP YSF2,'*' JNZ JSII2_2 DB 66H IMUL CX

- 17 -

攀枝花学院学生课程设计(论文) 2 算法设计

JMP SHORT JSII2_3 JSII2_2: DB 66H CWD DB 66H IDIV CX CMP YSF2,'/' JZ JSII2_3 DB 66H XCHG DX,AX JSII2_3: DB 66H MOV [BX],AX RET ;显示结果

XUJG LABEL NEAR MOV AX,JGV4 MOV DX,JGV4+2 MOV CX,10 CMP UV,10 JZ XUJG0 MOV CX,16 XUJG0:

TEST DX,8000H JZ XUJG1 CMP UV,10 JZ XUJG2 CALL DOUT XUJG2:

NOT AX NOT DX ADD AX,1 ADC DX,0 PUSH AX

- 18 -

攀枝花学院学生课程设计(论文) 2 算法设计

CMP UV,10 JZ XUJG3 MOV AL,' ' CALL DISP MOV AL,'(' CALL DISP XUJG3:

MOV AL,'-' CALL DISP POP AX CMP UV,10 JZ XUJG1 CALL DOUT MOV AL,')' CALL DISP RET XUJG1:

CALL DOUT RET

;计算结果放入DX:AX中 JSJG LABEL NEAR CALL JSJJ MOV AX,NUM1 MOV DX,NUM1+2 RET

;从DS:SI处取一个数据 LOADATE LABEL NEAR LODSB CMP AL,'(' JZ LOADATE1 DEC SI PUSH CX XOR CX,CX CMP UV,10

- 19 -

攀枝花学院学生课程设计(论文) 2 算法设计

JZ LOADATE0 INC CX ;取16进制数 LOADATE0:

CALL DATE ;取数据放入DX:AX中 POP CX RET LOADATE1:

PUSH NUM1 ;保存数据1数据2及运算符 PUSH NUM1+2 PUSH NUM2 PUSH NUM2+2 PUSH YSF INC JUV

MOV JGV4,0 ;结果值清零

MOV JGV4+2,0 ;进行四则运算

SZYS LABEL NEAR CALL ISYSF ;首字符是运算符? JZ SZYS2

CALL LOADATE ;不是,取数并保存 MOV NUM1,AX MOV NUM1+2,DX SZYS1:

XOR AX,AX ;数据2清零

MOV NUM2,AX MOV NUM2+2,AX CALL ISYSF

- 20 -

攀枝花学院学生课程设计(论文) 2 算法设计

;下个是运算符? JZ SZYS3 JNZ SZYS6 SZYS2:

PUSH AX

MOV AX,JGV4 ;将结果作为数据1 MOV NUM1,AX MOV AX,JGV4+2 MOV NUM1+2,AX POP AX SZYS3:

MOV YSF1,AL MOV YSF2,AL CALL ISJJ ;是加减运算转 JZ SZYS4

CALL LOADATE ;取数据2

MOV NUM2,AX MOV NUM2+2,DX CALL JSII1

;数据1与数据2根据YSF1进行乘除运算 JMP SZYS1 ; 结果保存在数据1中 SZYS4:

CALL LOADATE ;取数据2并保存 MOV NUM2,AX MOV NUM2+2,DX SZYS4_1:

CALL ISYSF JNZ SZYS6 CALL ISJJ

- 21 -

攀枝花学院学生课程设计(论文) 2 算法设计

;运算符2是加减运算? JNZ SZYS5 ;不是转

PUSH AX CALL JSJJ

;数据1与数据2根据YSF1进行加减运算 POP AX ; 结果保存在数据1中 MOV YSF1,AL ;保存新的运算符 JMP SZYS4 SZYS5:

MOV YSF2,AL ;保存运算符2

CALL LOADATE ;取数据3

MOV NUM3,AX MOV NUM3+2,DX CALL JSII2

;数据2与数据3根据YSF2进行乘除运算 JMP SZYS4_1 ;结果保存在数据2中 SZYS6:

MOV CL,AL CMP AL,13 JNZ SZYS9 SZYS7:

CALL JSJG CMP JUV,0 JZ SZYS8 DEC JUV POP YSF POP NUM2+2 POP NUM2

- 22 -

攀枝花学院学生课程设计(论文) 2 算法设计

POP NUM1+2 POP NUM1 RET SZYS8:

CMP CL,')' JZ SZYS10 MOV JGV4,AX MOV JGV4+2,DX JNZ SZYS12 SZYS9:

CMP AL,')' JNZ SZYS11 INC SI JMP SZYS7 SZYS10:

MOV NUM1,AX MOV NUM1+2,DX JMP SZYS1 SZYS11: STC RET SZYS12: CLC RET ;数制处理

UVIL LABEL NEAR PUSH SI UVIL1:

LODSB CMP AL,' ' JZ UVIL2 CMP AL,9 JZ UVIL2 CMP AL,13

- 23 -

攀枝花学院学生课程设计(论文) 2 算法设计

JZ UVIL4 JNZ UVIL1 UVIL2:

MOV BX,SI CALL OVERS JZ UVIL3 LODSW CALL OVERS POP SI JNZ SZYS11 CMP AX,'01' JNZ SZYS11 PUSH SI MOV UV,10 UVIL3:

MOV AL,13 MOV [BX-1],AL UVIL4: POP SI CLC RET ;预置结果

YVJG LABEL NEAR MOV AH,52H INT 21H

MOV AX,ES:[BX-2] MOV DS,AX MOV AX,DS:[0CH] MOV CS:JGV4,AX MOV AX,DS:[0EH] MOV CS:JGV4+2,AX PUSH CS POP DS PUSH CS

- 24 -

攀枝花学院学生课程设计(论文) 2 算法设计

POP ES RET ;保存结果

BCJG LABEL NEAR MOV AH,52H INT 21H

MOV AX,ES:[BX-2] MOV DS,AX MOV AX,CS:JGV4 MOV DS:[0CH],AX MOV AX,CS:JGV4+2 MOV DS:[0EH],AX PUSH CS POP DS PUSH CS POP ES RET STAR:

MOV SI,81H CLD

CALL OVERS JNZ STAR1 STAR0:

MOV DX,OFFSET MESS1 JMP STAR4 STAR1:

CALL YVJG CALL UVIL JB STAR0 MOV SAVESP,SP CALL SZYS MOV SP,SAVESP MOV DX,OFFSET MESS2 JB STAR4

- 25 -

攀枝花学院学生课程设计(论文) 2 算法设计

CALL CRLF CALL XUJG CALL BCJG

MOV DX,OFFSET MESS3 STAR4:

MOV AH,9 INT 21H INT 20H SAVESP DW 0

MESS1 DB 13,10,' Syntax:',13,10

DB ' JS [10]',13,10,'$' MESS2 DB 'Error in expression !$' MESS3 DB 13,10,'$' CODE ENDS END NEWSTAR

2.1.4调试与运行

步骤:

建立“js.asm”的文件,其内容即为四则运算的程序段,然后通过运行“cmd”,用“masm”程序汇编源文件,形成目标文件。看程序段是否存在错误。(调试后,发现不存在错误)

图2.7

- 26 -

攀枝花学院学生课程设计(论文) 2 算法设计

然后在用“link”程序将目标文件形成可执行程序

图2.8

最后运行可执行程序“JS.exe”, 运行程序后,输入 JS 5*6,显示结果为30。

图2.9

- 27 -

攀枝花学院学生课程设计(论文) 3 结论

3 结论

汇编的学习不仅仅是学习其语法,而更多的是学习计算机基本的体系结构。其中遇到很多新的概念,名字。如寄存器、中断、寻址方式等。这些概念在刚接触汇编这门课的时候难以理解,但在之后的学习中通过老师的讲解,自己亲手编程的方式也就渐渐清晰明了。代码比较贴近高级语言的语法习惯,容易上手,但是硬指令也一定要熟练掌握,因为这是基础中的基础调试中注意设置断点,注意各个寄存器和标志的变化,要耐心,才能找到错误。

- 28 -

攀枝花学院学生课程设计(论文) 参考文献

参考文献

[1]《汇编语言程序设计》,吴向军等,高等教育出版社,2002

[2]《IBM-PC汇编语言及程序设计》(第2版), 沈美明等,清华大学出版社,2001 [3]《IBM-PC汇编语言及程序设计实验教程》,沈美明等,清华大学出版社 ,2001 [4]《汇编语言程序设计》, 钱晓捷等,电子工业出版社,2000 [5]《汇编语言程序设计》, 张志明等,重庆大学出版社,1997

- 29 -

攀枝花学院学生课程设计(论文) 参考文献

参考文献

[1]《汇编语言程序设计》,吴向军等,高等教育出版社,2002

[2]《IBM-PC汇编语言及程序设计》(第2版), 沈美明等,清华大学出版社,2001 [3]《IBM-PC汇编语言及程序设计实验教程》,沈美明等,清华大学出版社 ,2001 [4]《汇编语言程序设计》, 钱晓捷等,电子工业出版社,2000 [5]《汇编语言程序设计》, 张志明等,重庆大学出版社,1997

- 29 -

本文来源:https://www.bwwdw.com/article/3e2o.html

Top