汇编语言编程编程练习.doc
- 格式:doc
- 大小:83.36 KB
- 文档页数:12
《汇编语言》练习题库
汇编语言是计算机硬件和软件之间的桥梁,是一种基于机器指令的
低级程序设计语言。
掌握汇编语言对于理解计算机的工作原理和进行
底层编程具有重要意义。
下面是一份《汇编语言》练习题库,旨在帮
助读者巩固和应用所学知识。
一、基础题
1. 使用汇编语言编写一个程序,实现两个数相加的功能。
2. 编写一个汇编语言程序,将一个字符串逆序输出。
3. 设计一个程序,判断一个数是否为偶数。
4. 编写一个程序,实现一个简单的计算器,可以进行加减乘除运算。
二、中级题
1. 设计一个程序,实现排序算法中的冒泡排序。
2. 编写一个汇编语言程序,判断一个字符串是否为回文串。
3. 设计一个程序,将一个数组中的奇数和偶数分别存放在两个新的
数组中。
4. 编写一个程序,实现一个简单的文本编辑器,可以实现插入、删除、替换等功能。
三、高级题
1. 设计一个程序,实现图像的旋转和缩放功能。
2. 编写一个汇编语言程序,实现一个简单的操作系统。
3. 设计一个程序,实现一个简易的数据库系统,可以进行数据的增删查改操作。
4. 编写一个程序,实现一个简单的网络聊天室。
以上是《汇编语言》练习题库的部分题目,通过做题可以提高对汇编语言的理解和应用能力。
同时,建议读者在做题的过程中,结合教材和其他学习资料,加深对汇编语言的学习和掌握。
祝愿大家在汇编语言的学习中取得优异的成绩!。
一、单项选择题(共20题)1.对于有符号的数来说,下列哪个值最大( D)A:0F8H B:11010011B C:82 D:123Q2.下列有关汇编语言中标号的命名规则中,错误的是(D )A:通常由字母打头的字符、数字串组成 B:标号长度不能超过31个字符C:?和$不能单独作为标号 D:.号不可位于标号首3.设A=0.4H,B=0.8H,C=0.4,D=0.4Q,它们之间的关系是(C )。
A.C+D=B B.A+D=BC.B=D D.A>C>D4.下列四个寄存器中,可作为十六位寄存器的是(C )A.DL B.CLC.BP D.EBX5.8088/8086存储器分段,每个段不超过( D)A.64K个字B. 32K个字节C.1兆个字节D.64K个字节6.寻址指令MOV CX, [BX + DI + 20]使用的是哪一种寻址方式( B)A:寄存器寻址B:相对基址变址寻址C:变址寻址D:基址变址寻址7.连接程序把汇编语言源程序生成的目标文件(.OBJ文件)转换成( B)。
A..OBJ文件B..EXE文件C..LST文件D..CRF文件8.在程序运行过程中,确定下一条指令的物理地址的计算表达式是( A)。
A. (CS)×16+(IP)B. (DS)×16+(DI)C. (SS)×16+(SP) D.(ES)×16+(SI)9.若AX= - 15要得到AX=15应执行的指令是(A )A.NEG AXB.NOT AXC.INC AXD.DEC AX10.8086/8088系统执行传送指令MOV时(A )A.不影响标志位B.影响DF方向标志C.影响SF符号标志D.影响CF进位标志11.执行下列程序后,(AL)=(D )H。
DATA SEGMENTTAB DB ‘0123456789’DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX, DATAMOV DS, AXMOV BX, OFFSET TABMOV AL, 04XLAT TAB…A.04 B.0400C.33 D.3412.下列指令中操作数在代码段中的是(A )。
回答问题1、什么是分时复用技术? 8086的那些引脚采用了分时复用技术?这些引脚在总线周期的T1状态传送的是什么信息?在总线周期的其他状态(T2、T3、T4)传送的是什么信息?分时复用:在不同的时刻分别传送不同的信息(地址、数据、状态信息)。
这些引脚在总线周期的T1状态传送的是地址信息。
当访问存储器时,T1状态输出A19~A16,与AD15~AD0一起构成访问存储器的20位物理地址。
在总线周期的其他状态(T2、T3、T4)传送的是数据或状态信息。
2、什么是逻辑地址与物理地址?两者的关系是什么?逻辑地址:“段地址:段内偏移地址”。
物理地址:CPU与存储器进行数据交换时在地址总线上提供的20位地址信息物理地址=段地址×10H+段内偏移地址物理地址与逻辑地址的关系:物理地址=段地址×10H+段内偏移地址3、 中断处理过程包括那些步骤?关中断保护现场开中断中断服务恢复现场中断返回4、 MUL、XLAT、SHL、ROL指令的工作过程是什么?MUL:(AX)←(SRC)*(AL) (DX:AX)←(SRC)*AXXLAT:(AL)←((BX)+(AL))SHL CF←←DST—0ROL :CF←←DST ←↓→→→↑5、串操作指令有哪5条,其有什么共同特点?MOVS LODS CMPS SCAS STOS1)总是SI寄存器寻址源操作数,DI寄存器寻址目的操作数2)每一次操作以后修改地址指针是增量还是减量取决于DF3) 有的串操作指令可加重复前缀指令按规定的操作重复进行重复操作的次数由CX寄存器决定6、 8259A中 IRR、IMR和 ISR三个寄存器的作用是什么?IRR中断请求寄存器 接受并锁存IR0~IR7的中断请求信号IMR 中断屏蔽寄存器 各级中断屏蔽ISR 中断服务寄存器 保存当前正在处理的中断请求7、定时/计数器芯片8253占用几个端口地址?各个端口地址分别对应什么?8253占用4个端口地址。
汇编语言练习题一、基础知识类1. 列出汇编语言中的寄存器及其用途。
2. 解释汇编语言中的指令格式。
3. 什么是标志寄存器?它有哪些常用的标志位?4. 描述汇编程序的基本结构。
5. 如何在汇编语言中进行数据定义?二、数据传送类1. 将AX寄存器的值传送到BX寄存器。
2. 将内存单元[1000H]的值传送到CX寄存器。
3. 将数据段中的一个字节传送到AL寄存器。
4. 实现两个内存单元之间的数据交换。
5. 将一个字的数据传送到DX和AX寄存器。
三、算术运算类1. 计算H + 5678H,并将结果存储在AX寄存器中。
2. 计算H 5678H,并将结果存储在AX寄存器中。
3. 实现16位无符号数的乘法运算。
4. 实现16位无符号数的除法运算。
5. 使用汇编语言实现一个简单的加法计算器。
四、逻辑运算类1. 对AX寄存器的值进行按位取反操作。
2. 计算H和5678H的逻辑与运算结果。
3. 计算H和5678H的逻辑或运算结果。
4. 计算H和5678H的逻辑异或运算结果。
5. 实现一个简单的逻辑表达式求值程序。
五、控制转移类1. 实现一个无条件跳转指令。
2. 根据CX寄存器的值,实现一个循环结构。
3. 使用比较指令和跳转指令实现一个简单的排序算法。
4. 编写一个程序,判断一个数是否为素数。
5. 实现一个多分支选择结构。
六、字符串操作类1. 实现将一个字符串复制到另一个内存区域。
2. 实现字符串的逆序排列。
3. 计算一个字符串的长度。
4. 比较两个字符串是否相等。
5. 在一个字符串中查找某个字符的位置。
七、中断及系统调用类1. 编写一个简单的中断处理程序。
2. 使用INT 21H中断实现屏幕输出一个字符串。
3. 使用INT 21H中断读取键盘输入的字符串。
4. 编写一个程序,实现定时器中断。
5. 使用汇编语言实现系统调用,完成文件读写操作。
八、子程序设计类1. 编写一个子程序,用于计算两个数的最大公约数。
2. 实现一个子程序,能够将十进制数转换为十六进制数。
AREA TEST1,CODE,READONL Y ;声明代码段TEST1ENTRY ;标识程序入口CODE32 ;声明32位ARM指令;立即寻址MOV R0,#0X01 ;对R0赋值ADD R0,R0,#01 ;R0=R0+0x01ADD R0,R0,#0X2a ;R0=R0+0x2aEND练习二:寄存器寻址AREA TEST1,CODE,READONL Y ;声明代码段TEST1ENTRY ;标识程序入口CODE32 ;声明32位ARM指令;寄存器寻址START MOV R0,#0X02MOV R1,#0X03MOV R2,#0X04ADD R0,R1,R2END练习三:寄存器移位寻址AREA TEST1,CODE,READONL Y ;声明代码段TEST1ENTRY ;标识程序入口CODE32 ;声明32位ARM指令;寄存器移位寻址STARTMOV R0,#2MOV R1,#2MOV R2,#2MOV R3,#2MOV R0,R2,LSL #3ADDS R0,R1,R2,LSL #R3B STARTEND练习四:寄存器间接寻址AREA TEST1,CODE,READONL Y ;声明代码段TEST1ENTRY ;标识程序入口CODE32 ;声明32位ARM指令;寄存器间接寻址START MOV R0,#3MOV R0,R0,LSL #3LDR R1,[R0]SWP R1,R1,[R0]B STARTENDAREA TEST1,CODE,READONL Y ;声明代码段TEST1ENTRY ;标识程序入口CODE32 ;声明32位ARM指令;基址变址寻址STARTMOV R0,#0X00MOV R3,#0X03MOV R4,#0X04MOV R5,#0X05MOV R10,#0X10LDMIA R0!,{R1-R3,R12}MOV R1,#0X10STMIA R1!,{R3-R5,R10}B STARTEND练习六:堆栈寻址AREA TEST1,CODE,READONL YENTRYCODE32START MOV R0,#0X01MOV R1,#0X02MOV R2,#0X03MOV R3,#0X04MOV R4,#0X05MOV LR,#0X06MOV SP,#0X20STMFD SP!,{R0-R4,LR}LDMFD SP!,{R0-R4,LR}B STARTEND练习七汇编加法练习AREA TEST1,CODE,READONL YENTRYCODE32START MOV R0,#05MOV R1,#09LOOP BL ADD_SUBB LOOPADD_SUB ADDS R0,R0,R1MOV PC,LREND。
汇编语言程序设计练习题1. 逆序输出字符串“BASED ADDRESSING”。
2. 从键盘上输入2个一位数,求出它们的和(假设和不超过1位)。
3. 试编写一段程序,要求在长度为100H字节的数组中,找出大于42H的无符号数的个数并存入字节单元UP中;找出小于42H的无符号数的个数并存入字节单元DOWN中。
4. 试编写一段程序,要求对键盘输入的小写字母用大写字母显示出来。
5. 编写程序,从键盘接收一个小写字母,然后找出它的前导字符和后续字符,再按顺序显示这三个字符。
6. 编写程序,将一个包含有20个数据的数组M分成2个数组:正数数组P和负数数组N,并分别把这两个数组中数据的个数显示出来。
7. 试编写一段程序,求出首地址为DATA的100D字数组中的最小偶数,并把它存放在AX中。
8. 试编写一段程序,要求比较两个字符串string1和string2所含字符是否相等,如相等则显示“MATCH”, 若不相同则显示“NO MATCH”。
9. 试编写一段程序,从键盘接收一个四位的十六进制数,并在终端上显示与它等值的二进制数。
10. 从键盘上输入一系列以$为结束符的字符串,然后对其中的非数字字符计数,并显示计数结果。
11.有一个首地址为mem的100个字的数组,试编制程序删除数组中所有为零的项,并将后续项向前压缩,最后将数组的剩余部分补上零。
12.从键盘上输入一串字符(用回车键结束,使用10号功能调用。
)放在STRING中,试编制一个程序测试字符串中是否存在数字。
如有,则把CL的第5位置1,否则将该位置置0。
13.在首地址为DATA的字数组中,存放了100H个16位补码数,试编写一个程序,求出它们的平均值放在AX寄存器中;并求出数组中有多少个数小于此平均值,将结果放在BX 寄存器中。
14. 已知数组A包含15个互不相等的整数,数组B包含20个互不相等的整数。
试编制一个程序,把既在A中又在B中出现的整数存放于数组C1中。
《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=0 1.6下列各数为十六进制表示的8位二进制数,请说明当它们分别被看作是用补码表示的带符号数或无符号数时,它们所表示的十进制数是什么?(1) D8 (2) FF答:(1) D8H表示的带符号数为-40,D8H表示的无符号数为216;(2) FFH表示的带符号数为-1,FFH表示的无符号数为255。
汇编语言典型例题汇编语言是一种底层的编程语言,它直接操作计算机硬件,并且与特定的计算机体系结构密切相关。
本文将介绍一些汇编语言的典型例题,帮助读者更好地理解和掌握这门编程语言。
例题一:计算两个数的和要求:编写一段汇编语言程序,计算两个32位有符号整数的和,并将结果存储在一个指定的寄存器中。
解决方案:```assemblysection .datanum1 dd 10num2 dd 20sum dd 0section .textglobal _start_start:mov eax, [num1]add eax, [num2]mov [sum], eax; 以下为输出结果的代码,具体实现方式与平台相关,这里不做详细展示...```例题二:判断一个数是否为负数要求:编写一段汇编语言程序,判断一个16位有符号整数是否为负数,如果是负数,则将其变为正数。
解决方案:```assemblysection .datanum dw -10section .textglobal _start_start:mov ax, [num]cmp ax, 0jnl positiveneg axpositive:; 此处可添加自定义逻辑,对正数进行处理; 以下为输出结果的代码...```例题三:字符串反转要求:编写一段汇编语言程序,将一个以0结尾的字符串进行反转,并输出反转后的字符串。
解决方案:```assemblysection .datastr db 'Hello, World!', 0len equ $ - strsection .textglobal _start_start:mov ecx, len - 1mov esi, 0mov edi, ecxreverse_loop:cmp esi, edijge print_reversemov al, [str+esi]mov ah, [str+edi]mov [str+esi], ahmov [str+edi], alinc esidec edijmp reverse_loopprint_reverse:; 以下为输出结果的代码...```通过以上例题的介绍,希望读者能对汇编语言的基本应用有一定的了解和掌握。
汇编语言编程编程练习一、实验题1.非数值运算编程(a)实验目的通过非数值运算(如统计,分类,排序,代码转换等)编程,进一步掌握8086/8088 汇编语言程序设计方法和技巧(b)实验内容·统计设有100H个数,编程统计正数、负数和零的个数。
实验分析:程序中数的总数很多,某些部分需要重复执行,因此要用到循环结构。
循环结构每次测试循环条件,当满足条件时,重复执行这一段程序;否则循环结束,顺序往下执行。
其次,要统计正数、负数、零的个数,可以依靠标志位SF进行判断,SF=0,正数;SF=1,负数;零则为总数减去正负数的个数。
该程序流程图如下:开始初始化:设置缓冲区BUFF指针BX,设定循环次数256,统计计数器DL清零执行:从BUFF取数,进行算术运算,判断符号标志位SF修改:移动缓冲区指针,循环次数减一NO循环控制:CX=0YES结束:将寄存器的统计结果存入MEM单元,将控制交操作系统程序如下所示:STACK SEGMENT STACKDW 128 DUP(?)STACK ENDSDA TA SEGMENTBUFF DB 256 DUP(?)MEM1 DB ?MEM2 DB ?MEM3 DB ?DA TA ENDSCODE SEGMENTASSUME CS:CODE,DS:DA TA START:MOV AX,DATAMOV DS,AXMOV CX,256LEA BX, BUFFXOR DL,DLXOR DH,DHXOR SI,SI ;统计计数器清0NEXT:MOV AL,[BX];取数据到ALADD AL,0 ;做运算,影响标志位SFJNS AA1 ;是正数,跳到AA1INC DL ;是负数,统计加1AA1: INC DH ;是正数,加1INC BX ;移动指针LOOP NEXT ;循环控制MOV MEM1,DLMOV MEM2,DHMOV MEM3,SI ;保存统计结果MOV AX,4C00HINT 21HCODE ENDSEND START·代码转换编程将组合的BCD码9649转换成二进制数,考虑采用(((A*10)+B)*10)+C)*10+D 的算法。
实验分析:由学习已知,写成十六进制的BCD码和十进制码是完全一样的,比如,75D= (01110101)BCD,而(01110101)B=75H。
BCD码的运算也遵循十进制运算规则,这一点可以方便计算机本身擅长的二进制运算结合BCD码的调整指令来完成。
本题中,由于9469H计算机会默认为二进制数。
因而,我们首先要做的是将9469h BCD 码先转换成十进制数,计算机将会以二进制形式存储。
最后再辅助程序令其输出在屏幕上。
实验大抵流程如下:开始初始化:设定字节空间……执行:BCD码转化成十进制二进制码输出结束实验代码如下:DA TAS SEGMENTbuffer1 DW 9649hbuffer2 DW ? ;分配两个字节的空间DA TAS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATASSTART: MOV AX,DATASMOV DS,AXmov ax,[buffer1]and ax,0f000hmov cl,12shr ax,clmov dx,ax ;至此,已将9649h(BCD)中的9(十进制)取出,并放入dx中call change ;调用chang,将9乘以10mov ax,dxmov bx,[buffer1]and bx,0f00hmov cl,8shr bx,cladd ax,bxmov dx,axcall changemov ax,dxmov bx,[buffer1]and bx,00f0hmov cl,4shr bx,cladd ax,bxmov dx,axcall changemov ax,dxmov bx,[buffer1]and bx,000fhadd ax,bx ;至此,ax中的值已是9649(十进制),但电脑是将其以二进制的形式存储的,故应是25B1h,二进制就是0010010110110001mov buffer2,ax ;因为后面会用到ah,为避免在其过程中丢失ax中的数据,故将ax 中的数据放入buffer2中mov cx,16again:shl buffer2,1 ;将已经转换成二进制的数逐个显示出来mov dl,0adc dl,30hmov ah,2int 21hloop againmov ah,4CHINT 21Hchange proc ;子程序change的功能是实现dx乘以10add dx,dxmov cx,dxadd dx,dxadd dx,dxadd dx,cxretchange ENDPCODES ENDSEND START·排序将80H个无符号的八位二进制数按递增方式排列。
同时考虑它们有符号数、递减等方式。
实验分析:实验要求将数排序,则用CMP比较两个数大小,用标志位JNG(有符号位不大于),JGE(有符号位不小于),JAE(无符号位不低于)来判定排序种类。
准备将该题用“冒泡排序法”,将其两两比较。
前一个数较大(递减),则不会改变原来位置;否则,两数交换,依次将全部数据排序依次(小循环)。
示例如下:13 -39 96 84 -75 5813 96 84 -39 58 -7596 84 13 58 -39 -7596 84 58 13 -39 -75不过,由于数据的原始情况不知,按以上方法排序一次不一定符合要求。
本题采取多次小循环方法,用数据个数控制循环次数。
这种方法效率低,不过在循环次 数较少的情况下还是很简单的,毕竟原理很简单。
该程序流程图如下:NOYESNOYES进入小循环直到数按照从大到小的顺序排列好为止。
附程序如下:1)、无符号位从小到大:开始初始化:初始化数据段,设定循环次数执行:采用变址寻址,将前数与后数比较前数>后数 前后数交换位置地址加一 将结果写入缓冲区 CX>数据总数 结束进入下一循环STACK SEGMENT STACKDW 64 DUP(?)STACK ENDSDA TA SEGMENTBUFF DB 128 DUP(?)COUNT EQU $-BUFF ;等值命令DA TA ENDSCODE SEGMENTASSUME CS:CODE,DS:DA TASTART:MOV AX,DATAMOV DS,AXMOV CX,COUNT-1LOOP1:MOV DX,CX ;保存循环次数MOV SI,0 ;采用变址寻址LOOP2:MOV AL,BUFF[SI]CMP AL,BUFF[SI+1];前数与后数比JNA COT ;前个数小于(或等于),转(无符号)XCHG AL,BUFF[SI+1];否则交换内存位置MOV BUFF[SI],ALCOT: INC SILOOP LOOP2 ;所有数据排列一次MOV CX,DX ;开始下一次排序LOOP LOOP1MOV AX,4C00HINT 21HCODE ENDSEND START2)、无符号位从大到小STACK SEGMENT STACKDW 64 DUP(?)STACK ENDSDA TA SEGMENTBUFF DB 128 DUP(?)COUNT EQU $-BUFF ;等值命令DA TA ENDSCODE SEGMENTASSUME CS:CODE,DS:DA TASTART:MOV AX,DATAMOV DS,AXMOV CX,COUNT-1LOOP1:MOV DX,CXMOV SI,0LOOP2:MOV AL,BUFF[SI]CMP AL,BUFF[SI+1]JNG COT ;前个数小于(或等于),转(有符号)XCHG AL,BUFF[SI+1]MOV BUFF[SI],ALCOT: INC SILOOP LOOP2MOV CX,DXLOOP LOOP1MOV AX,4C00HINT 21HCODE ENDSEND START3)、有符号位递减STACK SEGMENT STACKDW 64 DUP(?)STACK ENDSDA TA SEGMENTBUFF DB 128 DUP(?)COUNT EQU $-BUFF ;等值命令DA TA ENDSCODE SEGMENTASSUME CS:CODE,DS:DA TASTART:MOV AX,DATAMOV DS,AXMOV CX,COUNT-1LOOP1:MOV DX,CXMOV SI,0LOOP2:MOV AL,BUFF[SI]CMP AL,BUFF[SI+1]JGE COT ;前个数大于(或等于),转(有符号)XCHG AL,BUFF[SI+1]MOV BUFF[SI],ALCOT: INC SILOOP LOOP2MOV CX,DXLOOP LOOP1MOV AX,4C00HINT 21HCODE ENDSEND START2、数值运算编程(a)实验目的通过编程及程序调式,熟悉8086/8088 运算指令及DEBUG 动态调试程序的方法(b)实验内容·无符号二进制数运算已知有20 个8 位的无符号二进制数,编一个程序完成对这些数的求和。
实验分析:求20个无符号的八位二进制数,直接进行二进制运算要将数值转换成二进制形式比较繁琐。
由此想到写成十六进制的BCD码和十进制码是完全一样的,比如,75D= (01110101)BCD,而(01110101)B=75H。
BCD码的运算也遵循十进制运算规则,这一点可以方便计算机本身擅长的二进制运算结合BCD码的调整指令来完成。
将输入的20个无符号八位二进制数看成BCD码的十六进制表示,直接进行BCD加法运算。
最终将结果转换成以ASCII码形式输出,即为所得数的十六进制BCD码形式。
流程图略。
实验代码如下(参考):STACK SEGMENT STACK 'STACK' ; STACK SEGMENTDW 128 DUP(?) ; 128 WORDSSTACK ENDS ; SEGMENT ENDDA TA SEGMENT PARA 'DATA' ; DATA SEGMENTTABLE DB 01,02,03,04,05,06,07,08,09,10,11,12,13,14,15,16,17,18,19,20TOTAL DW ? ;BCD 加法运算结果PRINT DB ? ;显示的ASCII 字符DA TA ENDS ; SEGMENT ENDCODE SEGMENT PARA 'CODE'ASSUME CS:CODE, DS:DATA, SS:STACKMAIN PROC FARPUSH DSSUB AX,AXPUSH AX ;DS:0000为返回地址MOV AX,DATAMOV DS,AX ;DS初始化MOV AX,0LEA BX,TABLE ;DS:BX指向TABLE的首地址MOV CX,20 ;循环20次SUM: ADD AL,[BX]JNC OVERINC AHCLCOVER: INC BXLOOP SUMMOV TOTAL,AXMOV CX,0010LEA SI,PRINT+3L20: CMP AX,CX ;值<10?JB L30 ;是,退出XOR DX,DX ;清除高位商DIV CX ;除以10OR DL,30HMOV [SI],DL ;存ASCII 字符DEC SIJMP L20L30: OR AL,30H ;存最后的商MOV [SI],AL ;作为ASCII 字符MOV AH,02H ;打印算术结果; MOV CX,4LEA DI,PRINTL10: MOV DL,[DI]INT 21HINC DILOOP L10MOV AX,4C00HINT 21HMAIN ENDPCODE ENDSEND MAIN·BCD算术运算已知两个6 位的BCD 码,完成减法运算,设被减数为123456,减数为789123 实验分析:本题中先做减法,再采用未组合的BCD码减法调整,从低位开始逐位做减法运算。