汇编语言程序设计——十个数相加
多位十进制数加法器设计.
深圳大学实验报告课程名称:微机原理及应用实验实验项目名称:多位十进制数加法器设计学院:物理科学与技术学院专业:应用物理指导教师:报告人:学号:班级:应用物理班实验时间:2015-10-19实验报告提交时间:2015-11-02教务处制五、程序说明(预习)七、实验源程序清单(实验后以电子报告形式存储到指定位置)1.源程序路径及文件名:ADD2.ASM ADD1.ASM2.可执行程序路径及文件名:八、上机调试情况说明EMU8086:一:没有键盘录入1.结果显示如下:2.程序运行时的各段地址:3.两个子程序IP入口:4.改变两个加数数值5.子程序格式及其调用方法和宏汇编区别子程序格式:子程序名称PROC NEAR ; 子程序定义; …子程序内容RET ;子程序返回子程序名称ENDP ;子程序结束调用格式:CALL 子程序名称注意事项:1、子程序不能直接传递参数,需要自行定义变量。
2、注意保护现场和恢复现场。
宏汇编与子程序的区别:1、宏汇编有宏展开,子程序没有2、宏汇编可以传递参数。
二:键盘录入DOS:例如:250+250=500例如:62142+63123=125265九、实验结果与分析结果如下:十、实验总结(必备部分,评分重要依据之一)本次实验实则是对实验二的加强巩固基础上,进行更加友好的人机交互设计;通过本次实验不仅在程序中首先把两个加数固定,在实验二的基础上扩展位数,考虑到最高位进位的情况,并最终得出正确结果;后来又通过键盘录入两个加数,增加了人机交互的设计,如此一来,更加加深了对寄存器的使用,汇编语言宏定义,子程序调用以及DOS功能调用的学习。
同时,通过本次实验的学习,更加熟练了EMU8086工具的使用,也把理论课上学习到的汇编操作指令实际操作,对汇编语言的风格加深认识。
MOV DL,BLINT 21HCRLFJMP BEGINERROR:CRLFMOV AH,09H ;显示输入错误LEA DX,STRING3INT 21HCRLFJMP BEGINEXIT:CRLFMOV AH,09H ;显示成功退出LEA DX,STRING4INT 21HMOV AH,4CHINT 21HCODE ENDSEND START(2)请问你的程序能否处理加数和被加数都介于0~65535范围但计算结果超出该范围的情况?如何改进?可以,如图:主要考虑到最高位是否进位,可以设置一个进位变量加以判断。
汇编语言——分别求10个数的正数和负数之和
#include<stdio.h>int main(){intBUFFER[10]={1,2,1,-1,1,1,1,-1,-8,-1},POSITIVE,NEGATIVE;//POSITIVE用于存储正数之和,NEGATIVE用于存储负数之和_asm{//把寄存器EAX初始化为,EAX用于存储数组中的负数之和XOR EAX,EAX//把寄存器EBX初始化为,EBX用于存储数组中的所有的数之和,则EBX-EAX为数组中正数之和XOR EBX,EBX//ECX作为计数器,初始值为MOV ECX,11//把BUFFER的地址给ESILEA ESI,BUFFERLABEL://寄存器EDX用于存储数组的当前的值MOV EDX,[ESI]//ESI加,指向数组的下一个元素ADD ESI,4//计数器ECX减DEC ECX//ECX为,表明循环结束,转至最后的标签LASTJZ LAST//比较EDX(数组当前值)和的大小CMP EDX,0//若EDX大于等于,则转至标签LABEL1JGE LABEL1//若EDX为负数,则把EDX加到寄存器EAX(存储数组中的所有负数之和)中ADD EAX,EDXLABEL1://不管前面怎么跳转,这句话都会执行,所以EBX存储的时数组中所有数据的和ADD EBX,EDX//跳转至LABEL,开始下一次循环JMP LABELLAST://把EBX减去EAX的值,得到所有正数和放到EBX中SUB EBX,EAX//把EBX的值给POSITIVEMOV POSITIVE,EBX//把EAX的值放到NEGATIVE中MOV NEGATIVE,EAX}printf("这个数为:");for(int i=0;i<10;i++){printf("%d,",BUFFER[i]);}printf("\n正数之和为:%d",POSITIVE);printf("\n负数之和为:%d\n",NEGATIVE);return 0;}程序运行结果如下:。
微机原理与汇编语言实用教程_第5章_运算程序设计及应用举例
/webnew/
第5章 运算程序设计及应用举例 章
5.1.4 除法指令 1.无符号数除法指令DIV (Unsigned Divide Instruction) 指令格式:DIV SRC (AX) (SRC) (AX)/(SRC)商、AH AH (AX) (AX)/ 功能:如果SRC是字节操作数,则把AX中的无符号数除以SRC,得到8位 的商送AL中,8位的余数送AH中,即:AL AL 8 AH AL (SRC)余数。 如果SRC是字操作数,则把DX和AX中的无符号数除以SRC,得到16位的 商送AX中,16位的余数送DX中,即:AX (DX,AX)/(SRC)余数。 指令对标志位的影响无定义。 (DX,AX)/(SRC)商、DX
IMUL指令除了运算对象是有符号数之外,其它都与MUL指令一样,但计算结果 不同。如果乘积的高半部分有符号扩展,则CF=OF=0,否则CF=OF=1。 例5.8 有符号数0B4H与11H相乘。 MOV AL,0B4H MOV BL,11H IMUL BL ;(AL)=0B4H=-76D ;(BL)=11H=17D ;AX)=(AL)×(BL)=(-76)×17=-1292D=0FAF4H ;CF=OF=1
/webnew/
第5章 运算程序设计及应用举例 章
例5.4 DATA SUB1 SUB2 SUB3 DATA 双精度数带借位减法运算。 SEGMENT DW 7788H,5566H DW 3344H,1122H DW 0,0 ENDS … MOV AX,SUB1 SUB AX,SUB2 MOV SUB3,AX MOV AX,SUB1+2 SBB AX,SUB2+2 MOV SUB3+2,AX …
/webnew/
第5章 运算程序设计及应用举例 章
双字节BCD加法
双字节BCD加法
一、实验目的:
1、通过常用指令的编辑练习,进一步理解并掌握MCS-51单片机的指令系统。
2、学习并掌握双字节BCD加法的程序设计
3. 学习汇编语言的程序设计基本方法
二、实验内容:
将两个双字节十进制数机加,相加所得和个位放入R0中,十位放入R1中,若有进位则百位放入R2中。
三、实验设备:
计算机一台
操作系统:Windows xp
应用软件:WA VE6000
四、实验步骤:
双字节BCD加法流程图
上机调试程序:
ORG 0000H
LJMP MAIN
ORG 0100H MAIN: MOV R0,#12H
MOV R1,#06H
MOV R2,#08H
MOV R3,#11H
MOV A,R0
ADD A,R2
DA A
MOV R2,A
ANL A,#0FH
MOV R0,A ;将结果的个位放在R0中MOV A,R2
ANL A,#0F0H
SWAP A
ADD A,R1
ADD A,R3
DA A
MOV R3,A
ANL A,#0FH
MOV R1,A ;将结果的十位放在R1中MOV A,R3
MOV R3,#0H
ANL A,#0F0H
SWAP A
MOV R2,A ;将结果的百位放在R2中RET
END
程序单步运行:
查看结果:
五、实验总结:
通过对双字节BCD加法编程的练习,掌握了WA VE6000软件的使用,进一步理解并掌握了MCS-51单片机的指令系统,学会了双字节BCD加法的程序设计,对汇编语言的程序设计基本方法与基本思路有了感性的认识。
10个数求和程序设计
10个数求和程序设计我们需要明确程序的功能:计算给定的10个数的总和。
接下来,我们可以使用任何一种编程语言来实现这个程序。
我们以Python语言为例,来展示一个简单的程序设计。
我们需要定义一个列表来存储这10个数。
我们可以使用一个for循环来依次输入这些数,并将它们添加到列表中。
```pythonnumbers = [] # 定义一个空列表for i in range(10):number = float(input("请输入第{}个数:".format(i+1)))numbers.append(number) # 将输入的数添加到列表中```接下来,我们需要编写一个函数来计算列表中所有数的总和。
我们可以使用一个for循环来遍历列表,并将每个数累加到一个变量中。
```pythondef calculate_sum(numbers):total = 0 # 初始化总和为0for number in numbers:total += number # 将每个数累加到总和中return total```我们可以调用这个函数,并输出结果。
```pythonsum = calculate_sum(numbers)print("这10个数的总和为:", sum)```以上就是一个简单的求和程序的设计过程。
我们可以根据具体需求进行修改和扩展,比如增加输入校验、处理异常情况等。
总结一下,编写一个求和程序的关键步骤包括:定义一个列表,使用循环读取输入的数并添加到列表中,编写一个函数来计算列表中所有数的总和,最后调用该函数并输出结果。
希望本文对您理解和编写求和程序有所帮助。
如果您还有其他问题,欢迎继续提问。
微机原理 两个多位十进制数相加
实验三两个多位数十进制数相加的实验一、实验目的学习数据传送和算术运算指令的用法。
熟悉在PC机上建立、汇编、链接、调试和运行8086汇编语言程序的过程。
二、实验内容及程序将两个多位数十进制数相加,要求被加数和加数均以ASCⅡ码形式各自顺序存放在以DATA1和DA TA2为首的5个内存单元中,且低位在前,结果送回DA TA1处。
编程要求与提示:[1] 两个加数均以压缩(组合)十进制数形式存放在ADD1和ADD2为首址的存贮器单元。
[2] 和以压缩十进制数的形式存入SUM以下单元。
[3] 将和送到屏幕显示部分功能的实现采用子程序的形式。
[4] 实验步骤如下:a. 用全屏幕编辑软件建立源程序。
b.用masm.exe汇编程序对源程序进行汇编,形成目标程序。
c. 用link.exe连接程序对目标程序进行连接形成可执行文件。
d. 用DEBUG对连接通过的可执行程序进行调试。
三、参考流程STACK SEGMENT STACK 'STACK'DW 100H DUP(?)STACK ENDSDA TA SEGMENTADD1 DD 12678532H ;加数以组合十进制形式存放在双字单元ADD2 DD 21736543HSUM DD ?DA TA ENDSCODE SEGMENTASSUME CS:CODE,DS:DA TA,ES:DATA,SS:STACKSTART: MOV AX,DA TAMOV DS,AXMOV ES,AXMOV AX,STACKMOV SS,AXLEA SI,ADD1LEA DI,ADD2LEA BX,SUMMOV AL,[SI]ADD AL,[DI] ;最低位的一个字节相加DAA ;加法组合BCD码调整MOV [BX],AL ;结果存放在SUM第一个字节MOV AL,[SI+1] ;第二个字节相加ADC AL,[DI+1]DAAMOV [BX+1],ALMOV AL,[SI+2]ADC AL,[DI+2]DAAMOV [BX+2],ALMOV AL,[SI+3]ADC AL,[DI+3]DAAMOV [BX+3],ALMOV DL,00 ;最高位字节有进位则显示"01"ADC DL,00CALL DISPSUMMOV AH,4CH ;返回DOSINT 21HDISPSUM PROC NEAR ;结果显示子程序PUSH AXPUSH BXPUSH CXPUSH SIMOV SI ,4PUSH DXMOV CX,5LAB:PUSH CXPUSH BXMOV AL,DLMOV BL,DLMOV CL,4 ;显示高位字节SHR AL,CLADD AL,30HMOV AH,02MOV DL,ALINT 21H ;显示一位字符AND BL,0FH ;显示低位字节ADD BL,30HMOV AH,02MOV DL,BLINT 21HPOP BXPOP CXDEC SIMOV DL,[BX][SI] ;结果显示LOOP LABPOP DXPOP SIPOP CXPOP BXPOP AXRETDISPSUM ENDPCODE ENDSEND START。
汇编语言课程设计-十进制加减法
目录课程设计任务书 (2)1 问题描述 (3)2 前期分析 (3)3 课程设计 (3)3.1 总体设计 (3)3.2 模块设计 (4)3.2.1 求和模块 (4)3.2.2 输入十进制数模块 (5)3.2.3 存储器清零模块 (6)3.2.4 减法模块 (7)4 程序源代码 (7)5 调试与分析 (13)6 测试结果 (13)7 经验与体会 (15)评分表 (16)课程设计任务书学生姓名:毛习均专业班级:计算机1004班指导教师:许毅工作单位:计算机科学与技术学院题目: 十进制加减计算器初始条件:理论:完成了《汇编语言程序设计》课程,对微机系统结构和80系列指令系统有了较深入的理解,已掌握了汇编语言程序设计的基本方法和技巧。
实践:完成了《汇编语言程序设计》的4个实验,熟悉了汇编语言程序的设计环境并掌握了汇编语言程序的调试方法。
要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)进一步理解和掌握较复杂程序的设计方法,掌握子程序结构的设计和友好用户界面的设计。
具体的设计任务及要求:1)编写程序实现十进制数的加减法;2)将计算结果在屏幕上显示;3)程序采用子程序结构,结构清晰;4)友好清晰的用户界面,能识别输入错误并控制错误的修改。
在完成设计任务后,按要求撰写课程设计说明书;对课程设计说明书的具体要求请见课程设计指导书。
阅读资料:1)《IBM—PC汇编语言程序设计实验教程》实验2.42)《IBM—PC汇编语言程序设计(第2版)》例6.11时间安排:设计安排一周:周1、周2:完成系统分析及设计。
周3、周4:完成程序调试,和验收。
周5:撰写课程设计报告。
指导教师签名:年月日系主任(或责任教师)签名:年月十进制加减法计算器1问题描述用汇编语言编写一个十进制加减法计算器,此程序要求将结果显示在屏幕上,并且友好清晰的用户界面,能识别输入错误并且控制修改。
在此程序中采用子结构程序使结构清晰。
汇编语言设计-算术运算指令
NEG指令是对指令中的操作数取补,再将结果送回。因 对一个操作数求2的补码,相当于0减去此操作数,所以NEG 指令执行的也是减法操作。
说明:0 – OPRD 又相当于: ①、FFH-OPRD+1 (字节操作)或
②、FFFFH-OPRD+1(字操作)。即将OPRD内容变反加1
例:若(AL)=13H 0000 0000 执行 NEG AL – 0001 0011
0000 0110 + 1111 1100 1← 0000 0010
6 + 252
258>255
+6 + (–4)
+2
CF=1 溢出
OF=0 不溢出
ⅲ、无符号数不溢出,带符号数溢出:
二进制加法 认作无符号 认作带符号数
0000 1000 + 0111 1011
1000 0011
8 + 123
131 CF=0 无溢出
2、带进位位的加法指令ADC ADC dest , src ; dest←dest+src+CF
ADC主要用于多字节运算,ADC对标志位的影响同ADD。 例:计算 1234FEDCH+33128765H 分别存于数据段指
定的区域中,低位在前,高位在后,相加后其和存入前一个双 字所在的区域中。 (SI)→1000H DCH (41H)
+ 39H 0011 1001
0110 1110
则(AL)=6EH,低4位为非法码,故需调整。
4、组合十进制加法调整指令DAA
(BCD码的加法十进制调整指令)
格式:DAA
功能:对组合BCD码相加的结果进行调整,使结果仍为 组合的BCD码。
汇编语言程序设计示例
汇编语言程序设计示例汇编语言是一种底层的计算机指令语言,常用于编写操作系统、嵌入式系统以及对计算机硬件进行精细控制的程序。
本文将为您提供一些汇编语言程序设计的示例,帮助您更好地理解和应用汇编语言。
示例一:计算两个整数的和```section .datanum1 db 5 ; 定义第一个整数为5num2 db 7 ; 定义第二个整数为7result db 0 ; 定义结果变量为0section .textglobal _start_start:mov al, [num1] ; 将第一个整数加载到寄存器ALadd al, [num2] ; 将第二个整数与AL相加mov [result], al ; 将结果存储到result变量; 显示结果mov eax, 4 ; 系统调用号为4,用于写mov ebx, 1 ; 标准输出文件描述符为1mov ecx, result ; 要写的字符串地址mov edx, 1 ; 要写的字符数量int 0x80 ; 进行系统调用mov eax, 1 ; 退出系统调用号为1,用于退出 xor ebx, ebx ; 返回值为0int 0x80 ; 进行系统调用```示例二:求解斐波那契数列```section .datan db 10 ; 求解第10个斐波那契数列的值 result db 0 ; 定义结果变量为0section .textglobal _start_start:mov ecx, 2 ; 定义计数器ecx,初始值为2 mov al, 0 ; 定义第一个斐波那契数为0mov bl, 1 ; 定义第二个斐波那契数为1fib_loop:add al, bl ; 将前两个数相加xchg al, bl ; 将al和bl的值互换,bl保存下一个斐波那契数 inc ecx ; 计数器加1cmp cl, [n] ; 比较计数器的值与n的值jg fib_end ; 如果计数器大于n,跳转到结束标签jmp fib_loop ; 跳转回循环开始处fib_end:mov [result], bl ; 将结果存储到result变量; 显示结果mov eax, 4 ; 系统调用号为4,用于写mov ebx, 1 ; 标准输出文件描述符为1mov ecx, result ; 要写的字符串地址mov edx, 1 ; 要写的字符数量int 0x80 ; 进行系统调用mov eax, 1 ; 退出系统调用号为1,用于退出xor ebx, ebx ; 返回值为0int 0x80 ; 进行系统调用```这些示例程序涉及了汇编语言的基本操作和语法,但并不包括全部内容。
1到n的循环求和汇编
1到n的循环求和汇编汇编语言是一种低级编程语言,用于编写计算机程序。
在汇编语言中,我们可以使用循环来实现一系列操作,例如求和。
本文将介绍如何使用汇编语言来实现1到n的循环求和。
我们需要定义一个变量n,它表示求和的上限。
我们可以使用汇编语言中的数据定义指令来声明这个变量,并给它赋初值。
例如,我们可以使用指令`MOV AX, n`来将变量n的值存储在寄存器AX中。
接下来,我们需要初始化一个累加器,用于存储求和的结果。
我们可以使用指令`MOV BX, 0`将累加器的初值设为0。
然后,我们可以使用循环指令来实现求和的过程。
在汇编语言中,有多种循环指令可供选择,例如`LOOP`指令、`JNZ`指令等。
这些指令可以根据条件来控制循环的执行次数。
在这个例子中,我们可以使用`LOOP`指令来实现循环求和。
循环求和的思路是不断将计数器的值加到累加器上,直到计数器的值达到上限。
我们可以使用指令`ADD BX, AX`将计数器的值加到累加器上。
然后,我们可以使用指令`DEC AX`将计数器的值减1。
最后,我们可以使用指令`CMP AX, 0`来判断计数器的值是否为0,如果不为0,则继续执行循环。
当循环结束后,累加器的值就是1到n的和。
我们可以使用指令`MOV n, BX`将累加器的值存储回变量n中。
下面是完整的汇编代码示例:```DATA SEGMENTn DW 10 ; 变量n,表示求和的上限sum DW 0 ; 累加器,用于存储求和的结果DATA ENDSCODE SEGMENTSTART:MOV AX, @DATA ; 初始化数据段寄存器MOV DS, AXMOV AX, n ; 将变量n的值存储在寄存器AX中 MOV BX, 0 ; 初始化累加器LOOP_START:ADD BX, AX ; 将计数器的值加到累加器上DEC AX ; 计数器减1CMP AX, 0 ; 判断计数器的值是否为0JNZ LOOP_START ; 如果不为0,则继续循环MOV sum, BX ; 将累加器的值存储回变量n中MOV AX, 4C00H ; 程序结束指令INT 21HCODE ENDSEND START```在上面的代码中,我们使用了数据段和代码段来分隔数据和代码。
04两个多位十进制数相加实验
实验原理
(2)BCD算术运算调整的基本原理 以组合十进制数加法运算为例: 当两数相加后,进位位C和半进位位A均为零,即 结果的高低4位均未大于9,则不需调整; 当两数相加后,结果的低4位大于9,即半进位位 A=1,则结果加06H; 当两数相加后,结果的高4位大于9,则结果加 60H; 当两数相加后,结果的低4位大于9,即半进位位 A=1,且同时进位位C=1,则结果加66H。
实验报告要求
1、记录实验中具体数据,并做整理和分析。
2、对程序进行逐行的详细注释。
3、将程序试改为减法,写出修改后的程序
指令、画出流程图、记录运行数据。
调用号
1 2 8
Байду номын сангаас功能
输入并显示一个字符
入口参数
出口参数
屏幕显示一个字符
DL中预先放入待显 示字符的ASCII码 执行后输入字符的 ASCII码存在AL中 DS:DX中存入字符 串首地址,字符串 必须要有$作为最后 结尾 DS:DX中设置字符 串首地址,且第1个 单元为允许输入最 大字符个数(外加1 个回车符) 执行后,实际输入 的字符个数存在字 符串第2个单元,字 符内容从字符串第3 个单元开始依次存 放 有输入AL=FFH, 无输入AL=0
键盘输入一个字符
9
屏幕显示字符串
10(0AH)
键盘输入同时屏幕显 示字符串
11(0BH)
检测有无键盘输入
下次实验内容
实验名称:
汇编语言程序设计实验(课堂测试)
实验内容:
根据后面提供的题目,由教师上课时随 机指定,当堂完成其中一个程序题目的编写、 编译、调试、运行等全过程。
汇编程序题
1、两个字节数(十六进制数)相减A-B送D,并以十六进制形式显 示结果。 2、两个十进制数相加,求其和,要求显示结果。(设两个加数及其 和均为位数相等的无符号数,且最多不超过5位) 3、将一个十进制正数(不超过4位数),转换成对应16进制数,显 示到屏幕上。 4、一个四位16进制数,按照二进制形式显示到屏幕上。 5、将一串十进制数字,分别用正序和反序显示到屏幕上。比如原始 序列为426135,其正序与之相同,反序就是531624. 6、将一串(2~10个)无序的十进制数字,按从小到大的顺序重新 排好后显示到屏幕上。 7、将一串不带符号的十进制数,求其最大值和最小值。
IBM-PC汇编语言程序设计(第二版)答案
///第一章. 习题1.1 用降幂法和除法将下列十进制数转换为二进制数和十六进制数:(1) 369 (2) 10000 (3) 4095 (4) 32767答:(1) 369=1 0111 0001B=171H(2) 10000=10 0111 0001 0000B=2710H(3) 4095=1111 1111 1111B=FFFH(4) 32767=111 1111 1111 1111B=7FFFH1.2 将下列二进制数转换为十六进制数和十进制数:(1) 10 1101 (2) 1000 0000 (3) 1111 1111 1111 1111 (4) 1111 1111答:(1) 10 1101B=2DH=45(2) 1000 0000B=80H=128(3) 1111 1111 1111 1111B=FFFFH=65535(4) 1111 1111B=FFH=2551.3 将下列十六进制数转换为二进制数和十进制数:(1) FA (2) 5B (3) FFFE (4) 1234答:(1) FAH=1111 1010B=250(2) 5BH=101 1011B=91(3) FFFEH=1111 1111 1111 1110B=65534(4) 1234H=1 0010 0011 0100B=46601.4 完成下列十六进制数的运算,并转换为十进制数进行校核:(1) 3A+B7 (2) 1234+AF (3) ABCD-FE (4) 7AB×6F 答:(1) 3A+B7H=F1H=241(2) 1234+AFH=12E3H=4835(3) ABCD-FEH=AACFH=43727(4) 7AB×6FH=35325H=2178931.5 下列各数均为十进制数,请用8位二进制补码计算下列各题,并用十六进制数表示其运算结果。
(1) (-85)+76 (2) 85+(-76) (3) 85-76 (4) 85-(-76) (5) (-85)-76 (6)-85-(-76)答:(1) (-85)+76=1010 1011B+0100 1100B=1111 0111B=0F7H;CF=0;OF=0(2) 85+(-76)=0101 0101B+1011 0100B=0000 1001B=09H;CF=1;OF=0(3) 85-76=0101 0101B-0100 1100B=0101 0101B+1011 0100B=0000 1001B=09H;CF=0;OF=0(4) 85-(-76)=0101 0101B-1011 0100B=0101 0101B+0100 1100B=10100001B=0A1H;CF=0;OF=1(5) (-85)-76=1010 1011B-0100 1100B=1010 1011B+1011 0100B=0101 1111B=5FH;CF=0;OF=1(6) -85-(-76)=1010 1011B-1011 0100B=1010 1011B+0100 1100B=11110111B=0F7H;CF=0;OF=01.6 下列各数为十六进制表示的8位二进制数,请说明当它们分别被看作是用补码表示的带符号数或无符号数时,它们所表示的十进制数是什么?(1) D8 (2) FF答:(1) D8H表示的带符号数为 -40,D8H表示的无符号数为216;(2) FFH表示的带符号数为 -1, FFH表示的无符号数为255。
汇编语言程序设计练习题及参考答案
一、单项选择题从每小题的四个备选答案中,选出一个正确答案,并将正确答案的番号填人括号内。
1.用来存放下一条将要执行的指令地址的寄存器是(B)A.SP B.IP C.BP D.CS2.要使串处理从低地址向高地址进行,应把标志位置为(D)A.IF=1B.TF=0C.DF=1D.DF=03.使状态标志位CF清零的错误指令是(C)A.OR AX,AX B.SUB AX,AXC.MOV CF,0D.CLC4.设SP=1110H,执行PUSH AX指令后,SP的内容为(B)A.SP=1112H B.SP=110EHC.SP=1111H D.SP=110FH5.汇编源程序出现语法错误的指令有(D)A.MOV[BX+SI],AL B.MOV AX,[BP+DI]C.MOV DS,AX D.MOV CS,AX6.下列串操作指令中,必须同时指明源串和目的串地址的指令是(D)A.STOSW B.LODSWC.SCASW D.CMPSW7.设BL中有一无符号数,实现把BL中的数乘以2,应选用的指令是(B)A.SHR BL,1B.SHL BL,1C.SAR BL,1D.RCR BL,18.执行PUSH AX指令的正确步骤是(A)A.1.SP←SP-1,(SP)←AH B.1.(SP)←AH,SP←SP-12.SP←SP-1,(SP)←AL2.(SP)←AL,SP←SP-1C.1.SP←SP+1,(SP)←AH D.1.(SP)←AH,SP←SP+12.SP←SP+1,(SP)←AL2.(SP)←AL,SP←SP+19.CF=1时转移到目标地址的条件转移指令是(B)A.JNC B.JC C.JZ D.JS10.在执行NEG指令时,对标志位CF有影响,其影响的规则是(C)A.对正数求补时,CF=0B.对负数求补时,CF=0C.对非零数求补时,CF=1D.对零求补时,CF=111.算术右移SAR和逻辑右移SHR两条指令执行后结果完全相同的情况是(A)A.目的操作数最高位为0B.目的操作数最高位为1C.目的操作数为任意情况D.无论什么情况都不可能相同12.设AL=04H,BL=0F8H,执行IMUL BL指令后,结果是(D)A.AX=0032H B.AX=00E0HC.AX=03E0H D.AX=0FFE0H13.指令的操作数中,允许出现表达式,例如BUF1与BUF2均为变量名,下面指令中语法正确的是(D)A.MOV AX,BUFl*BUF2B.MOV AX,BUF1/BUF2C.MOV AX,BUF1+ES:BUF2D.MOV AX,BUF2-BUF114.下面指令中,操作数的寻址方式为寄存器间接寻址的指令是(C )A.INC WORD PTR [BX+SI]B.INC CX,[SI+COUNT]C.NEG BYTE PTR [BX]D.ADD AX,B15.NUM EQU 80HDA DB 34HAND DA,NUM上述语句执行后,DA 中的内容是(D )A.0B4H B.80H C.34H D.016.直接、间接、立即三种寻址方式指令的执行速度,由快至慢的排序为(A )A.立即、直接、间接B.直接、间接、立即C.直接、立即、间接D.不一定17.语句DA1DB 2DUP(3,5,7)汇编后,该语句可等同于的语句是(D )A.DA1DB 3,5,7B.DA1DB 2,3,5,7C.DA1DB 3,5,7,2D.DA1DB 3,5,7,3,5,718.MOV AL,80HMOV CL,2SAR AL,CL上述指令序列执行后,结果是(D )A.AL=40H B.AL=20HC.AL=0C0H D.AL=0E0H19.下面是实现将AL 内容加1的压缩型BCD 码加法程序段,其中正确的指令序列是(A )A.INC AL B.ADD AL,1DAA DASC.ADD AL,1D.STCDAA AAA20.现有数据存储如图所示:30100H 30101H 30102H 30103H 设AL=01H,BX=0100H,DS=3000H 执行换码指令XLAT 后正确的结果是(B )A.AL=20H B.AL=38HC.AL=00H D.AL=41H21.若定义DAT DW 'A',则(DAT)和(DAT+1)两个相邻的内存中存放的数据是(B )A.0041H B.4100H 20H38H41H55HC.xx41H D.41xxH[注]选项C.和D.中的XX表示任意数据。
汇编语言程序设计debug调试命令
标志位:
“1”
“0”
OF:溢出标志 —— OV溢出, NV没溢出
DF:方向标志 —— DN减量, UP增量
IF:中断允许标志 —— EI允许, DI禁止
SF:符号标志 —— NG负数, PL正数
ZF:“0”标志
—— ZR为“0”, NZ不为“0”
下次课预习内容:顺序结构程序设计
要求:1、实验指导书及实验报告上的预习内容 2、预习验收时要提供设计的源程序磁盘或笔写程序
-E CS:211 21 2A
;从CS:211H开始输入2个字节的内容
-E 110 ‘anything’
;输入从DS:110H开始的字符串
⑹ D(显示存储器的内容):
默认寄存器是DS,格式是:
-D段地址:偏移地址
;显示80H个字节的内容。
-D
显示从上一次结束处开始的80H个字节 的内容。
⑺ R(显示修改寄存器内容) -R ;显示所有寄存器内容。 -RDS ;显示并可修改DS的内容。 -RF ;显示并可修改标志寄存器
实验数据记录注意事项:
1、实验报告第三页:表格中标志位与计算机 自动给出的不是一一对应的,要求记录1/0
2、实验报告第四、五页:列出调试运行后的程序清单
因为行汇编不识别标号,所以:用行汇编运行的程
序中没有行号,转移指令处是绝对地址。
验收内容:
1、用T命令执行完程序最后一条指令处的界面:
-T =段地址:0
-G=段地址:偏移地址
-G
;从程序当前位置执行到
程序结束
-G =200 260
;从指定200H地址开始执行, 遇到断点
第二章--第四节--汇编语言程序设计方法(二)
A+30HA A(22H) 结束
R0
0010 0000
END
BCD码十进制转换成二进制
例:假如在内部RAM40H单元中存储有一个压缩BCD编码 的两位十进制数,设计一段程序把这个数转换成二进制数 并存入41H单元中。 解题思路: (40H) 16 商为二进制的高四位
余数
余为二进制的低四位
将高四位乘以0AH,再加上低四位即可。
数据排序程序 例:将片内RAM中20H-27H中的数据按照从小到大的顺序重新排列。 解题思路:见下图
RAM地址 原始数据
20H 66H
21H 11H
22H 10H
23H 34H
24H 67H
25H 01H
26H 89H
27H A0H
1
2 3 4 5 6 7
01H
01H 01H 01H 01H 01H 01H
11H
10H 10H 10H 10H 10H 10H
10H
11H 11H 11H 11H 11H 11H
34H
34H 34H 34H 34H 34H 34H
汇编语言输入10个数排序并输出的实现
汇编语⾔输⼊10个数排序并输出的实现⼀:题⽬描述在键盘输⼊任意10个数1. 按从⼩到⼤排序后,在计算机屏幕上先输出来。
要有结果提⽰(字符串显⽰)。
2. 将10个数做累加,结果在计算机屏幕显⽰累加和。
⼆:伪指令的定义1.数据段ATAS SEGMENTstring_1 DB 'Please input a numbers(0-65536):','$'string_2 DB 'ERROR: OVERFLOW! Please input again:','$'string_3 DB 'The array you have input is:',0ah,0dh,'$'string_4 DB 'After Sort the num is:',0ah,0dh,'$'string_5 DB ' ','$'DATA DW 10 DUP(?)massege DB 'The sum of the array is: ',0ah,0DH,'$'DATAS ENDS说明:string_1输⼊范围提⽰string_2输⼊错误提⽰string_3输出原数组提⽰string_4输出排序后数组提⽰string_5空格符DATA缓冲区数组2.堆栈段STACKS SEGMENTDW 256 dup(?)STACKS ENDS3.代码段CODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKS三:模块分解与实现1. DOS输⼊10个数字输⼊10个⽆符号数存⼊缓冲区,并且保证 num<65536num < 65536num<65536为何输⼊范围是65536呢⼀个字的最⼤表⽰范围是 FFFFFFFFFFFF 其在⼗进制的表⽰下为 65535HEX FFFFDEC65535BIN1111 1111 1111 11111.1 输⼊函数⼦程序;---------输⼊函数(单数字输⼊)------------Input PROC Nearpush AXpush BXpush CXpush DX;---------输⼊提⽰--------------MOV BX, 0CLCMOV DX, 0;----------输⼊数字--------------Lp_0:MOV AH, 1INT 21HCMP AL, 20H ;回车JE L_CRLF;----- x belong to [0,9] ----------SUB AL, 30H ; ASCII -> intJL L_ERRORCMP AL, 9JG L_ERROR;------- string -> int -----------MOV AH, 0 ;将 AL扩展成 AXXCHG AX, BX ;保护 AX值MOV CX, 10MUL CX ; bx *= 10ADD AX , BXJC L_ERROR ; OVERFLOW处理XCHG AX, BXJMP Lp_0L_ERROR:MOV DX, 0MOV BX, 0CALL CRLF ; 换⾏CALL ERROR ; 输出错误提⽰JMP Lp_0L_CRLF: ; 以换⾏作为⼀个数的结束标志MOV DX, 0MOV DATA[SI], BX ;解析函数功能:本质类似于⾼精度计算,将读⼊的⼀个串转成数字存储在DATA数组中分成三⼤部分⼀:输⼊提⽰⼆:错误判断及提⽰三:转化为数字L_ERROR 错误处理L_CRLF 结束处理我们来举⼀个123412341234 的例⼦Register1234AX1234BX0112123CX10101010AX+(BX∗CX)AX + (BX * CX)AX+(BX∗CX)最后将结果存储在DATA数组⾥2.实现冒泡排序冒泡排序作为⼀个简单的排序算法,时间复杂度 O(n2)O(n^2)O(n2) 需要两层循环,为了提⾼代码的可读性,我们将内层的循环写成⼀个⼦程序每次调⽤内层循环很简单,每次从头⽐到尾,遇到⽐它⼩的交换就可以了。
汇编语言课程设计报告——实现加减乘除四则运算的计算器
汇编语言课程设计报告( 2011 -- 2012 年度第 2 学期)实现加减乘除四则运算的计算器专业 计算机科学与技术 学生姓名班级学号指导教师完成日期目录目录错误!未定义书签。
1 概述错误!未定义书签。
设计目的错误!未定义书签。
设计内容错误!未定义书签。
2 系统需求分析错误!未定义书签。
系统目标错误!未定义书签。
主体功能错误!未定义书签。
开发环境错误!未定义书签。
3 系统概要设计错误!未定义书签。
系统的功能模块划分错误!未定义书签。
系统流程图错误!未定义书签。
4系统详细设计错误!未定义书签。
5 测试错误!未定义书签。
测试方案错误!未定义书签。
测试结果错误!未定义书签。
6 小结错误!未定义书签。
参考文献错误!未定义书签。
附录错误!未定义书签。
附录源程序清单错误!未定义书签。
实现加减乘除四则运算的计算器1 概述设计目的本课程设计是在学完教学大纲规定的全部内容、完成所有实践环节的基础上,旨在深化学生学习的汇编语言课程基本知识,进一步掌握汇编语言程序设计方法,提高分析问题、解决问题的综合应用能力。
设计内容能实现加、减、乘、除的计算;该程序接受的是16进制数;执行时,需要在文件名后直接跟上计算表达式,如在命令提示符下执行结果如下:c:\tasm>js 3+252 系统需求分析系统目标本次汇编语言课程设计的最终目的是要实现一个简单加减乘除四则运算的计算器,要求编写一个程序,每运行一次可执行程序,可以实现数的加减乘除四则运算。
比如,十进制数的加减乘除四则运算。
我们曾经学习过两个具体数字进行加减法运算,但是对于简单计算器用汇编语言实现难点在于这两个要做运算的数是未知的,是由自己调用中断输入到屏幕上并要用程序存储起来的数,然后才能对这两个数进行运算,而且做的是加法运算、减法运算乘法运算还是除法运算也未可知,为此我们还要判断用户所输入的运算是四则运算中的哪一个运算。
此外,运算过程中的进位或是借位,选择用什么样的方式进行输出,如何实现清屏等也是要解决的问题。
汇编语言程序设计——十个数相加
课内实践课报告
课程名称汇编语言程序设计
专业计算机科学与技术
班级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 日。
(汇编)两个多位十进制数相加的实验
实验一两个多位十进制数相加的实验一、实验目的学习数据传送和算术运算指令的用法熟悉在PC机上建立、汇编、链接、调试和运行汇编语言程序的过程。
二、实验内容将两个多位十进制数相加,要求被加数和加数均以ASCII码形式各自顺序存放在以DATA1、DATA2为首的5个内存单元中(低位在前),结果送回DATA1处。
三、程序框图四、源代码:DATAS SEGMENTDATA1 DB '97531'N EQU $-DATA1DATA2 DB '86425'RESULT DB '*****+#####=$$$$$$$' CARRY DB 0DATAS ENDSCODES SEGMENTASSUME DS:DATAS,CS:CODES ADD_PRO:MOV AX,DATASMOV DS,AXCLCMOV CX,NMOV SI,N-1MOV DI,0LOAD:MOV AH,DATA1[SI]MOV RESULT[DI],AHMOV AH,DATA2[SI]MOV RESULT[6+DI],AHDEC SIINC DILOOP LOAD ;将内存中两加数载入结果字符串中MOV CX,NMOV SI,0SUM:MOV DL,DATA1[SI]ADD DL,DATA2[SI]ADD DL,CARRYSUB DL,60HCMP DL,0AHJAE AEMOV CARRY,0JMP DOAE:SUB DL,0AHMOV CARRY,1DO:MOV DATA1[SI],DLINC SILOOP SUM ;完成加法运算,进位信息保存在CARRY中DIS_PRO:MOV SI,0CMP CARRY,0JZ ZNZ:MOV RESULT[12],'1'MOV SI,4MOV DI,0MOV CX,NNZ_COPY:MOV AH,DATA1[SI]MOV RESULT[13+DI],AHADD RESULT[13+DI],30HDEC SIINC DILOOP NZ_COPY;最高位有进位时复制结果到待输出串中情况JMP DISZ:MOV SI,4MOV DI,0MOV CX,NCOPY:MOV AH,DATA1[SI]MOV RESULT[12+DI],AHADD RESULT[12+DI],30HDEC SIINC DILOOP COPY;最高位无进位时复制结果到待输出串中情况JMP DISDIS:LEA DX,RESULTMOV AH,09HINT 21HMOV AH,4CHINT 21HCODES ENDSEND ADD_PRO五、DEBUG截图:LOAD循环执行前,内存中存储内容如下:LOAD循环执行后同时也是SUM循环执行前,内存中存储内容如下:SUM循环执行后:执行CMP CARRY,0之后,标志位如下所示,ZF=1,说明CARRY等于0,即最高位没有进位。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课内实践课报告
课程名称汇编语言程序设计
专业计算机科学与技术
班级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 日。