资源描述
微机原理和汇编语言复习资料
一、选择题(30分)
1.已知X=76,则[X]补=( )
A.76H B.4CH C.0BCH D.0CCH
2.已知[X]补=80H,则X=( )
A.80H B.0 C.0FFH D. -80H
3.已知X=78,Y=-83,则[X+Y]补=( )
A.0F5H B.0A1H C.0FBH D.65H
4.下列为补码表示,其中值最大的是( )
A.10001000 B.11111111 C.000000000 D.00000001
5.十六进制数88H,可以表示成下面几种形式,请找出错误的表示( )
A.无符号十进制数136 B.带符号十进制数-120
C.压缩BCD码十进制数88 D.8位二进制数-8的补码
6.在微机系统中分析并控制指令执行的部件是( )
A.寄存器 B.数据寄存器 C.CPU D.EU
7.在计算机的CPU中执行算术逻辑运算的部件是( )
A.ALU B.PC C.AL D.AR
8.执行指令PUSH CX后堆栈指针SP自动( )
A.+2 B.+1 C.-2 D.-1
9.在标志寄存器中表示溢出的标志是( )
A.AF B.CF C.OF D.SF
10.若计算机字长16位,则无符号整数表示的范围用十六进制表示为( )
A.8000H~FFFFH B.0000H~7FFFH
C.0000H~FFFFH D.0001H~FFFFH
11.设物理地址(10FF0H)=10H,(10FF1H)=20H,(10FF2H)=30H,从地址10FF1H中取出一个字的内容是( )
A.1020H B.3020H C.2030H D.2010H
12.某数据段存储单元的偏移地址为2200H~31FFH,则其存储空间大小是( )
A.2K B.4K C.8K D.16K
13.在8086CPU标志寄存器中,ZF=1表示( )
A.结果有进位 B.结果为0 C.结果溢出 D.结果为负
14.两个操作数运算时,下列哪种情况会发生溢出( )
A.两个负数相加,结果为负 B.两个正数相加,结果为负
C.一正一负相加,结果为负 D.两个正数相加,结果为正
15.堆栈段的逻辑地址由( )组成
A.DS:BX B.ES:DI C.CS:IP D.SS:SP
16.代码段某单元的逻辑地址为3458H:2C92H,其物理地址为( )
A.37212H B.26FF2H C.34580H D.32C92H
17.在8086系统中,数据寄存器组为( )
A.SI,DI,SP,BP B.AX,BX,CX,DX
C.CS,DS,ES,SS D.CF,SF,ZF,OF
18.指令MOV AX,DS:[1000H]中源操作数的寻址方式是( )
A. 立即寻址 B.直接寻址
C.寄存器寻址 D.基址变址寻址
19.指令MOV DX,COUNT[BP][DI]的执行结果是( )
A.将COUNT的值传送给DX
B.将COUNT+BP+DI的值传送给DX
C.将数据段中有效地址为COUNT+BP+DI的存储单元的值传送给DX
D.将堆栈段中有效地址为COUNT+BP+DI的存储单元的值传送给DX
20.若(AX)=2530H,(BX)=18E6H,MOV [BX],AL指令正确的执行结果为( )
A.BX寄存器的值为2530H B.BL寄存器的值为30H
C.18E6H单元的值为30H D.18E6H单元的值为2530H
21.指令MOV AX,COUNT[BX]完成的操作是( )
A.从存储单元读出一个字送入AX B. 从存储单元读出一个字节送入AX
C.将AX中的一个字写入存储单元 D. 将AX中的一个字节写入存储单元
22.一条指令中目的操作数不允许使用的寻址方式是( )
A.寄存器寻址 B.立即寻址 C.变址寻址 D.寄存器间接寻址
23.用直接寻址将AL的内容保存到16号单元,可以用( )指令
A.MOV DS:[0016H],AL B.MOV AL,DS:[0016H]
C.MOV DS:[0010H],AL D.MOV AL,DS:[0010H]
23.经过汇编产生的二进制目标文件是( )
A. .ASM B. .OBJ C. .EXE D. .MAP
24.不能用MOV指令赋初值的段寄存器是( )
A.DS B.ES C.CS D.SS
25.在COUNT DB 5 这条存储单元定义伪指令中,COUNT称为( )
A.助记符 B.变量 C.符号 D.标号(带冒号的)
26.将字符串“INPUT”保存到存储单元MESS,正确的伪指令是( )
A.INPUT DB MESS B.MESS DB INPUT
C.INPUT DB ‘MESS’ D.MESS DB ‘INPUT’
27.若X已经定义为字型,可以用( )改变X为字节型
A.BYTE PTR X B.OFFSET X C.TYPE X D.LABLE X
28.INC WORD PTR [BX]指令中的操作数的数据类型是( )
A.字节 B.字 C.双字 D.四字
29.ABC DW 1,$+2,5,7 ,其中$代表( )
A.当前的偏移地址值为0 B. 当前的偏移地址值为1
C.当前的偏移地址值为2 D. 当前的偏移地址值为3
30.( )可用来指出一条汇编指令所在存储单元的符号地址
A.变量 B.数组名 C.标号 D.偏移值
31.汇编语言中存储单元的属性不能是( )
A.字符CHAR型(无字符型) B.字节BYTE型 C.字WORD型 D.双字DWORD型
32.用指令MOV BX,SEG COUNT可以得到存储单元COUNT的( )
A.物理地址 B.段地址 C.偏移地址 D.属性
33.下列指令中,有错误的是( )
A.MOV AH,BL B.MOV DS,AX C.MOV CL,DX D.MOV SI,90
34.若AX=1E30H,BX=12E4H则ADD AL,BL的执行结果为AL和CF的值是( )
A.14H,0 B.24H,0 C.14H,1 D.24H,1
35.若BL=83H,CF=1,则ADC BL,90H执行后,AH=( )
A.14H B.15H C.16H D.17H
36.若DX=1010H,BX=0923H,则SUB DX,BX的执行结果为( )
A.168DH B.06EDH C.F6DDH D.0087H
37.从键盘输入一串字符使用DOS功能调用( )
A.1号功能 B.2号功能 C.9号功能 D.10号功能
38.DOS功能调用中,功能号应写入( )寄存器中
A.AL B.AH C.DL D.DH
39.显示一个字符的DOS功能调用要求将字符放入( )
A.DS:DX B.DS:BX C.BL D.DL
40.获得BUFFER单元有效地址的汇编指令为( )
A.MOV BX,BUFFER B.LEA BX,BUFFER
C.MOV BX,[BUFFER] D.LDS BX,BUFFER
41.关于字节乘法的指令错误的说法是( )
A.被乘数隐含在AL中 B.乘数和被乘数都是字节型
C.被乘数隐含在AX中 D.乘积是字型
42.关于字除法错误的说法是( )
A.16位被除数AX与8位源操作数相除
B. 32位被除数DX:AX与16位源操作数相除
C.商在AX寄存器,余数在DX寄存器中
D.带符号除法的商和余数都是补码表示的数
43.在分支指令中,利用符号进行判断的指令是( )
A.JC B.JS C.JZ D.JO
44.在执行条件转移指令前,不能形成条件的指令是( )
A.CMP B.SUB C.AND D.MOV
45.在条件转移指令中,结果不为0则转移的指令是( )
A.JNS B.JZ C.JS D.JNZ
46.两个带符号数比较,不大于则转移的指令是( )
A.JLE B.JBE C.JL D.JAE
47.带符号数乘以2的操作可以用( )移位指令实现
A.SAL AL,1 B.SAL AL,2 C.SHR AL,1 D.ROL AL,2
48.将AL的2、6位屏蔽为0,其余位保持不变,指令为( )
A.ADN AL,42H B.AND AL,0BBH C.OR AL,26H D.ADD AL,0FBH
49.将AL的第4位置1,其余位不变,指令为( )
A.OR AL,40H B.AND AL,40H C.OR AL,10H D.AND AL,1FH
50.将AL清0的指令为( )
A.AND AL,AL B.OR AL,0 C.XOR AL,AL(自身异或) D.XOR AL,0
51.将键盘输入的小写字母变为大写,用指令( )
A.AND AL,20H B.AND AL,0DFH C.OR AL,20H D.0R AL,0DFH
52.用户程序中数据段的段基址,用( )指令给出
A.MOV AX,CODE B.MOV CS,CODE C.MOV CS,DATA D.MOV AX,DATA
MOV CS,AX MOV DS,CS MOV DS,CS MOV DS,AX
53.下列描述错误的是( )
A.LOOP指令以CX为循环控制计数器
B.LOOPE指令循环的条件是CX≠0且ZF=0
C.LOOPE指令循环的条件是CX≠0且ZF=1
D.LOOPNE指令循环的条件是CX≠0且ZF=0
54.串处理操作需要循环重复执行,( )不能出现在串处理指令中
A.REP B.REPZ C.REPNZ D.LOOP
55.在串传送指令中,串的传送方向由( )标志位决定
A.DF B.CF C.ZF D.OF
56.循环指令LOOP可以实现( )的循环
A.循环次数已知 B.循环次数未知
C.循环次数累加 D.循环次数不变
57.在多重循环程序中,从外循环再次进入内循环时,内循环( )
A.不必考虑 B.重新赋值 C.置0 D.置1
58.循环指令的控制条件除CX之外,还可以把标志位( )作为控制条件
A.CF B.SF C.ZF D.OF
59.下列指令不能构成循环的是( )
A.JMP B.JNZ C.LOOP D.DEC CX
60.在串处理指令中,设置方向标志为1的指令是( )
A.STD B.CLD C.HLT D.CWD
61.如果子程序的属性为FAR,下列说法错误的是( )
A.可以段内直接调用 B.可以段间间接调用
C.可以段间直接调用 D.只能段间调用
62.在子程序调用过程中,断点指的是( )
A.CALL指令本身 B.CALL的下一条指令
C.CALL的下一条指令的地址 D.子程序名
63.执行CALL SUB1指令后,完成的操作是( )
A.将SUB1的偏移地址入栈保护 B.将断点的偏移地址入栈保护
C.将断点的偏移地址送IP D.将SUB1的段地址送CS,偏移地址送IP
64.子程序的属性是用( )定义的
A.CALL B.PROC C.FAR D.RET
65.执行段间返回RET指令时,从堆栈中( )
A.先弹出断点的偏移地址,再弹出段基址 B.先弹出断点的段基址,再弹出偏移地址
C.弹出断点的偏移地址 D.弹出断点的段基址
66.子程序结构中,保存现场指的是( )
A.保存CALL指令 B.保存断点的地址
C.保存主程序用到的寄存器 D.保存子程序用到的寄存器
67.CALL和RET指令的用法,正确的说法是( )
A.CALL和RET指令都对堆栈操作 B.只有CALL指令使用堆栈
C.只有RET指令使用堆栈 D.CALL和RET指令都不使用堆栈
68.CALL和RET指令对堆栈操作,正确的说法为( )
A.CALL指令从堆栈中取出子程序的地址 B.RET指令从堆栈中取出子程序的地址
C.CALL指令从堆栈中取出断点的地址 D.RET指令从堆栈中取出断点的地址
69.执行CALL FAR PTR SUBR2指令时,正确的说法是( )
A.先将断点的段地址入栈,再将偏移地址入栈
B.先将断点的偏移地址入栈,再将段地址入栈
C.先将SUBR2的段地址入栈,再将偏移地址入栈
D.先将SUBR2的偏移地址入栈,再将段地址入栈
70.用CALL指令调用子程序时,从子程序返回到主程序( )
A.用JMP指令 B.用INT 21H指令
C.用RET指令 D.可以用RET,也可以用JMP
71.在用CALL指令实现子程序嵌套调用时,子程序的RET指令( )
A.返回到最初始的调用程序中 B.返回到上一级调用程序中
C.可以换为JMP指令返回 D.可以不用
72.子程序参数传递时,用存储单元传参方式,( )
A.只能主程序访问传参单元 B. 只能子程序访问传参单元
C. 主程序和子程序都能访问传参单元 D.主程序读传参单元,子程序写传参单元
73.用寄存器传参,在子程序做现场保护时,( )
A.传参寄存器必须保存 B.传参寄存器不必保存
C.传参寄存器可以改写 D.根据情况确定保存与否
74.如果在子程序中进行了现场保护,那么子程序( )
A.恢复现场在RET指令之前 B.恢复现场在RET指令之后
C.直接用RET指令返回 D.直接用JMP指令返回
75.有关宏的作用,下列说法不正确的是( )
A.宏可以被多次调用 B.宏调用时不用保持断点
C.宏定义体中不可以有标号 D.宏展开是汇编程序完成的
76.宏调用是通过( )实现的
A.汇编指令 B.宏指令 C.宏展开 D.机器指令
77.宏定义的伪指令是( )
A.PROC ……. ENDP B.MACRO ……. ENDM
C.SEGMENT …… ENDS D.STRUC …… ENDS
78.宏与子程序的区别是( )
A.宏可以被多次调用 B.宏是一段程序
C.宏可以实现参数传递 D.宏调用时不用返回
79.80X86系统中,CPU是通过( )获取硬件可屏蔽中断发生的
A.INTR引脚 B.NMI引脚 C.中断允许标志IF D.INT n指令
80.CPU对软件中断的处理,下列说法正确的是( )
A.中断允许标志IF必须为1
B.通过8255A中断控制器管理中断
C.不需要得知中断类型号
D.执行INT n指令时立即转入中断处理
81.在中断处理系统中,中断向量指的是( )
A.中断类型号 B.中断子程序 C.中断子程序的入口地址 D.中断源
82.有关中断向量表的说法正确的是( )
A.中断向量表就是中断向量
B.中断向量表中保存的是中断向量
C. 中断向量表中保存的是中断类型号
D. 中断向量表中保存的是中断子程序
83.在80X86中断系统中,中断优先级最高的是( )
A.可屏蔽中断 B.非屏蔽中断 C.内部中断 D.单步中断
84.8086系统的中断向量表位于( )
A.内存的0~255号字节单元 B.BIOS的ROM中
C.硬盘的0~255号字节单元 D.系统的CMOS中
85.当硬件中断发生时,CPU通过( )获取中断类型号
A.INTR引脚 B.INT n指令 C.数据总线 D.中断源
86.在8086指令系统中,取出中断向量的指令是( )
A.MOV AH,35H B.MOV AH,25H C.MOV AH,31H D.MOV AH,4CH
INT 21H INT 21H INT 21H INT 21H
87.编写中断子程序时,下列说法错误的是( )
A.允许中断嵌套 B.不允许开中断
C.应该保护和恢复现场 D.必须用IRET指令返回
88.中断调用和子程序调用过程相同的是( )
A.保护断点 B.保存标志寄存器
C.将IF和TF清零 D.中断源有优先级
89.BIOS中断设置位置的指令是( )
A.MOV AH,01H B.MOV AH,02H C.MOV AH,01H D.MOV AH,02H
INT 10H INT 10H INT 21H INT 21H
90.BIOS中断从键盘读入一个字符的指令是( )
A.MOV AH,00H B.MOV AH,01H C.MOV AH,00H D.MOV AH,01H
INT 10H INT 10H INT 16H INT 21H
91.BIOS中断显示一个字符串的指令是( )
A.MOV AH,0EH B.MOV AH,13H C.MOV AH,02H D.MOV AH,09H
INT 10H INT 10H INT 21H INT 21H
92.DOS中断读取系统时间的指令是( )
A.MOV AH,1CH B.MOV AH,2CH C.MOV AH,1CH D.MOV AH,2CH
INT 10H INT 16H INT 21H INT 21H
1.P30习题2.3
8086/8088系统中存储器的逻辑地址和物理地址之间有什么关系?表示的范围各为多少?
答:8086/8088CPU有20根地址线,可以直接寻址1MB的存储空间,其地址范围为:0~220-1,用十六进制表示是:00000H~FFFFFH,与存储单元一一对应,称为存储单元的物理地址。
由于8086/8088CPU内部寄存器都是16位的,它只能处理16位的二进制数。为了能够提供20位的物理地址,系统采用了将存储器分段的方法,具体采用的方法是将1MB存储空间按64KB的大小分成16个段,每个段的起始地址由段寄存器来确定,由指令提供一个存储单元相对于起始地址的16位偏移量。这样系统就将整个1MB的存储空间分为16个互相不重叠的逻辑段了,每个段的地址范围是:0~216,也就是:0000H~FFFFH
逻辑地址是在程序中使用的地址,它由段的起始地址和偏移地址(偏移量)两部分组成(都是16位),逻辑地址的表示为“段地址:偏移地址”。
物理地址与逻辑地址的关系是: 物理地址=段地址X16+偏移地址
2.P30习题2.6
AX、BX、CX、DX能用来存放偏移地址吗?哪些可以?哪些不可以?
答:这四个都是通用数据寄存器,他们可以以字(16位)的形式访问(AX、BX、CX、DX),也可以以字节(8位)形式进行访问(AL、AH、BL、BH、CL、CH、DL、DH)。其中AX称为累加器,BX称为基址寄存器,CX称为计数器,DX称为数据寄存器。
四个寄存器中只有BX可以用来存放偏移地址,其他三个都不能用于存放偏移地址。
3. P30习题2.12
8086有哪4种逻辑段?各逻辑段分别是什么用途?
答:8086为了达到寻找1MB的目的,将1MB的空间分成64K大小的逻辑段,在8086CPU内有四个寄存器:CS、DS、SS、ES,分别用来存放代码段、数据段、堆栈段和附加段的段基址。
代码段用来存放程序的指令序列。
数据段用于存储程序运行所需要的各种原始数据、中间结果和最后结果。
堆栈段是按“后进先出、先进后出”原则组织的一段特殊的存储区域,计算机在进行子程序调用和中断时,都会用到堆栈段。
附加段的作用与数据段基本相同,也用来保存数据。
4. P96习题3.1
8086指令系统可以处理哪些数据类型?
答:8086指令系统可以处理的数据,
按照存放的位置不同可以分为:寄存器中的数据、内存中数据和I/O端口的数据;
按照数据的长度不同可以处理:8位和16位的二进制数;
按照存储大小不同可以处理:字节类型和字类型的数据。
5.P167习题5.6
请说明堆栈段的作用,在程序中是否一定要定义堆栈段,如果定义的话用什么方法定义,请举例说明。
答:堆栈段是一个特殊的段,在程序中可以定义它,也可以不定义它。除了要生成COM型执行文件的源程序,一个完整的源程序一般最好定义堆栈段。如果在程序中不定义堆栈段,那么,操作系统在装入该执行程序时将自动为其指定一个64KB的堆栈段。
在源程序中定义堆栈段的方法有2种:
方法1:STACK1 SEGMENT
DB 256 DUP(?)
TOP LABLE WORD
STACK1 ENDS
方法2:
STACK1 SEGMENT STACK
DB 256 DUP(?)
STACK1 ENDS
在方法1中定义之后必须在代码段中的ASSUME语句中包含:SS:STACK1,而方法2就不用在ASSUME语句中进行说明。
6. P185习题6.7
在子程序中常用的参数传递方法有哪些?
答:参数传递必须事先约定,子程序根据约定从存储器或存储单元取原始数据(入口参数),进行处理后将处理结果(出口参数)送到约定的寄存器或存储单元,返回主程序。子程序调用时常用的参数传递方法有三种:
1、用寄存器传递:适用于参数传递较少的情况,传递速度快;
2、通过地址表传送参数地址:适用于参数较多的情况,但传递速度较慢;
3、用堆栈传递:适用于传递参数较多,存在嵌套或递归调用的情况。
7. P185习题6.4
简述段内和段间子程序调用指令CALL的主要区别。
答:CALL指令有两种格式,分别用于段内和段间子程序的调用。
1、段内调用的格式是: CALL NEAR PTR 子程序名(或CALL 子程序名)
指令执行的操作:返址(返回的地址,也称断点)入栈:
①(SP)←(SP)-2;
②((SP)+1,(SP))←(IP)
转子程序:(IP)←(IP)+16位偏移地址(偏移量)
2、段间调用的格式是:CALL FAR PTR 子程序名
指令执行的操作:返址(返回的地址,也称断点)入栈:
①(SP)←(SP)-2;
②((SP)+1,(SP))←(CS)
③(SP)←(SP)-2;
④((SP)+1,(SP))←(IP)
转子程序:(IP)←子程序入口地址的偏移地址
(CS)←子程序入口地址的段基址
从上面两种调用可以看出,段内调用不需要把CS的值保存到栈区,因为子程序和主程序在同一个段内;而段间调用要把CS和IP同时保存到栈区,以便子程序返回时能够根据CS和IP的值准确地计算出断点的地址值。
8. P215习题8.3
什么是中断?中断向量表有什么作用?
答:中断是一种CPU中止正在执行的程序而转去处理特殊事件的操作。这些引起中断的事件称为中断源,中断处理过程一般包括:中断请求、中断响应、中断处理和中断返回四个步骤。
中断向量表是中断服务程序入口地址的偏移值和段基址,一个中断向量占4个字节空间,它是中断源的识别标志,可用来形成相应的中断服务程序的入口地址或存放中断服务程序的首地址。
四、填空题(20分)
1.P146:例5.7
已知某班学生的计算机成绩按学号从1开始按小到大的顺序排列在TAB表中,假定要查询的学生的学号放在变量NO中,请将查询的学生成绩放在ENGLISH中,程序如下:
INCLUDE PRINT.ASM
DATAS SEGMENT
TAB DB 80,85,86,71,79,96
DB 83,56,32,66,78,84
NO DW 8
ENGLISH DB ?
DATAS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS
START:
MOV AX,DATAS
MOV DS,AX
MOV BX,OFFSET TAB
MOV AX,NO
ADD BX,AX
DEC BX
MOV AL,[BX]
MOV COMPUTER,AL
OUTDB COMPUTER
MOV AH,4CH
INT 21H
CODES ENDS
END START
2.P151:例5.12
设有3个单字节无符号数存放在BUFFER开始的缓冲区中,程序如下:
DATAS SEGMENT
BUFFER DB 87,34,123
DATAS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS
START:MOV AX,DATAS
MOV DS,AX
MOV SI,OFFSET BUFFER
MOV AL,[SI]
MOV BL,[SI+1]
MOV CL,[SI+2]
CMP AL,BL
JAE NEXT1
XCHG AL,BL
NEXT1:CMP AL,CL
JAE NEXT2
XCHG AL,CL
NEXT2:CMP BL,CL
JAE NEXT3
XCHG BL,CL
NEXT3:MOV [SI],AL
MOV [SI+1],BL
MOV [SI+2],CL
OUTDB AL
OUTDB BL
OUTDB CL
MOV AH,4CH
INT 21H
CODES ENDS
END START
3.P160:例5.19
已知有两个5个字节的数分别放在DA1、DA2为首地址的内存区中,分别求出它们的和放在DA3为首地址的内存中,程序如下:
INCLUDE PRINT.ASM
DATAS SEGMENT
DA1 DB 10,20,30,40,50
DA2 DB 1,2,3,4,5
DA3 DB ?,?,?,?,?
DATAS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS
START:
MOV AX,DATAS
MOV DS,AX
MOV AX,0
CLC
MOV CX,5
MOV BX,OFFSET DA1
MOV SI,OFFSET DA2
MOV DI,OFFSET DA3
LP:
MOV AL,[BX]
ADC AL,[SI]
MOV [DI],AL
OUTDB AL
INC BX
INC SI
INC DI
LOOP LP
MOV AH,4CH
INT 21H
CODES ENDS
END START
4.P161:例5.20
在以BUF为首地址的内存区域中存放着一批带符号的8位二进制数,这批数据以0作为结束符号。以下程序是统计该批数据中有多少个正数,并把结果存放在RESULT单元:
INCLUDE PRINT.ASM
DATAS SEGMENT
BUF DB 10,20,-30,40,-50,44,0
RESULT DW ?
DATAS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS
START:
MOV AX,DATAS
MOV DS,AX
XOR CX,CX
LEA BX,BUF
L1:MOV AL,[BX]
INC BX
OR AL,AL
JZ EXIT
INC CX
JMP L1
EXIT:MOV RESULT,CX
OUTDW CX
MOV AH,4CH
INT 21H
CODES ENDS
END START
5.P165:例5.23
设有一个首地址为ARRAY的n字数组,试编制程序使该数组中的数按从小到大的次序排列。
(和编程题第4题相同)
6.P175:例6.3
主程序MAIN和过程PROADD在同一个源文件中,要求用国产PROADD累加数组中的所有元素,并把和送到指定的存储单元,程序如下:
INCLUDE PRINT.ASM
PROG_SEG SEGMENT
ORG 100H
ASSUME CS:PROG_SEG,DS:PROG_SEG,SS:PROG_SEG
MAIN PROC NEAR
MOV AX,PROG_SEG
MOV DS,AX
MOV TABLE,OFFSET ARY
MOV TABLE+2,OFFSET COUNT
MOV TABLE+4,OFFSET SUM
MOV BX,OFFSET TABLE
CALL PROADD
LL:
MOV CX,100
MOV BX,OFFSET ARY
MOV AX,[BX]
OUTDW AX
INC BX
INC BX
LOOP LL
MOV AX,4C00H
INT 21H
MAIN ENDP
PROADD PROC NEAR
PUSH AX
PUSH CX
PUSH SI
PUSH DI
MOV SI,[BX]
MOV DI,[BX+2]
MOV CX,[DI]
MOV DI,[BX+4]
XOR AX,AX
NEXT:
ADD AX,[SI]
ADD SI,2
LOOP NEXT
MOV [DI],AX
POP DI
POP SI
POP CX
POP AX
RET
PROADD ENDP
ARY DW 100 DUP(1)
COUNT DW 100
SUM DW ?
TABLE DW 3 DUP (?)
PROG_SEG ENDS
END MAIN
7.P180:例6.7
将0-65535之间的任意一个十进制数(ASCII码形式)转换成十六进制数的子程序如下:
DTH PROC FAR
展开阅读全文