汇编语言实验报告——累加
- 格式:doc
- 大小:44.25 KB
- 文档页数:5
累加器程序设计实验报告1.设计思想(附流程图)尽量实现模块化流程。
2.代码DATAS SEGMENTdata1 db 'INPUT N:','$'data2 db 6 dup('9')data3 db 7 dup('$')data4 db 0dh,'sum=','$';此处输入数据段代码data5 db 0dh,'wrong number','$'DATAS ENDSSTACKS SEGMENT;此处输入堆栈段代码STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKSSTART:MOV AX,DATASMOV DS,AX;显示,输入数字串lea dx,data1mov ah,9hint 21hlea dx,data2mov ah,0ahint 21h;检测输入字串的合法性,并可以给出错误提示mov bx,dxmov cl,[bx+1]cmp cl,3hja end1;将数字串转化成对应数字mov ch,0mov si,0push siadd bx,2mov bp,0ahg1: pop axmov dx,0mul bpmov dx,axmov ah,0mov al,ds:[bx+si]sub al,30hadd ax,dxpush axinc siloop g1;实现累加cmp ax,15fhja end1pop dxmov cx,axmov ax,0push axg2: pop dxinc dxadd ax,dxpush dxloop g2;处理结果,转换成十进制编码下的字符串pop dxmov dx,0mov cx,0mov bx,0ahpush axg3: cmp ax,0ahjb t1div bxjmp t2t1: mov dx,axmov ax,0t2: add dl,30hpush dxmov dx,0inc cxcmp ax,0jnz g3;换行+提示显示得到的字符串mov si,0lea bx,data3g4: pop axmov [bx+si],alinc siloop g4lea dx,data4mov ah,9hint 21hlea dx,data3mov ah,9hint 21hjmp end2;此处输入代码段代码end1:lea dx,data5mov ah,9hint 21hend2:MOV AH,4CHINT 21HCODES ENDSEND START3.测试过程与结果4.有关设计编写调试体会本次实验的目的在于通过编辑累加器程序来熟悉汇编语言中对循环结构的使用,其中包括循环输入字符并判断合法性、累加计算、循环输出计算结果、其中的关键点在于通过堆栈来存放数据,并在多次存放后依次提出数据。
汇编语言实验报告1~7实验一:数据传输指令、算术指令、逻辑指令的使用实验内容:利用汇编语言,编写一个程序,实现两个整数相加,并将结果存入第三个变量中实验步骤:1. 声明三个变量a、b、c2. 将10存入a,将20存入b3. 将a的值传入al,将b的值传入bl4. 使用add指令将al和bl相加,将结果存入al5. 将al的值传入c6. 显示c的值实验结果:a db 10mov al,aadd al,blint 21hmov ax,4c00h实验二:分支指令的使用实验内容:利用汇编语言,编写一个程序,实现当输入的值为正数时,输出"I'm positive!";当输入的值为负数时,输出"I'm negative!";当输入的值为零时,输出"I'm zero!"1. 定义一个变量num2. 接收用户输入,并将其存储在num中3. 用test指令判断num的值4. 当num=0时,执行输出"I'm zero!"的指令7. 退出程序num db ?lea dx, promptsub al, '0'test num, numjz zerojs negjmp positiveneg:output:zero_msg db 'I am zero!$'prompt db 'Please enter a number:', 0dh, 0ah, '$'1. 定义变量i、sum,分别表示累加的数字和累加和2. 将i赋初值1,sum赋初值03. 进入循环5. 使用inc指令将i加16. 使用cmp指令将i与10比较,如果i小于等于10,继续循环,否则退出循环7. 输出结果mov bx, iloopStart:inc bx实验四:过程调用的使用2. 循环遍历1到100之间的每个数3. 用一个for语句嵌套一个for语句判断该数是否为质数4. 用两个自定义的子程序is_prime和output输出结果call is_primeskip:cmp i, 100prime_loop:div blretje newlinejmp done实验目的:掌握字符串操作指令的使用实验内容:利用汇编语言,编写一个程序,将字符串"SJTU"改为字符串"MIT"1. 定义字符串SJTU和MIT2. 定义两个变量i和len,分别表示字符串的下标和长度3. 使用movsb将SJTU的值传到MIT中4. 输出MITSJTU db 'SJTU'lea si, SJTUstringLoop:实验内容:利用汇编语言,编写一个程序,实现将输入的字符串写入一个文件中,然后再读取该文件中的字符串并输出2. 打开文件3. 将字符串写入文件中4. 关闭文件6. 读取文件内容8. 输出读取的字符串fileName db 'test.txt'content db 32 dup(?)mov cx, word ptr [content]实验内容:利用汇编语言,编写一个程序,在系统按下Ctrl+C时,输出一条信息并退出1. 声明函数handleCtrlC2. 获取中断21的地址,将其存储到文件头中org 100hmov [old_int_21h], es:bxmov dx, offset handleCtrlCend开始:。
一、实验目的(1) 加深对循环结构的理解;(2) 掌握循环程序的设计方法;(3) 熟练掌握DEBUG的常用命令,学会用DEBUG调试程序。
二、实验内容1.已知以BUF为首地址的字存储区中存放着8个有符号二进制数,是编写程序将其中大于等于0的数依次送BUF1为首地址的字存储区中,小于0的数依次送以BUF2为首地址的字存储区中。
同时将大于等于0的数的个数送A字变量,将小于0数的个数送B字变量。
2.设STR字符串是以0结尾。
试编写一个把字符串中的所有大写字母改为小写字母的程序并将转换后的字符串显示输出。
3.试编程从自然数1开始累加,直到累加和大于5050为止,统计被累加的自然数的个数,并把统计的个数送入COUNT单元,累加和送入TOTAL单元。
三、算法描述流程图实验内容1、2、3的流程图分别为图1、图2、图3。
图1 图2 图3四、实验步骤1.已知以BUF为首地址的字存储区中存放着8个有符号二进制数,是编写程序将其中大于等于0的数依次送BUF1为首地址的字存储区中,小于0的数依次送以BUF2为首地址的字存储区中。
同时将大于等于0的数的个数送A字变量,将小于0数的个数送B字变量。
1)输入源程序:DATA SEGMENTBUF DW 23,123,-12,-210,45,0,90,-453BUF1 DW 8 DUP(0)BUF2 DW 8 DUP(0)A DW ?B DW ?DATA ENDSCODE SEGMENTASSUME CS: CODE, DS: DATASTART: MOV AX, DATAMOV DS, AXLEA BX, BUFLEA SI, BUF1LEA DI, BUF2MOV A,0MOV B,0MOV CX,8L0: MOV AX,[BX]CMP AX,0JGE L1MOV [DI],AXADD DI,2INC BJMP NEXTL1: MOV [SI],AXADD SI,2INC ANEXT: ADD BX,2LOOP L0MOV AH, 4CHINT 21HCODE ENDSEND START2)运行程序。
课内实践课报告
课程名称汇编语言程序设计
专业计算机科学与技术
班级2班
学号08030208
姓名陈思娜
指导教师杨丽华
成绩
2009年11月11日
一、实验目的:
通过应用汇编语言在D O S环境下的E D I T掌握
算术运算指令。
二、实验原理:通过8088指令系统编写汇编程序完成相
关任务
三、实验操作过程:
十个数相加!
DATA SEGMENT
DAT1 DB 11H,22H,33H,44H,55H,66H,77H,88H,99H,0AAH
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV CL,09H
MOV DI,OFFSET DAT1
MOV AL,[DI]
AGAIN: INC DI
ADD AL,[DI]
LOOP AGAIN
CODE ENDS
END START
四、实验结果分析:
编写:
编译通过,无语法错误
编译后联编
分步看:
五、实验心得:
通过做这些题目,发现自己还有好多需要学习的,在以后的学习中,我会更加深入的研究。
找到并提出更多的问题,并且加以解决。
更好的学习汇编语言。
指导教师签字:
09年 11 月 11 日。
《汇编语言》实验报告实验名称:汇编语言实验报告实验目的:通过实验了解汇编语言的基本概念、语法结构和程序设计方法,掌握汇编语言的编写方法。
实验时间:2024年1月1日实验地点:实验室一、实验背景汇编语言是计算机硬件和软件之间的桥梁,通过汇编语言可以直接操作计算机的底层硬件。
汇编语言是一种低级语言,使用汇编语言可以实现对计算机内存、寄存器等硬件资源的直接操作,从而实现程序的功能。
本实验通过编写汇编语言程序,加深对汇编语言的理解。
二、实验过程1. 确定实验环境:使用DOSBox模拟DOS环境进行汇编程序编写和调试。
2. 编写第一个汇编程序:编写一个简单的汇编程序,将字符串“Hello, World!”输出到屏幕上。
3.程序分析:a.定义要输出的字符串,将字符串存储在数据段中。
b.设置段寄存器,将数据段地址加载到DS寄存器中。
c.设置显示模式和光标位置。
d.将字符串逐个字符输出到屏幕上。
e.关闭显示模式。
4. 编译运行:使用汇编语言的编译器将汇编程序转换成机器码,并在DOSBox中运行程序。
5.调试程序:根据程序运行结果和分析,调试程序中存在的错误,并进行改正。
三、实验结果与分析经过多次编写和调试,我们成功实现了将字符串“Hello, World!”输出到屏幕上的功能。
通过程序分析和调试过程,加深了对汇编语言的理解和掌握。
四、实验总结通过本次实验,我们深入了解了汇编语言的基本概念、语法结构和程序设计方法。
通过实际编写汇编语言程序,对汇编语言的编写方法有了更加深入的认识。
同时,通过调试程序的过程,我们也提高了自身的问题解决能力和分析能力。
在今后的学习和工作中,我们将继续学习和深入研究汇编语言,提高自己的编程能力和创新思维能力。
总体而言,本次实验给我们带来了很大的收获,我们以后将更加努力地学习汇编语言,提高自己的编程水平,为以后的学习和工作做好充分的准备。
累加器实验报告心得引言累加器是计算机领域常用的一种数据结构,用于累加计算。
在本次实验中,我们通过设计和实现一个累加器,进一步理解了累加器的原理和基本用法。
在实验过程中,我们遇到了一些问题并加以解决,掌握了一些调试技巧。
同时,通过编程实践,我们也深入了解了累加器在计算机科学中的应用。
实验目的本次实验的主要目的是掌握累加器的基本原理,并通过编程实现一个累加器。
具体而言,我们需要实现一个简单的累加器,能够将给定数量的整数相加并输出累加结果。
理论与设计累加器的基本原理非常简单,即不断将新的值与原有值相加,然后更新为新的累加结果。
在本次实验中,我们采用了一种基于循环的设计方法。
具体而言,我们使用一个循环来不断读入新的整数,然后将其与累加结果相加,并将结果更新为新的累加结果。
直到读入的整数数量达到给定数量为止,循环结束,输出最终累加结果。
实验过程在设计和实现累加器的过程中,我们遇到了一些问题,并通过不断调试和修改最终得到了正确的结果。
首先,我们注意到累加结果的数据类型应当与输入整数的数据类型相同。
因此,我们选择使用整型作为累加器的数据类型。
接下来,我们根据实验要求,实现了一个简单的循环结构,用于读入给定数量的整数。
在循环中,我们使用一个变量存储累加结果,并在每次循环中将读入的整数与累加结果相加,并将结果更新为新的累加结果。
最后,在循环结束后,我们输出最终的累加结果。
在进行初始测试时,我们发现累加器没有正确计算出累加结果。
经过仔细检查后发现,我们没有正确初始化累加结果的值。
因此,我们在循环开始之前,给累加结果赋予一个初始值,确保计算正确进行。
随后,我们再次进行了测试,发现累加器能够正确计算累加结果。
另外,在实验过程中,我们也注意到了一些累加器的应用场景。
累加器常用于计算某个指标累积值的情况,比如经济增长、能源消耗等。
累加器可以方便地累计各个数据点的值,并计算总和。
这种累加的结果对于分析趋势和预测未来变化非常有用。
《汇编语言》实验报告——累加器制作2014级计算机科学与工程学院学号:姓名一、实验要求:1.显示 INPUT N:,提示用户输入数字字串2.检测输入字串的合法性,非法给出提示3.将输入数字字串转化为数值,存入变量n4.累加1~n,存入变量sum5.以十进制显示sum二、流程图:三、源代码:DATAS SEGMENTstr1 db "Input N:","$"str2 db "sum=","$"str3 db 0ah,"error","$"n dw 0sum dw 0DATAS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS START:MOV AX,DATASMOV DS,AXLEA dx,str1;输出提示符mov ah,9int 21hinput:mov ah,01;输入数字int 21hcmp al,0dh;判断是否为回车jz step1cmp al,"0";判断字符合法性jb errorcmp al,"9"ja errorsub al,"0";转化为ASCII码mov ah,0;此段将高位乘10push axmov ax,nshl ax,1push axmov cl,2shl ax,clpop bxadd ax,bxmov bx,0;高位与低位相加pop bxadd ax,bxmov n,axxor cx,cx;设定累加次数mov cx,njmp inputstep1:mov ax,cxsub cx,1step2:add ax,cx;求累加和loop step2mov sum,axlea dx,str2mov ah,9int 21hmov cx,0mov ax,sumstep3:mov dx,0mov bx,10;将结果除以10并把余数压进栈div bxpush dxinc cxcmp ax,0hjnz step3step4:xor ax,axpop ax ;栈内依次输出mov dx,axadd dx,30hint 21hloop step4jmp lasterror:lea dx,str3;输出错误提示语mov ah,9int 21hlast:MOV AH,4CHINT 21HCODES ENDSEND START四、实验测试截图五、实验心得:本次试验的目的在于通过编辑累加器程序来熟悉汇编语言中对循环结构的使用,其中包括循环输入字符并判断合法性、累加计算、循环输出计算结果。
微机原理与汇编语言实验报告姓名x x x学号xxxxxx 专业班级计科x班课程名称微机原理与汇编语言实验日期2014.10.22实验名称循环程序设计实验成绩一、实验目的1、掌握循环程序的设计方法。
2、掌握比较指令、转移指令和循环指令的使用方法。
3、进一步掌握调试工具的使用方法。
二、实验内容1、实验原理(1)键盘输入的十进制数如368在计算机中是以33H,36H,38H形式存放的,如何将它们转换为一个二进制数101110000B,以便对累加循环的循环次数进行控制是本程序首先要解决的问题(2)累加结果为一个16位的二进制数,为了显示结果,必需把它们转换为十进制数2、实验步骤(1)流程图(2)实验源码.model small.stack ;定义堆栈段.data ;定义数据段inf1 db "Please input a number(1-627):$"inf2 db 0ah, 0dh, "1+2+......+$"ibuf db 7, 0, 6 dup(0)obuf db 6 dup(0).codestart: mov ax, @datamov ds, axmov dx, offset inf1;将屏幕输入的十进制数(存放于ibuf)转化为二进制数存储于ax 中mov ah, 09hint 21hmov dx, offset ibufmov ah, 0Ahint 21hmov cl, ibuf+1mov ch, 0mov si, offset ibuf+2mov ax, 0loop1: mov dx, 10mul dxand byte ptr [si], 0Fhadd al, [si] 从键盘输入一个十进制数,并将其转换为二进制数,存放在AX中开始结束素、、(CX)-1=0累加循环次数送CX(MOV CX,AX)AX清0(AX中存放累加和)BX送1(BX存放每次循环累加的数,每循环一次,BX值加1)ADD AX,BXINC BX累加和(在AX中)转换为十进制数并显示YNadc ah, 0inc siloop loop1mov cx, ax ;计算1+2+3+...+nmov ax, 0mov bx, 1loop2: add ax, bxinc bxloop loop2mov di, offset obuf+6 ;将ax中的二进制数转换为十进制数并以ascii的形式存于obufmov byte ptr [di], '$'mov bx, 10loop3: mov dx, 0div bxadd dl, 30hdec dimov [di], dlor ax, axjnz loop3dec dimov [di], '='mov dx, offset inf2 ;结果输出mov ah, 09hint 21hmov cl, ibuf+1 ;显示nmov ch, 0mov si, offset ibuf+2loop4: mov dl, [si]add dl, 30hinc simov ah, 02hint 21hloop loop4mov dx, dimov ah, 09hint 21hmov ax, 4c00hint 21hend start实验习题1源码:; multi-segment executable file template..model small ;定义程序的存储模式(small表示小型模式).stack ;定义堆栈段.data ;定义数据段inf1 db 0ah, 0dh, "1+2+......+$"obuf1 db 6 dup(0)obuf2 db 7 dup(0) ;除了六位数字外还要有一个=号.codestart: mov ax, @datamov ds, axmov dx, offset inf1 ;输出 1+2+......+mov ah, 09hint 21hmov ax, 0 ;计算1+2+3+...+nmov bx, 1loop1: add ax, bxinc bxcmp ax, 60000jbe loop1push ax ;将最终结果备份入栈push bx ;将n备份pop cxmov di, offset obuf1+5;将cx二进制数转换为十进制数并以ascii的形式存于obuf1mov byte ptr [di], '$'mov ax, cxmov bx, 10loop2: mov dx, 0div bxadd dl, 30hdec dimov [di], dlor ax, axjnz loop2mov dx, di ;输出nmov ah, 09hint 21hpop axmov di, offset obuf2+6;将ax中的二进制数转换为十进制数并以ascii的形式存于obuf2mov byte ptr [di], '$'mov bx, 10loop3: mov dx, 0div bxadd dl, 30hdec dimov [di], dlor ax, axjnz loop3dec dimov [di], '='mov dx, di ;=输出结果mov ah, 09hint 21hmov ax, 4c00hint 21hend start实验习题2源码:; multi-segment executable file template..model small ;定义程序的存储模式(small表示小型模式).stack ;定义堆栈段.data ;定义数据段inf1 db 'Please input six num:', 0ah, 0dh, '$'inf2 db 'sum:$'obuf0 db 0ah, 0dh, '$'ibuf db 5, 0, 4 dup(0)obuf db 6 dup(0).codestart: mov ax, @datamov ds, axmov dx, offset inf1 ;输出提示信息mov ah, 09hint 21hmov bx, 6 ;设置外层循环次数loop1: mov dx, offset ibufmov ah, 0Ahint 21hmov cl, ibuf+1 ;设置内层循环次数mov ch, 0mov si, offset ibuf+2mov ax, 0loop2: mov dx, 10 ;将屏幕输入的十进制数(存放于ibuf)转化为二进制数存储于ax中 mul dxand byte ptr[si], 0Fhadd al, [si]adc ah, 0inc siloop loop2push ax ;将结果入栈保存mov dx, offset obuf0 ;回车换行mov ah, 09hint 21hdec bxcmp bx, 0jnz loop1mov cx, 6mov ax, 0loop3: pop bxadd ax, bxloop loop3mov di, offset obuf+5;将ax中的二进制数转换为十进制数并以ascii的形式存于obuf mov byte ptr [di], '$'mov bx, 10loop4: mov dx, 0div bxadd dl, 30hdec dimov [di], dlor ax, axjnz loop4mov dx, offset inf2 ;输出提示信息mov ah, 09hint 21hmov dx, dimov ah, 09hint 21hmov ax, 4c00hint 21hend start实验习题3源码:; multi-segment executable file template..model small ;定义程序的存储模式(small表示小型模式) .stack ;定义堆栈段.data ;定义数据段inf db "Please input a num(0-65535):$"inf2 db 0ah, 0dh, "The num of 1:$"ibuf db 6, 0, 5 dup(0)obuf db 6 dup(0).codestart: mov ax, @datamov ds, axmov es, axmov ah, 09h ;输出提示信息Please input a num:mov dx, offset infint 21hmov ah, 0Ah ;接收一个无符号十进制整数(小于65536)mov dx, offset ibufint 21hmov ax, 0mov cl, ibuf+1;将屏幕输入的十进制数(存放于ibuf)转化为二进制数存储于ax中mov ch, 0mov si, offset ibuf+2loop1: mov dx, 10mul dxand byte ptr[si], 0Fhadd al, [si]adc ah, 0inc siloop loop1mov bx, 0loop2: shr ax, 1adc bx, 0cmp ax, 0jnz loop2mov ax, bxmov di, offset obuf+5;将ax中的二进制数转换为十进制数并以ascii的形式存于obufmov byte ptr [di], '$'mov bx, 10loop3: mov dx, 0div bxadd dl, 30hdec dimov [di], dlor ax, axjnz loop3mov ah, 09h ;输出提示信息The num of 1:mov dx, offset inf2int 21hmov ah, 09h ;将统计结果在屏幕上显示出来mov dx, diint 21hmov ax, 4c00hint 21hend start实验习题4源码:; multi-segment executable file template..model small ;定义程序的存储模式(small表示小型模式).stack ;定义堆栈段.data ;定义数据段N equ 5ibuf db 4, 0, 3 dup(0)inf1 db 'Please input N num(0-255):', 0ah, 0dh, '$'inf2 db 'Sort:', 0ah, 0dh, '$'buf db N dup(0)obuf2 db 4 dup(0)obuf db 0ah, 0dh, '$'.codestart: mov ax, @datamov ds, axmov dx, offset inf1 ;输出提示信息mov ah, 09hint 21hmov di, offset bufmov bx, N ;设置外层循环次数loop1: mov dx, offset ibufmov ah, 0Ahint 21hmov cl, ibuf+1 ;设置内层循环次数mov ch, 0mov si, offset ibuf+2mov ax, 0loop2: mov dx, 10 ;将屏幕输入的十进制数(存放于ibuf)转化为二进制数存储于ax中 mul dxand byte ptr[si], 0Fhadd al, [si]inc siloop loop2mov [di], alinc dimov dx, offset obuf ;回车换行mov ah, 09hint 21hdec bxcmp bx, 0jnz loop1mov bx, N-1 ;比较大小mov cx, bxmov dx, bxmov di, offset bufloop3: mov si, dimov al, [di]inc siloop4: cmp [si], aljbe loop5mov al, [si]mov ah, [di]mov [si], ahmov [di], alloop5: inc siloop loop4dec dxmov cx, dxinc didec bxcmp bx, 0jne loop3mov dx, offset inf2 ;输出提示信息mov ah, 09hint 21h;结果输出mov cx, Nmov si, offset bufloop6: mov di, offset obuf2+3;将buf中的二进制数转换为十进制数并以ascii的形式存于obuf2,并输出 mov byte ptr [di], '$'mov bx, 10mov al, [si]mov ah, 0loop7: mov dx, 0div bxadd dl, 30hdec dimov [di], dlor ax, axjnz loop7mov dx, dimov ah, 09hint 21hmov dx, offset obufmov ah, 09hint 21hinc siloop loop6mov ax, 4c00hint 21hend start3、实验结果(1)实验结果(2)实验习题1程序流程图:(3)实验习题2(4)实验习题3(5)实验习题4三、实验总结1)通过本次实验我掌握循环程序的设计方法,掌握比较指令、转移指令和循环指令的使用方法,进一步掌握了调试工具的使用方法。
计算机汇编语言实验报告一、实验目的本实验旨在通过编写计算机汇编语言程序,加强对计算机组成原理和汇编语言的理解,同时熟悉实际编写和调试过程。
二、实验内容1.用汇编语言编写一个简单的计算器程序,实现加法和减法操作。
2.编译并运行程序,测试其功能的正确性。
3.运用调试工具进行程序的调试,检查代码的运行流程。
三、实验步骤1.确定程序功能和设计思路:本次实验的目标是编写一个计算器程序,能够对两个数进行加法和减法操作。
我们可以通过定义一些操作码来表示不同的操作,再通过输入不同的操作码来执行相应的操作。
2.编写汇编语言程序:首先,需要定义一些变量和常量来存储输入的数和操作码。
然后,使用汇编语言的运算指令和控制指令来实现加法和减法操作,并将结果存储到指定的变量中。
最后,使用输出指令来显示结果。
3.编译并运行程序:将汇编语言程序编译为机器码,并通过计算机的指令集执行程序。
4.调试程序:利用调试工具,逐步执行程序,检查代码的运行流程和结果的正确性。
如有错误,进行适当的修改和调试。
5.测试功能和性能:使用不同的数和操作码进行测试,验证程序的功能和正确性。
四、实验结果经过编写、编译和调试,我们成功实现了一个简单的计算器程序。
程序能够根据输入的操作码,对两个数进行加法和减法操作,并将结果显示出来。
经过多次测试,程序的功能、正确性和性能都符合预期要求。
五、实验感想通过本次实验,我们对计算机组成原理和汇编语言有了更深入的理解。
在编写程序的过程中,我们发现汇编语言相比高级语言更加底层,需要考虑更多的细节和机器指令的使用。
同时,我们也意识到了调试的重要性,调试工具能够帮助我们分析和修正代码的错误,提高程序的质量。
六、实验总结通过本次实验,我们对计算机汇编语言的应用有了更深入的了解。
我们掌握了汇编语言程序的基本结构和语法规则,学会了使用汇编语言指令进行计算和控制。
同时,我们也提升了调试和测试的能力,加深了对计算机组成原理和汇编语言的理解。
调试程序功能段一、实验目的1.继续学习使用DEBUG程序的各种命令。
2.利用DEBUG学习了解计算机取指令、执行指令的工作过程。
3.掌握8086/8088基本指令的使用方法和功能。
二、实验任务1.按照下列给定步骤完成求累加和程序:程序:MOV BX,1000MOV CX,10MOV AL,0LOP: ADD AL,[BX]INC BXJ: L OOP LOPINT3步骤:1)用A命令将程序键入到100H开始的内存中,在键入时记下标号LOP和J的实际地址,在键入LOOP指令时LOP用实际地址值代替。
2)用命令N AA将此程序命名为文件AA(文件名可任取)。
3)用R命令将BX:CX改为程序长度值(即最后一条指令后面的地址减去开始地址) ,用R命令把BX设为:0000H,CX 设为文件长度。
4)用命令W 100将此程序存到AA命名的磁盘文件中。
5)用命令Q退出DEBUG。
6)用命令DEBUG AA再次调入DEBUG和文件AA,可用U命令检查调入程序。
若调入DEBUG时忘了加AA文件名,可用N命令和L命令将文件调入。
7)8)用E命令在内存地址1000H处键入16个数字9)用命令G=100 J(J用实际地址代替),使程序运行并停在断点J上,检查AX,BX的值是否符合你的预计值。
10)用T命令运行一步,观察程序方向(IP值)和CX值是否与你的估计一样, 若不一样,检查程序是否有错。
11)重复G J与T,再检查AX是否正确。
(J为断点地址)12)用G命令使程序运行到结束,检查AX值是否正确。
2.用命令A汇编下列指令,判断指令正误并说明原因。
(1)LEA DI,[AX](2)MOV DS,2010(3)PUSH AL(4)OUT 900,AL(5)MOV [BX],03.利用T,P,G命令,执行下列指令段,注意它们的不同之处。
(6)MOV DI,300MOV SI,400MOV CX,3CLDREP MOVSBINT 3(7)MOV AH,2MOV DL,41INT 21INT 34.程序: MOV DI,1000MOV CX,8MOV SI,2000CLCLOP: MOV AL,[SI]ADC[DI],ALINC SIINC DILOOP LOPINT20步骤:1)用A命令键入此程序2)用E命令在1000H开始处键入一个8字节被加数,在2000H开始处键入一个8字节加数,均为低字节在前面。
汇编实验报告一、实验目的本次汇编实验的主要目的是深入理解计算机底层的工作原理,掌握汇编语言的基本语法和编程技巧,能够运用汇编语言编写简单的程序来实现特定的功能。
通过实践操作,提高对计算机体系结构的认识,培养解决实际问题的能力。
二、实验环境本次实验使用的操作系统为 Windows 10,汇编语言编译器为MASM 615。
三、实验内容(一)数据传送与算术运算1、编写程序实现将两个 16 位的整数相加,并将结果存储在指定的内存单元中。
2、实现数据在不同寄存器和内存单元之间的传送。
(二)逻辑运算与移位操作1、对给定的两个字节数据进行逻辑与、或、异或操作,并观察结果。
2、进行移位操作,包括左移和右移,理解移位对数据的影响。
(三)循环与分支结构1、利用循环结构计算 1 到 100 的整数之和。
2、根据给定的条件,使用分支结构实现不同的操作。
(四)子程序调用1、编写一个子程序,实现两个数的乘法运算。
2、在主程序中调用该子程序,并输出结果。
四、实验步骤(一)数据传送与算术运算1、打开 MASM 编译器,新建一个汇编源文件。
2、使用`MOV` 指令进行数据传送,将两个整数分别存储在寄存器`AX` 和`BX` 中。
3、使用`ADD` 指令将两个数相加,结果存储在`CX` 寄存器中。
4、最后,使用`MOV` 指令将结果存储到指定的内存单元。
(二)逻辑运算与移位操作1、在源文件中定义两个字节变量,并初始化其值。
2、使用逻辑运算指令(如`AND`、`OR`、`XOR`)对这两个变量进行操作。
3、使用移位指令(如`SHL`、`SHR`)对变量进行移位,并观察结果。
(三)循环与分支结构1、对于循环结构,使用`LOOP` 指令实现从 1 到 100 的累加。
2、在分支结构中,根据给定的条件(如比较两个数的大小),使用`JZ`、`JL` 等指令执行不同的分支操作。
(四)子程序调用1、定义一个子程序,使用参数传递的方式接收两个数,并进行乘法运算。
汇编语⾔实验报告汇编语⾔实验报告专业:班级:姓名:学号:2011年12⽉14⽇⽬录实验1 利⽤DEBUG调试汇编语⾔程序段 (3)实验2 初级程序的编写与调试实验(⼀) (11)实验3 初级程序的编写与调试实验(⼆) (20)实验4 汇编语⾔程序上机过程 (28)实验5 分⽀程序实验 (33)实验6 循环程序实验 (40)实验7 ⼦程序实验 (45)实验1 利⽤DEBUG调试汇编语⾔程序段⼀.实验⽬的1.熟悉DEBUG有关命令的使⽤⽅法;2.利⽤DEBUG掌握有关指令的功能;3.利⽤DEBUG运⾏简单的程序段。
⼆.实验内容1.进⼊和退出DEBUG程序;1)开始—运⾏,输⼊cmd,点确定进⼊命令窗⼝2)在命令窗⼝中输⼊dubug进⼊debug程序3)进⼊debug窗⼝后,输⼊q命令退出debug2.学会DEBUG中的1)D命令(显⽰内存数据D 段地址:偏移地址)例1:-D100 ;显⽰DS段, 0100开始的128个节内容说明: 指定要显⽰其内容的内存区域的起始和结束地址,或起始地址和长度。
① D SEGREG[起始地址] [L 长度];显⽰SEGREG段中(缺省内默认为DS), 以[起始地址] (缺省内为当前的偏移地址),开始的[L 长度] (缺省内默认为128)个字节的内容.② D SEGREG[段地址:偏移地址];显⽰SEGREG段中(缺省内默认为DS), [段地址:偏移地址] 开始的[L 长度] (缺省内默认为128)个字节内容-D ;默认段寄存器为DS,当前偏移地址(刚进⼊debug程序偏移地址为0100H)-D DS:100 ;显⽰DS段, 0100H开始的128个字节内容-D CS:200 ;显⽰CS段, 0200H开始的128个字节内容-D 200:100 ;显⽰DS段, 0200:0100H开始的128个字节内容-D 200 ;显⽰DS段, 0200H开始的128个字节内容-D 100 L 10 ;显⽰DS段, 100H开始的8H个字节内容2)E命令(修改指定内存)-E100 11 22 33 44 55 66 77 88-D 100结果:0AF1:0100 11 22 33 44 55 66 77 88例2:-E 100:E 地址数据表;从指定的地址开始⽤数据表给定的数据修改存储单元。
汇编语言编程实验报告实验目的:使用汇编语言编写程序,实现特定功能。
实验过程和结果:1. 程序设计在本次实验中,我们使用汇编语言编写程序,实现了一个简单的计算器功能。
以下是我们设计的程序伪代码:```data segment; 定义数据段operand1 db ?operand2 db ?operator db ?result db ?data endscode segmentassume cs:code, ds:datastart:; 程序入口mov ax, datamov ds, ax; 获取用户输入mov ah, 01hint 21hmov operator, almov ah, 01hint 21hmov operand1, almov ah, 01hint 21hmov operand2, al; 根据运算符进行计算 cmp operator, '+'je addcmp operator, '-'je subcmp operator, '*'je mulje div; 显示结果mov dl, resultadd dl, 30h ; 转换为ASCII码 mov ah, 02hint 21h; 程序结束mov ah, 4chint 21hadd:; 加法运算mov al, operand1add al, operand2mov result, aljmp displaysub:; 减法运算mov al, operand1mov result, aljmp displaymul:; 乘法运算mov al, operand1mul operand2mov result, aljmp displaydiv:; 除法运算mov al, operand1mov ah, 0 ; 清空余数 div operand2mov result, aljmp display display:; 显示计算结果mov dl, resultadd dl, 30h ; 转换为ASCII码mov ah, 02hint 21h; 程序结束mov ah, 4chint 21hcode endsend start```2. 实验结果运行程序后,我们通过键盘输入运算符和操作数,程序能够正确地进行相应的运算并显示结果。
两个汇编程序(求累加和):第一题:从键盘输入一个十进制数n,计算1+2+3+4+……+n=sum,并以此格式输出。
(结果超过65535时会溢出)代码:DA TA SEGMENTINF1 DB "Please Input a Number (0~65535):$"IBUF DB 7,0,6 DUP(?)OBUF DB 6 DUP(?)STRING DB "1+2+......+$"ZHONGZHI DB 6 DUP(?)GES DW ?SUM DW ?MD DW 0DA TA ENDSCODE SEGMENTASSUME CS:CODE,DS:DA TASTART:MOV AX,DATAMOV DS,AXMOV DX,OFFSET INF1 ;输出提示语句MOV AH,09HINT 21HMOV DX,OFFSET IBUF ;从键盘输入一个十进制数n(字符串)命令MOV AH,0AHINT 21HMOV CL,IBUF+1 ;将输入的串转换为数值存于AX中MOV CH,0MOV SI,OFFSET IBUF+2MOV AX,0AGAIN:MOV DX,10MUL DXAND BYTE PTR [SI],0FHADD AL,[SI]ADC AH,0INC SILOOP AGAINMOV GES,AX ;保存输入的n;计算过程:1+2+3+…..+nMOV CX,AXMOV MD,1LOOP1:ADD AX,MDINC MDLOOP LOOP1MOV SUM,AXSHUCHU:MOV DL,0AH ;换行输出MOV AH,2INT 21HMOV DL,0DHMOV AH,2INT 21HMOV DX,OFFSET STRING ;输出“1+2+......+ ”MOV AH,09HINT 21HMOV AX,GESMOV BX,OFFSET ZHONGZHI+5MOV BYTE PTR[BX],'$'MOV CX,10LOOP2:MOV DX,0DIV CXADD DL,30HDEC BXMOV [BX],DLOR AX,AXJNZ LOOP2MOV DX,BXMOV AH,09HINT 21H;输出“=”MOV DL,'='MOV AH,2INT 21HMOV AX,SUMMOV BX,OFFSET OBUF+5MOV BYTE PTR[BX],'$'MOV CX,10LOOP3:MOV DX,0DIV CXDEC BXMOV [BX],DLOR AX,AXJNZ LOOP3MOV DX,BXMOV AH,09HINT 21HFINISH:MOV AH,4CH ;结束INT 21HCODE ENDSEND START结果截屏:╬┤└┤╗π▒α ╓╨╬─╤º╧░░µ 1.00Please Input a Number (0~65535):1001+2+......+100=5050Press any key to continue . . .第二题:从1+2+3+……一直累加,当结果大于6000时结束,并输出结果:1+2+3+……+n=sum 代码:DA TA SEGMENTINF1 DB 0AH,0DH,"Please Input a Number (0~65535):$"STRING DB 0AH,0DH,"1+2+......+$"IBUF DB 7,0,6 DUP(?)GESHU DB 6 DUP(?)JIEGUO DB 6 DUP(?)SUM DW ?MD DW 0DA TA ENDSCODE SEGMENTASSUME CS:CODE,DS:DA TASTART:MOV AX,DATAMOV DS,AXMOV DX,OFFSET STRING ;换行输出“"MOV AH,09HINT 21HMOV AX,0 ;计算过程1+2+3+......直到结果大于60000 MOV MD,1LOOP1:ADD AX,MDINC MDCMP AX,60000JBE LOOP1MOV SUM,AXMOV AX,MD ;输出个数(加到多少为止)MOV BX,OFFSET GESHU+5MOV BYTE PTR[BX],'$'MOV CX,10LOOP2:MOV DX,0DIV CXADD DL,30HDEC BXMOV [BX],DLOR AX,AXJNZ LOOP2MOV DX,BXMOV AH,09HINT 21HMOV DL,'=' ;输出“=”MOV AH,2INT 21HMOV AX,SUM ;输出总和MOV BX,OFFSET JIEGUO+5MOV BYTE PTR[BX],'$'MOV CX,10LOOP3:MOV DX,0DIV CXADD DL,30HDEC BXMOV [BX],DLOR AX,AXJNZ LOOP3MOV DX,BXMOV AH,09HINT 21HFINISH:MOV AH,4CH ;结束INT 21HCODE ENDSEND START结果截屏:╬┤└┤╗π▒α ╓╨╬─╤º╧░░µ 1.001+2+......+347=60031Press any key to continue . . .。
汇编语言程序设计实验报告汇编语言程序设计实验报告引言:汇编语言是一种底层的计算机语言,通过直接操作计算机的硬件和寄存器来实现程序的功能。
在本次实验中,我们学习了汇编语言的基本语法和编程技巧,并通过实践编写了一些简单的程序。
本报告将对实验过程和结果进行总结和分析。
一、实验目的本次实验的主要目的是让我们掌握汇编语言的基本语法和操作方式,培养我们对计算机底层运行机制的理解能力。
通过编写汇编程序,我们可以更深入地了解计算机的运行原理,并且可以更加高效地编写一些底层程序。
二、实验环境本次实验使用的是Windows操作系统,并且我们使用了MASM汇编器来编译和运行我们的汇编程序。
MASM是一款经典的汇编语言开发工具,具有强大的功能和广泛的应用领域。
三、实验内容在本次实验中,我们完成了以下几个任务:1. 编写一个简单的汇编程序,实现两个数字的相加功能。
2. 编写一个汇编程序,实现对一个字符串进行反转。
3. 编写一个汇编程序,实现对一个数组进行排序。
四、实验步骤1. 首先,我们学习了汇编语言的基本语法和指令集。
了解了汇编语言中的寄存器、指令和内存等概念,并且学会了如何使用它们来编写程序。
2. 接着,我们开始编写第一个程序,实现两个数字的相加功能。
通过学习汇编语言中的加法指令,我们可以将两个数字加载到寄存器中,并且使用相应的指令进行相加操作。
3. 然后,我们编写了第二个程序,实现对一个字符串进行反转。
通过学习汇编语言中的循环和条件判断指令,我们可以逐个字符地读取字符串,并且将它们按照相反的顺序存储到新的内存空间中。
4. 最后,我们编写了第三个程序,实现对一个数组进行排序。
通过学习汇编语言中的比较和交换指令,我们可以对数组中的元素进行排序,并且将排序结果存储到新的内存空间中。
五、实验结果通过以上的实验步骤,我们成功地完成了编写汇编程序的任务,并且得到了正确的结果。
我们的程序可以实现两个数字的相加、字符串的反转和数组的排序功能,并且运行速度较快,效果较好。
汇编实验一实验报告一、实验目的1.了解汇编语言的基本概念和基本语法。
2.掌握常见汇编指令的使用方法。
二、实验器材1.计算机一台。
2.汇编语言开发环境。
三、实验原理和方法1.汇编语言是低级程序语言,是计算机可以直接识别并执行的语言。
2.汇编语言采用助记符表示计算机指令,并且每一条汇编指令都对应一条机器指令。
四、实验过程及结果1.编写一个汇编程序,实现将两个数相加并输出结果的功能。
2.打开汇编语言开发环境,创建一个新的源文件。
3.在源文件中编写汇编程序,并保存。
4.汇编程序的伪指令section .data用于定义数据段,section .text用于定义代码段。
5.使用汇编指令mov将要相加的两个数赋值给寄存器,使用汇编指令add将两个数相加,并将结果保存到一个寄存器中。
6.使用汇编指令mov将结果从寄存器中取出,并输出到屏幕。
7.编译和运行汇编程序,查看结果是否正确。
五、实验结果分析经过编译和运行,实验程序顺利执行,结果正确输出。
通过这个实验,加深了对汇编语言的理解和掌握。
六、实验总结通过本次实验,我了解了汇编语言的基本概念和基本语法,并掌握了常见汇编指令的使用方法。
在实验过程中,我遇到了一些问题,如如何正确使用汇编指令以及如何调试程序等,但在同学和老师的帮助下,我顺利完成了实验,并且收获了很多。
通过这次实验,我深刻认识到汇编语言是一种非常底层的语言,需要对计算机底层原理有一定的了解,才能编写出正确的汇编程序。
同时,我也意识到汇编语言虽然复杂,但它的执行效率非常高,可以在一些特定场景下发挥出很大的作用。
总而言之,本次实验让我对汇编语言有了更深入的了解,也提高了我的编程能力。
希望在以后的学习中能够深入学习汇编语言,并能够熟练地使用它。
累加器实验报告总体思路:①先把数字串转化为数字,应用课件上的程序。
②用循环进行累加③把累加结果显示出来④进行非法输入处理,进行溢出处理⑤测试与修改程序中遇到的问题和解决方法:①问题:输出的字符串“sum=”把字符串“input N:”的一部分冲掉解决方法:在输入数值之后回车换行。
②问题:溢出的判断问题解决方法:因为计算结果溢出后结果改变,不能直接与2^16比较,所以先解不等式(1+N)N/2<2^16,解得N≤361,所以当N>361时溢出。
王文海912106840440DA TAS SEGMENTSTR0 DB 'input n:$'STR1 DB 'sum=$'STR2 DB 13,10,'illegal input!',13,10,'$'STR3 DB 13,10,'overflow!',13,10,'$'FUC DB 13,10,'$'NUM DW 0DA TAS ENDSCODES SEGMENTASSUME CS:CODES,DS:DA TASSTART:MOV AX,DA TASMOV DS,AXLEA DX,STR0MOV AH,9INT 21H ;输出str0AG1:MOV AH,1INT 21HCMP AL,0DH ;回车结束数字串的输入JZ LAB1CMP AL,48JL ERO1CMP AL,57JG ERO1 ;非法字符的判定与跳转SUB AL,48PUSH AXMOV AX,NUMSHL AX,1PUSH AXMOV CL,2SHL AX,CLPOP BXADD AX,BXPOP BXMOV BH,0ADD AX,BXMOV NUM,AXJMP AG1LAB1:MOV AX,NUMCMP AX,361JG ERO2 ;溢出判定与跳转,361事先由求和公式算好MOV BX,AXAG2:DEC AXADD BX,AXCMP AX,1JG AG2 ;累加,结果保存在bx中LEA DX,FUCMOV AH,9INT 21H ;回车换行LEA DX,STR1MOV AH,9INT 21H ;输出str1MOV CX,0MOV AX,BXMOV BX,10AG3:MOV DX,0DIV BXADD DL,48PUSH DXINC CXCMP AX,0JNZ AG3AG4:POP DXMOV AH,2INT 21HLOOP AG4JMP EN ;显示累加的结果ERO1: ;显示非法输入LEA DX,STR2MOV AH,9INT 21HJMP ENERO2: ;显示溢出LEA DX,STR3MOV AH,9INT 21HEN:MOV AH,4CHINT 21HCODES ENDSEND START功能:本累加程序能进行累加(结果不超过65535),进行非法输入的判断,进行超界判断。
汇编实验报告——累加程序计算机2012级三班毛俊学号:912106840335一、实验思路:1、利用十进制数输入的方法实现n的输入,将n保存2、利用循环的知识设计程序实现n的累加(具体见流程图)3、将计算好的结果存入sum4、利用十进制输出实现sum数值的输出二、实验流程图:三、带有注释的程序代码:DA TAS SEGMENTmj1 db 'input n',13,10,'$'mj2 db 'n=','$'mj3 db 13,10,'sum=','$'sum dw ?n dw ?,'$'DA TAS ENDSSTACKS SEGMENTstack db 128 dup ('?')STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DA TAS,SS:STACKS START:MOV AX,DA TASMOV DS,AXlea dx,mj1mov ah,9int 21h ;输出字符串mj1lea dx,mj2mov ah,9int 21h ;输出字符串mj2a1:mov ah,1 ;一号功能调用等待输入int 21hcmp al,0dh ;比较是否输入了回车jz a2 ;如果是则跳转至a2sub al,'0' ;减去0的ascii码,是输入的表示数值mov ah,0push ax ;保存输入的数值mov ax,nshl ax,1 ;n乘以2push axmov cl,2shl ax,cl ;计算得到8nmov bx,0pop bxadd ax,bxpop bxadd ax,bx ;计算10n与输入的数的和mov n,ax ;保存ax中的数至njmp a1 ;跳转至a1a2:mov ax,0mov bx,0 ;ax、bx置0a3:inc bx ;bx加一add ax,bx ;ax、bx相加cmp bx,n ; 比较bx和n的大小jnz a3 ; 不相等则跳转至a3mov sum,ax ; 否则将ax中的数存入sumlea dx,mj3mov ah,9int 21h ; 输出字符串mj3mov ax,sum ; 准备输出summov dx,0mov bx,10mov cx,0a4:div bx ; dx、ax中的数联合除以bx(10),将商放入ax,余数放入dx add dl,'0' ; 余数加上0的ascii码mov dh,0push dx ; 保存余数的ascii码mov dx,0inc cx ; cx加1,为之后的循环做准备cmp ax,0jnz a4 ; 若ax不为0则跳转至a4a5:pop dx ; a5 实现十进制的输出mov ah,2int 21hloop a5MOV AH,4CHINT 21HCODES ENDSEND START ;程序结束四、程序设计中的体会:在刚开始设计时遇到最大的麻烦就是如何进行十进制数的输入,开始时并没有注意输入的其实是ascii码,因此始终无法实现正确输入与计算。
汇编累加程序实验设计报告一、设计思想简单的循环累加,主要体会字符串转十进制数输入输出二、程序流程图三、程序源代码;sigma;20121229 by4king,"$"(0) N DW0 ;NRLT DW0 ;RESULT FLAG DW0 ;ERROR SIGN :0-VALID,1-INVALID,2-OVERFLOWDATAS ENDSSTACKS SEGMENTDB1024 DUP (?) STACKS ENDSCODES SEGMENTASSUMECS:CODES,DS:DATAS,SS:STACKSSTART:PUSH6 MACROPUSH AXPUSH BXPUSH CXPUSH DXPUSH SIPUSH ESENDMPOP6 MACROPOP ESPOP SIPOP DXPOP CXPOP BXPOP AXENDM;_____________MACRO DEFINE_______________ MOV AX,DATASMOV DS,AXCALL READCMP FLAG,0JG ERRINFO;有非法标志则跳转XOR CX,CXXOR AX,AXMOV CX,NSIGMALOOP:ADD AX,CXDEC CXCMP CX,0JG SIGMALOOPMOV RLT,AXLEA DX,OUTSTR MOV AH,9INT 21HCALL REOUTJMP FINISHERRINFO:CMP FLAG,2JZ OFVLLEA DX,IVLSTRMOV AH,9INT 21HJMP FINISH OFVL:LEA DX,OFSTRMOV AH,9INT 21HFINISH:MOV AH,4CHINT 21H;主程序结束————————READ PROC NEARPUSH6LEA DX,INITMOV AH,9INT 21HLEA DX,BUFFERMOV AH,10INT 21HSUB CX,CXMOV CL,BUFFER+1;CL计数,字符个数JCXZ V1MOV SI,OFFSET BUFFER+2;指向字符串首地址A2DLOOP:MOV BL,[SI]SUB BL,"0"INC SIDEC CLCMP BL,0JL V1CMP BL,9JG V1;非法输入判断MOV AX,NMOV DX,10MUL DXADD AL,BLMOV N,AXCMP CL,0JZ CHECKJMP A2DLOOPV1:MOV FLAG,1JMP EXITCHECK:CMP N,361JL EXITMOV FLAG,2;溢出检查EXIT:POP6RETREAD ENDPREOUT PROC NEAR PUSH6MOV CX,0MOV AX,RLTMOV BX,10A1: MOV DX,0DIV BXADD DL,48PUSH DXINC CXCMP AX,0JNZ A1A2: POP DXMOV AH,2INT 21HLOOP A2POP6RET REOUT ENDPCODES ENDSEND START效果图四、心得体会因为以前有写过PASCAL程序,所以对字符串操作还算熟悉,但是还是深深感到汇编的繁琐……这其中我觉得最麻烦的是调试,masm自带的编辑器很简陋,我也没找到什么很好的IDE。
《汇编语言》实验报告
——累加器制作2014级计算机科学与工程学院学号:姓名
一、实验要求:
1.显示 INPUT N:,提示用户输入数字字串
2.检测输入字串的合法性,非法给出提示
3.将输入数字字串转化为数值,存入变量n
4.累加1~n,存入变量sum
5.以十进制显示sum
二、流程图:
三、源代码:
DATAS SEGMENT
str1 db "Input N:","$"
str2 db "sum=","$"
str3 db 0ah,"error","$"
n dw 0
sum dw 0
DATAS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS START:
MOV AX,DATAS
MOV DS,AX
LEA dx,str1;输出提示符
mov ah,9
int 21h
input:
mov ah,01;输入数字
int 21h
cmp al,0dh;判断是否为回车
jz step1
cmp al,"0";判断字符合法性
jb error
cmp al,"9"
ja error
sub al,"0";转化为ASCII码
mov ah,0;此段将高位乘10
push ax
mov ax,n
shl ax,1
push ax
mov cl,2
shl ax,cl
pop bx
add ax,bx
mov bx,0;高位与低位相加
pop bx
add ax,bx
mov n,ax
xor cx,cx;设定累加次数
mov cx,n
jmp input
step1:
mov ax,cx
sub cx,1
step2:
add ax,cx;求累加和
loop step2
mov sum,ax
lea dx,str2
mov ah,9
int 21h
mov cx,0
mov ax,sum
step3:
mov dx,0
mov bx,10;将结果除以10并把余数压进栈div bx
push dx
inc cx
cmp ax,0h
jnz step3
step4:
xor ax,ax
pop ax ;栈内依次输出
mov dx,ax
add dx,30h
int 21h
loop step4
jmp last
error:
lea dx,str3;输出错误提示语
mov ah,9
int 21h
last:
MOV AH,4CH
INT 21H
CODES ENDS
END START
四、实验测试截图
五、实验心得:
本次试验的目的在于通过编辑累加器程序来熟悉汇编语言中对循环结构的使用,其中包括循环输入字符并判断合法性、累加计算、循环输出计算结果。
其中的关键点在于通过堆栈来保护和存放数据,并在多
次存放后依次提出数据,要求我们能够灵活地利用堆栈与寄存器之间的转换进行较为复杂的逻辑运算。
经过逐步编写和多次修改完善,终于成功地完成了本次实验。
在实验过程中,我的逻辑思维能力得到加强,对分步编写和局部细化了解得更加透彻,同时对循环结构、数据输入和输出过程更加熟练,课堂上学习的知识得到了练习,掌握地更加牢固,收益匪浅。