汇编语言第六章答案

合集下载

第六章 汇编语言程序设计

第六章 汇编语言程序设计

AA:
SUB MOV MOV HLT
BX,AX DI, 2800H [DI],BX
16
改: CLC CMP JC SUB MOV MOV HLT AA: SUB MOV MOV HLT BX,AX DI, 2800H [DI],BX
17
AX,BX AA AX,BX DI, 2800H [DI],AX
CMP JZ CMP JZ MOV JMP NEXT: DONE: MOV HLT AL, 'y ' ;比较AL与小写字母y NEXT ;相等,转移到NEXT AL, 'Y ' ;不是小写字母y,是大写字母Y ? NEXT AH,-1 ;相等,转移NEXT ;不是大Y ,令AH=-1 Y AH 1
DONE ;无条件转移DONE AH,0 ;是Y或Y,令AH=0
AL,BL , AL,0 , STOR AL,80H , MINUS AL, 1 , STOR AL,0FFH , BH,AL ,
;取X ;X=0,Y=X , ;X<0 < ;X>0,Y=+1 > , X<0,Y= -1 < , ;保存Y 保存
MINUS: : STOR: :
MOV MOV HLT
例4,判断是否为字母 .若AL中是字母Y(含大小写),则令AH ,判断是否为字母Y. =0,否则令AH=-1
为奇数, ;否则AX为奇数,加1 否则 为奇数 ;AX←AX÷2 ÷
12
法2:将最低位用移位指令移至进位标志,判断进位标志 :将最低位用移位指令移至进位标志, 就是偶数; 是0,AX就是偶数;否则,为奇数 , 就是偶数 否则,
MOV SHR JNC ADD E1: SHR

汇编语言课后答案第6章

汇编语言课后答案第6章

第6章习题6.1 主程序与子程序之间进行参数传递有哪几种方法?简单说明并比较。

6.2 编写一个子程序,把16位二进制数转换为5位十进制数ASCII码。

6.3 编写一个把16位二进制数转换为4位十六进制数ASCII码的子程序6.4 编写一个计算字符串长度的子程序,字符串以0为结尾标志。

入口参数:字符串的首地址指针为DS:SI;出口参数:在AX中返回字符串的长度。

6.5 编写程序,将字符串STING1的内容复制到字符串STRING2中。

要求由子程序来实现字符串的复制,并采用寄存器来传递参数。

6.6 用通过存储单元传递参数的方法完成上题。

6.7 用通过堆栈传递参数的方法完成上题。

6.8 设计程序,从键盘接收一个字符串,显示字符串的长度,要求计算长度的工作由子程序来实现。

6.9 编程计算三个变量的绝对值之和,求绝对值采用子程序结构以简化程序。

6.10 编写程序完成运算X=A*B+C(设各数及结果都不超过65536),A、B、C为从键盘输入的十进制数,要求从键盘接收十进制数并转换为二进制的工作由子程序来完成。

6.11 编写程序,将内存缓冲区BUFFER1中的10个压缩型BCD码数转换成非压缩的BCD码,保存到缓冲区BUFFER2中。

要求转换工作由子程序来完成。

6.12 从键盘输入一组字符,直到按ESC键为止,存储在内存缓冲区BUFFER中。

要求用子程序来实现当输入字符为a~z时,则修改为A~Z。

6.13 阅读下面子程序,说明它完成的功能是什么?子程序的入口参数和出口参数各是什么?SUM16 PROC NEARMOV AX,0MOV DX,0LOP:ADD AX,[BX]ADC DX,0ADD BX,2LOOP LOPRETSUM16 ENDP完成N个数(字)的累加。

入口参数:CX=N,BX=N个数的首地址。

出口参数:累加和,DX:AX。

6.14 编写子程序,把用ASCII码表示的两位十进制数转换为对应的二进制数。

汇编语言王爽第三版检测点答案带目录

汇编语言王爽第三版检测点答案带目录

汇编语言王爽第三版检测点答案带目录在学习汇编语言的过程中,王爽老师的《汇编语言(第三版)》无疑是一本备受推崇的经典教材。

而对于学习者来说,检测点的答案能够帮助我们更好地巩固知识,查漏补缺。

接下来,我将为大家详细呈现这本教材中各个章节检测点的答案,并附上清晰的目录,方便大家查阅和学习。

第一章基础知识检测点 11(1)1 个 CPU 的寻址能力为 8KB,那么它的地址总线的宽度为。

答案:13 位。

因为 8KB = 8×1024 = 2^13B,所以地址总线的宽度为 13 位。

检测点 12(1)8086 CPU 有根数据总线。

答案:16 根。

(2)8086 CPU 有根地址总线。

答案:20 根。

检测点 13(1)内存地址空间的大小受的位数决定。

答案:地址总线。

(2)8086 CPU 的地址总线宽度为 20 位,其可以寻址的内存空间为。

答案:1MB。

因为 2^20 = 1048576B = 1MB。

第二章寄存器检测点 21(1)写出每条汇编指令执行后相关寄存器中的值。

mov ax,62627 AX = 62627mov ah,31H AH = 31H,AX = 31627mov al,23H AL = 23H,AX = 3123H检测点 22(1)给定段地址为 0001H,仅通过变化偏移地址寻址,CPU 的寻址范围为到。

答案:00010H 到 1000FH。

(2)有一数据存放在内存 20000H 单元中,现给定段地址为 SA,若想用偏移地址寻到此单元。

则 SA 应满足的条件是:最小为,最大为。

答案:最小为 1001H,最大为 2000H。

第三章内存访问检测点 31(1)下面的程序实现依次用内存 0:0~0:15 单元中的内容改写程序中的数据。

完成程序。

assume cs:codesgcodesg segmentdw 0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987Hstart: mov ax,0mov ds,axmov bx,0mov cx,8s: mov ax,bxmov bx+16,axadd bx,2loop smov ax,4c00hint 21hcodesg endsend start检测点 32(1)下面的程序将“Mov ax,4c00h ”之前的指令复制到内存 0:200 处。

汇编语言课后习题答案 王爽主编

汇编语言课后习题答案 王爽主编

补全编程,利用jcxz指令,实现在内存2000H段中查找第一个值为0的字节,找到后,将它的偏移地址存储在dx中。

assume cs:codecode segmentstart: mov ax,2000hmov ds,axmov bx,0s: mov ch,0mov cl,[bx]jcxz ok ;当cx=0时,CS:IP指向OKinc bxjmp short sok: mov dx,bxmov ax ,4c00hint 21hcode endsend start检测点9.3补全编程,利用loop指令,实现在内存2000H段中查找第一个值为0的字节,找到后,将它的偏移地址存储在dx中。

assume cs:codecode segmentstart: mov ax,2000hmov ds,axmov bx,0s:mov cl,[bx]mov ch,0inc cxinc bxloop sok:dec bxmov dx,bxmov ax,4c00hint 21hcode endsend start书P101,执行loop s时,首先要将(cx)减1。

“loop 标号”相当于dec cxif((cx)≠0) jmp short 标号检测点10.1补全程序,实现从内存1000:0000处开始执行指令。

assume cs:codestack segmentdb 16 dup (0)stack endscode segmentstart: mov ax,stackmov ss,axmov sp,16mov ax, 1000hmov ax, 0push axretfcode endsend start执行reft指令时,相当于进行:pop ippop cs根据栈先进后出原则,应先将段地址cs入栈,再将偏移地址ip入栈。

检测点10.3下面的程序执行后,ax中的数值为多少?内存地址机器码汇编指令执行后情况1000:0 b8 00 00 mov ax,0 ax=0,ip指向1000:31000:3 9a 09 00 00 10 call far ptr s pop cs,pop ip,ip指向1000:91000:8 40 inc ax1000:9 58 s:pop ax ax=8hadd ax,ax ax=10hpop bx bx=1000hadd ax,bx ax=1010h用debug进行跟踪确认,“call far ptr s”是先将该指令后的第一个字节段地址cs=1000h入栈,再将偏移地址ip=8h入栈,最后转到标号处执行指令。

《汇编语言》第2版 第六单元

《汇编语言》第2版 第六单元

6.2 在代码段中使用栈
程序6.3 codesg cs:codesg 程序6.3 assumesegment
dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 start:mov start:mov ax,cs mov ss,ax mov sp,30h ;将设置栈顶 ;将设置栈顶SS:SP指向CS:30 将设置栈顶SS:SP指向 指向CS:30 mov bx,0 mov cx,8 s: push cs:[bx] add bx,2 loop s ;以上将代码段0~15单元中的8个字型数据依次入栈 ;以上将代码段 以上将代码段0~15单元中的 单元中的8 mov bx,0 mov cx,8 s0: pop cs:[bx] add bx,2 loop s0 ;以上依次出栈8个字型数据到代码段0~15单元中的 ;以上依次出栈 个字型数据到代码段0~15单元中的 以上依次出栈8 mov ax,4c00h int 21h codesg ends end start ;指明程序的入口在start处 指明程序的入口在start处
6.1 在代码段中使用数据
注意在程序6.2中加入的新内容, 注意在程序6.2中加入的新内容,我们在 中加入的新内容 程序的第一条指令的前面加上了一个标 start,而这个标号在伪指令end的后 号start,而这个标号在伪指令end的后 面出现. 面出现.
6.1 在代码段中使用数据
探讨end的作用 探讨end的作用: 的作用: end 除了通知编译器程序结束外,还 除了通知编译器程序结束外, 可以通知编译器程序的入口在什么地 方.
6.1 在代码段中使用数据

《汇编语言》各章习题答案

《汇编语言》各章习题答案

汇编语言各章习题答案习题一答案:1.1无符号数: 11010011=211=D3H,01110111=119=77H,10000011=131=83H,00101111=47=2FH,10101010=170=AAH带符号数:11010011= -45=D3H,01110111=+119=77H,10000011= -125=83H,00101111=+47=2FH,10101010= -86=AAH1.2 5E8AH,0BE6H,3DEH,4940H1.3 00011101+00110101=01010010=52H=8201001001+11101000=00110001=31H=4910111110+01010010=00010000=10H=1610011010+11110001=10001011=8BH= -1171.4 00101001+01010011=01111100+00000110=10000010=82H=8201110011-00100100=01001111-00000110=01001001=49H=4901100110+00011000=01111110+00000110=10000100=84H=840000000100110010+01110101=0000000110100111+00000110=0000001000000111=0207H=2071.5 000020A3H,FF94H,00003456H,007FH,FFFFEC00H1.6无符号数:0~65535,0000H~FFFFH;带符号数:-32768~+32767,8000H~7FFFH 1.7 (1) 38H等于十进制数56,是十进制数56的补码,数字8的ASCII码,十进制数38的压缩BCD码(2) FFH等于十进制数-1,是带符号数-1的补码,无符号数为255(3) 5AH等于十进制数90,是十进制数90的补码,大写字母Z的ASCII码(4) 0DH等于十进制数13,是十进制数13的补码,回车符的ASCII码1.8(1) 108=01101100B=6CH,补码01101100B,压缩BCD码0000000100001000,ASCII码313038H(2) 46=00101110B=2EH,补码00101110B,压缩BCD码01000110,ASCII码3436H(3) –15=11110001B=F1H,补码11110001B,ASCII码2D3135H(4) 254=0000000011111110B=00FEH,补码0000000011111110B,压缩BCD码0000001001010100,ASCII码323534H1.9(1) 56+63=01110111B,CF=0,SF=0,ZF=0,OF=0(2) 83-45=00100110B,CF=0,SF=0,ZF=0,OF=0(3) -74+29=11010011B,CF=0,SF=1,ZF=0,OF=0(4) -92-37=01111111B,CF=1,SF=0,ZF=0,OF=11.10回车、换行、响铃、ESC键、空格键、@、P、p习题二答案:2.9最少划分为16个逻辑段,最多划分为65536个逻辑段(每段16个字节)2.10CS:IP,DS:BX、SI、DI,ES:BX、SI、DI,SS:SP、BP2.11字节单元保存8位数,字单元保存16位数。

32位汇编语言程序设计第6、7章习题答案

32位汇编语言程序设计第6、7章习题答案

习题62.指出下面转移指令的类型(相对近转移,相对短转移,间接转移)。

.DATAaddrS t ore DWORD ?.CODE……again:……(3 instructions)jmp again;短转移……(200 instructions)……jmp again ;近转移……jmp addrStore;段内间接转移……jmp eax ;段内间接转移……jmp [edi] ;段内或段间间接转移3.代码段有以下指令:ADD EAX, EBXJNO L1JNC L2SUB EAX, EBXJNO L3JNC L4JMP SHORT L5如果EAX和EBX的内容如下:(1)EAX=0102147BH,EBX=120180DCH ;L1(2)EAX=12348756H,EBX=800080DCH ;L1(3)EAX=D0230000H,EBX=9FD0000H ;L3(4)EAX=94B70000H,EBX=B568000H ;L1指令执行完后,程序怎样转移?4.假设EAX和EBX的内容是无符号数,ECX和EDX的内容是有符号数,请用比较指令实现以下判断:(1)如果EDX的内容大于ECX的内容,则转去执行L1;cmp edx, ecxjg L1(2)如果EAX的内容大于EBX的内容,则转去执行L2;cmp eax, ebxja L2(3)如果ECX=0,则转去执行L3;cmp ecx, 0jz L3或jecxz L3(4)EAX-EBX是否会发生溢出,如果发生溢出则转去执行L4;sub eax, ebxjo L4(5)如果EBX的内容小于EAX的内容,则转去执行L5;cmp ebx, eaxjb L5(6)如果ECX的内容小于EDX的内容,则转去执行L6。

cmp ecx, edxjl L65.已知EAX=0000004FH,V ALUE= FFFFFF38H。

请指出下面每一个语句是否会引起转移?(a) cmp eax, valuejl dest; N(b) cmp eax, valuejb dest; Y(c) cmp eax, 04fhje dest ; Y(d) cmp eax, 79jne dest; N(e) cmp value,0jbe dest; N(f) cmp value,-200jge dest ;Y(g) cmp eax, 200js dest; y(h) add value,200jz dest; N6.编写程序测试STA TUS中的状态:如果STATUS=0,则转去执行L0;如果D0,D3,D5位为1则转去执行L1;如果D31,D29为0则转去执行L2;如果D15,D14,D13为1,则转去执行L3。

《汇编语言》作业答案

《汇编语言》作业答案

3545233.doc 制作:江家宝《IBM—PC汇编语言程序设计》课后作业参考答案目录第一章:基础知识 ........................................................................................ 2第二章:80×86计算机组织......................................................................... 2第三章:80×86的指令系统和寻址方式..................................................... 3第四章:汇编语言程序格式........................................................................ 7第五章:循环与分支程序设计.................................................................... 9第六章:子程序结构 ................................................................................ 12第七章:高级汇编语言技术.................................................................... 20第八章:输入输出程序设计.................................................................... 22第九章:BIOS和DOS中断 (23)3545233.doc 制作:江家宝第一章:基础知识1.1、用降幂法和除法将下列十进制数转换为二进制数和十六进制数:(3) 4095 答:(3) 4095 =1111 1111 1111B=FFFH1.2、将下列二进制数转换为十六进制数和十进制数:(1) 10 1101 答:(1) 10 1101B=2DH=451.3、将下列十六进制数转换为二进制数和十进制数:(4) 1234 答:(4) 1234H=1 0010 0011 0100B=46601.4、完成下列十六进制数的运算,并转换为十进制数进行校核:(3) ABCD-FE 答:(3) ABCD-FEH=AACFH=437271.5、下列各数均为十进制数,请用8位二进制补码计算下列各题,并用十六进制数表示其运算结果。

(完整word版)汇编第六章答案

(完整word版)汇编第六章答案

第六章答案=======================================1.下面的程序段有错吗?若有,请指出错误.CRAY PROCPUSH AXADD AX,BXRETENDP CRAY[解]:当然有错误,ENDP CRAY写反了,应该将其改成CRAY ENDP.2.已知堆栈寄存器SS的内容是0F0A0H,堆栈指示器SP的内容是00B0H,先执行两条把8057H和0F79BH分别入栈的PUSH指令.然后再执行一POP指令.试画出示意图说明堆栈及SP内容的变化过程.3.分析下面"6,3的程序",画出堆栈最满时各单元的地址及内容.; 6.3题的程序;===========================================S_SEG SEGMENT AT 1000H ;DEFINE STACK SEGMENTDW 200 DUP(?)TOS LABEL WORDS_SEG ENDSC_SEG SEGMENT ;DEFINE CODE SEGMENTASSUME CS:C_SEG,SS:S_SEGMOV AX,S_SEGMOV SS,AXMOV SP,OFFSET TOSPUSH DSMOV AX,0PUSH AX...PUSH T_ADDRPUSH AXPUSHF...POPFPOP AXPOP T_ADDRRETC_SEG ENDS ;END OF CODE SEGMENTEND C_SEG ;END OF ASSEMBLY4.分析下面"6.4题的程序"的功能,写出堆栈最满时各单元的地址及内容. ; 6.4题的程序;====================================STACK SEGMENT AT 500HDW 128 DUP(?)TOS LABEL WORDSTACK ENDSCODE SEGMENT ;DEFINE CODE SEGMENTMAIN PROC FAR ;MAIN PART OF PROGRAMASSUME CS:CODE,SS:STACKSTART: ;STARTING EXECUTION ADDRESSMOV AX,STACKMOV SS,AXMOV SP,OFFSET TOSPUSH DSSUB AX,AXPUSH AX;MAIN PART OF PROGRAM GOES HEREMOV AX,4321HCALL HTOARET ;RETURN TO DOSMAIN ENDP ;END OF MAIN PART OF PROGRAM HTOA PROC NEAR ;DEFINE SUBPROCEDURE HTOA CMP AX,15JLE B1PUSH AXPUSH BPMOV BP,SPMOV BX,[BP+2]AND BX,000FHMOV [BP+2],BXPOP BPMOV CL,4SHR AX,CLCALL HTOAPOP AXB1:ADD AL,30HCMP AL,3AHJL PRINTITADD AL,07HPRINTIT:MOV DL,ALMOV AH,2INT 21HRETHTOA ENDP ;END OF SUBPROCEDURECODE ENDS ;END OF CODE SEGMENTEND START ;END OF ASSEMBLY5.下面是6.5题的程序清单,请在清单中填入此程序执行过程中的堆栈变化. 0000 STACKSG SEGMENT0000 20 [. DW 32 DUP(?)????0040 ]STACKSG ENDS0000 CODESG SEGMENT PARA 'CODE'0000 BEGIN PROC FARASSUME CS:CODESG,SS:STACKSG0000 1E PUSH DS0001 2B C0 SUB AX,AX0003 50 PUSH AX0004 E8 0008 R CALL P100007 CB RET0008 BEGIN ENDP0008 B10 PROC0008 E8 000C R CALL C10000B C3 RET000C B10 ENDP000C C10 PROC000C C3 RET000D C10 ENDP000D CODESG ENDSEND BEGIN6.写一段子程序SKIPLINES,完成输出空行的功能.空行的行数在AX寄存器中. [解]:SKIPLINES PROC NEARPUSH CXPUSH DXMOV CX,AXNEXT: MOV AH,2MOV DL,0AHINT 21HMOV AH,2MOV DL,0DHINT 21HLOOP NEXTPOP DXPOP CXRETSKIPLINES ENDP7.设有10个学生的成绩分别是76,69,81,90,73,88,99,63,100和80分.试编制一个子程序统计60-69,70-79,80-89,90-99和100分的人数并分别存放到S6,S7,S8,S9和S10单元中.DSEG SEGMENTNUM DW 76,69,84,90,73,88,99,63,100,80N DW 10S6 DW 0S7 DW 0S8 DW 0S9 DW 0S10 DW 0DSEG ENDSCODE SEGMENTMAIN PROC FARASSUME CS:CODE, DS:DSEGSTART:PUSH DSSUB AX, AXPUSH AXMOV AX, DSEGMOV DS, AXCALL SUB1RETMAIN ENDPSUB1 PROC NEARPUSH AXPUSH BXPUSH CXPUSH SIMOV SI, 0MOV CX, NNEXT:MOV AX, NUM[SI]MOV BX, 10DIV BLMOV BL, ALCBWSUB BX, 6SAL BX, 1INC S6[BX]ADD SI,2LOOP NEXTPOP SIPOP CXPOP BXPOP AXRETSUB1 ENDPCODE ENDSEND START(解法二)datasg segmentgrade db 76,69,84,90,73,88,99,63,100,80 s6 db 0s7 db 0s8 db 0s9 db 0s10 db 0mess6 db '60~69:$'mess7 db '70~79:$'mess8 db '80~89:$'mess9 db '90~99:$'mess10 db '100:$'datasg endscodesg segmentmain proc farassume cs:codesg,ds:datasg start:push dssub ax,axpush axmov ax,datasgmov ds,axcall sub1lea dx,mess6call dispstrmov dl,s6call dispscorecall crlflea dx,mess7call dispstrmov dl,s7call dispscorecall crlflea dx,mess8call dispstrmov dl,s8call dispscorecall crlflea dx,mess9call dispstrmov dl,s9call dispscorecall crlflea dx,mess10call dispstrmov dl,s10call dispscorecall crlfretmain endpsub1 proc nearmov cx,10mov si,0loop1: mov al,grade[si]cmp al,60jl next5cmp al,70jge next1inc s6jmp short next5 next1: cmp al,80jge next2inc s7jmp short next5 next2: cmp al,90jge next3inc s8jmp short next5 next3: cmp al,100jg next5je next4inc s9jmp short next5next4: inc s10next5: inc siloop loop1retsub1 endpdispstr proc nearmov ah,9int 21hdispstr endpdispscore proc nearadd dl,30hmov ah,2int 21hdispscore endpcrlf proc nearmov dl,0dhmov ah,2int 21hmov dl,0ahmov ah,2int 21hretcrlf endpcodesg endsend start8.编写一个有主程序和子程序结构的程序模块.子程序的参数是一个N字节数组的首地址TABLE,数N及字符CHAR.要求在N字节数组中查找字符CHAR,并记录该字符的出现次数.;主程序则要求从键盘接收一串字符以建立字节数组TABLE,并逐个显示从键盘输入的每个字符CHAR以及它在TABLE数组中出现的次数.(为简化起见,假设出现次数<=15,可以用十六进制形式显示出来)[解]:DATA SEGMENTMAXLEN DB 40N DB ?TABLE DB 40 DUP (?)CHAR DB 'A' ; 查找字符'A'EVEN_ADDR DW 3 DUP(?)DATA ENDSCODE SEGMENTASSUME CS:CODE, DS:DATAMAIN PROC FARSTART:PUSH DSMOV AX, 0PUSH AXMOV AX, DATAMOV DS, AXLEA DX, MAXLENMOV AH, 0AHINT 21H ; 从键盘接收字符串MOV _ADDR, OFFSET TABLEMOV _ADDR+2, OFFSET NMOV _ADDR+4, OFFSET CHARMOV BX, OFFSET _ADDR ; 通过地址表传送变量地址CALL COUNT ; 计算CHAR的出现次数CALL DISPLAY ; 显示RETMAIN ENDPCOUNT PROC NEAR ; COUNT子程序PUSH SIPUSH DIPUSH AXPUSH CXMOV DI, [BX]MOV SI, [BX+2]MOV CL, BYTE PTR[SI]MOV CH, 0MOV SI, [BX+4]MOV AL, BYTE PTR[SI]MOV BX, 0AGAIN:CMP AL, BYTE PTR[DI]JNE L1INC BXL1: INC DILOOP AGAINPOP CXPOP AXPOP DIPOP SIRETCOUNT ENDPDISPLAY PROC NEAR ; DISPLAY子程序CALL CRLF ; 显示回车和换行MOV DL, CHARMOV AH, 2INT 21HMOV DL, 20HMOV AH, 2INT 21HMOV AL, BLAND AL, 0FHADD AL, 30HCMP AL, 3AHJL PRINTADD AL, 7PRINT:MOV DL, ALINT 21HCALL CRLFRETDISPLAY ENDPCRLF PROC NEAR ; CRLF子程序MOV DL, 0DHMOV AH, 2INT 21HMOV DL, 0AHMOV AH, 2INT 21HRETCRLF ENDPCODE ENDSEND START9.编写一个子程序嵌套结构的程序模块,分别从键盘输入姓名及8个字符的电话号码,并以一定的格式显示出来.主程序TELIST:(1)显示提示符INPUT NAME:;(2)调用子程序INPUT_NAME输入姓名:(3)显示提示符INPUT A TELEPHONE NUMBER:;(4)调用子程序INPHONE输入电话号码;(5)调用子程序PRINTLINE显示姓名及电话号码;子程序INPUT_NAME:(1)调用键盘输入子程序GETCHAR,把输入的姓名存放在INBUF缓冲区中;(2)把INBUF中的姓名移入输出行OUTNAME;子程序INPHONE:(1)调用键盘输入子程序GETCHAR,把输入的8位电话号码存放在INBUF缓冲区中;(2)把INBUF中的号码移入输出行OUTPHONE.子程序PRINTLINE:显示姓名及电话号码,格式为:NAME TEL**** ********==========================================;编写一个子程序嵌套结构的程序模块,分别从键盘输入姓名及8个字符的电话号码,并以一定的格式显示出来(解法一)data segmentNo_of_name db 20No_of_phone db 8inbuf db 20 dup(?)outname db 20 dup(?),'$'outphone db 8 dup(?),'$'message1 db 'please input name:','$'message2 db 'please input a telephone number:','$'message3 db 'NAME',16 dup(20h),'TEL.',13,10,'$'errormessage1 db 'you should input 8 numbers!',13,10,'$'errormessage2 db 'you input a wrong number!',13,10,'$'flag db ?data endsprog segmentmain proc farassume cs:prog,ds:datastart:push dssub ax,axpush axmov ax,datamov ds,axmov flag,0lea dx,message1mov ah,09int 21hcall input_namecall crlflea dx,message2mov ah,09int 21hcall inphonecall crlfcmp flag,1je exitcall printline exit:retmain endpinput_name proc nearpush axpush dxpush cxmov cx,0mov cl,No_of_namecall getcharmov ax,0mov al,No_of_namesub ax,cxmov cx,axmov si,0next1:mov al,inbuf[si]mov outname[si],alinc siloop next1pop cxpop dxpop axretinput_name endpinphone proc nearpush axpush dxmov cx,0mov cl,No_of_phonecall getcharcmp cx,0jnz error1mov cl,No_of_phonemov si,0next2:mov al,inbuf[si]cmp al,30hjl error2cmp al,39hja error2mov outphone[si],alinc siloop next2jmp exit2error1:call crlflea dx,errormessage1mov ah,09int 21hmov flag,1jmp exit2error2:call crlflea dx,errormessage2mov ah,09int 21hmov flag,1jmp exit2exit2:pop dxpop axretinphone endpgetchar proc nearpush axpush dxmov di,0rotate:mov ah,01int 21hcmp al,0dhje exit1mov inbuf[di],alinc diloop rotateexit1:pop dxpop axretgetchar endpcrlf proc nearpush axpush dxmov dl,0dhmov ah,2int 21hmov dl,0ahmov ah,2int 21hpop dxpop axretcrlf endpprintline proc nearpush axpush dxlea dx,message3mov ah,09int 21hlea dx,outnamemov ah,09int 21hlea dx,outphonemov ah,09int 21hpop dxpop axretprintline endpprog endsend main==========================================;从键盘输入姓名及8个字符的电话号码,并以一定的格式显示出来datarea segmentinbuf label byte;name parameter list:maxnlen db 9;max.lengthnamelen db ?;no. char enterednamefld db 9 dup(?)crlf db 13,10,'$'messg1 db 'INPUT NAME:',13,10,'$'messg2 db 'INPUT A TELEPHONE NUMBER:',13,10,'$' messg3 db 'NAME TEL ',13,10,'$'OUTNAME db 21 dup(?),'$'OUTPHONE db 8 dup(?),'$'datarea endsprognam segmentassume cs:prognam,ds:datareastart: push dssub ax,axpush axmov ax,datareamov ds,axmov es,ax TELIST proc farmov ah,09lea dx,messg1int 21hcall INPUT_NAMEmov ah,09lea dx,messg2int 21hcall INPHONEcall PRINTLINEretTELIST endpINPUT_NAME proc nearcall GETCHARmov bh,0mov bl,namelenmov cx,21sub cx,bxb20: mov namefld[bx],20hinc bxloop b20lea si,namefldlea di,OUTNAMEmov cx,9cldrep movsbretINPUT_NAME endpINPHONE proc nearcall GETCHARmov bh,0mov bl,namelenmov cx,9sub cx,bxb30: mov namefld [bx],20hinc bxloop b30lea si,namefldlea di,OUTPHONEmov cx,8cldrep movsbretINPHONE endpPRINTLINE proc nearmov ah,09hlea dx,messg3int 21hmov ah,09lea dx,OUTNAMEint 21hmov ah,09lea dx,OUTPHONEint 21hretPRINTLINE endpGETCHAR proc nearmov ah,0ahlea dx,inbufint 21hmov ah,09lea dx,crlfint 21hretGETCHAR endpprognam endsend start==========================================10.编写子程序嵌套结构的程序,把整数分别用二进制和八进制形式显示出来.主程序BANDO:把整数字变量VAL1存入堆栈,并调用子程序PAIRS;子程序PAIRS:从堆栈中取出VAL1;调用二进制显示程序OUTBIN显示出与其等效的二进制数;输出8个空格;调用八进制显示程序OUTOCT显示出与其等效的八进制数;调用输出回车及换行符的子程序..model small.stack 100h.dataval1 dw 0ffffh.codemain proc farstart:push dssub ax,axmov ax,@data mov ds,ax push val1call pairsretmain endppairs proc near push bpmov bp,sp mov bx,[bp+4] call outbinmov cx,8loop1:mov dl,20h mov ah,2int 21hloop loop1call outoctcall crlfpop bpret 2pairs endpoutbin proc near mov cx,16 loop2:mov dl,0rol bx,1rcl dl,1or dl,30h mov ah,2int 21hloop loop2retoutbin endp outoct proc near mov dl,0rol bx,1rcl dl,1add dl,30h mov ah,2int 21hmov ch,5mov cl,3rol bx,clmov al,bland al,07hadd al,30hmov dl,almov ah,2int 21hdec chjnz loop3retoutoct endpcrlf proc nearmov dl,13mov ah,2int 21hmov dl,10mov ah,2int 21hretcrlf endpend start11.假定一个名为MAINPRO的程序要调用子程序SUBPRO,试问:(1)MAINPRO中的什么指令告诉汇编程序SUBPRO是在外部定义的?(2)SUBPRO怎么知道MAINPRO要调用它?[解]:(1)EXTRN SUBPRO: FAR(2)PUBLIC SUBPRO12.假定程序MAINPRO和SUBPRO不在同一模块中,MAINPRO中定义字节变量QTY 和字变量VALUE和PRICE.SUBPRO程序要把VALUE除以QTY,并把商存在PRICE中,试问:(1)MAINPRO怎么告诉汇编程序外部子程序要调用这三个变量?(2)SUBPRO怎么告诉汇编程序这三个变量是在另一个汇编语言程序中定义的? [解]:(1)PUCLIC QTY,VALUE,PRICE(2)EXTRN QTY: BYTE, VALUE: WORD, PRICE: WORD13.假设:(1)在模块1中定义了双字变量VAR1,首地址为VAR2的字节数组和NEAR标号LAB1,它们将由模块2和模块3所使用;(2)在模块2中定义了字变量VAR3和FAR标号LAB2,而模块1中要用到VAR3,模块3中要用到LAB2;(3)在模块3中定义了FAR标号LAB3,而模块2中要用到它. 试对每个源模块给出必要的EXTRN和PUBLIC说明.;模块1extrn var3:wordpublic var1,var2,lab1data1 segmentvar1 dd ?var2 db 10 dup(?)data1 endscode1 segmentassume cs:code1, ds:data1main proc farmov ax,data1mov ds,ax...lab1:...mov ax,4c00hint 21hmain endpcode1 endsend start;模块2extrn var1:dword,var2:byte,lab1:near,lab3:farpublic var3,lab2data2 segmentvar3 dw ?data2 endscode2 segmentassume cs:code2, ds:data2...lab2:...code2 endsend;模块3extrn var1:dword,var2:byte,lab1:near,lab2:farpublic lab3code3 segmentassume cs:code3...lab3:...code3 endsend14.主程序CALLMUL定义堆栈段,数据段和代码段,并把段寄存器初始化;数据段中定义变量QTY和PRICE;代码段中将PRICE装入AX,QTY装入BX,然后调用子程序SUBMUL.程序SUBMUL没有定义任何数据,它只简单地把AX中的内容(PRICE)乘以BX中的内容(QTY),乘积放在DX,AX中.请编制这两个要连接起来的程序. datasg segmentqty dw 2price dw 4datasg endsstacksg segmentdw 100 dup(?)tos label wordstacksg endscodesg segmentmain proc farassume cs:codesg,ds:datasg,ss:stacksgstart:mov ax,datasgmov ds,axmov ax,stacksgmov ss,axmov sp,offset tosmov ax,pricemov bx,qtycall submulmov ax,4c00hint 21hmain endpsubmul proc nearmov dx,0mul bxretsubmul endpcodesg endsend start15.试编写一个执行以下计算的子程序COMPUTE:R<-X+Y-3其中X,Y及R均为字数组.假设COMPUTE与其调用程序都在同一代码段中,数据段D_SEG中包含X和Y数组,数据段E_SEG中包含R数组,同时写出主程序调用COMPUTE过程的部分.如果主程序和COMPUTE在同一程序模块中,但不在同一代码段中,程序就如何修改?如果主程序和COMPUTE不在同一程序模块中,程序就如何修改?(1)d_seg segmentx dw 1y dw 4d_seg endse_seg segmentr dw ?e_seg endsc_seg segmentmain proc farassume cs:c_seg,ds:d_seg,es:e_segstart:mov ax,d_segmov ds,axmov ax,e_segmov es,axcall computemov ax,4c00hint 21hmain endpcompute proc nearmov ax,xadd ax,ysub ax,3mov es:r,axretcompute endpc_seg endsend start;========================================(2)d_seg segmentx dw 1y dw 4d_seg endse_seg segmentr dw ?e_seg endsc_seg segmentmain proc farassume cs:c_seg,ds:d_seg,es:e_segstart:mov ax,d_segmov ds,axmov ax,e_segmov es,axcall far ptr computemov ax,4c00hint 21hmain endpc_seg endsprognam segmentassume cs:prognamcompute proc farmov ax,xadd ax,ysub ax,3mov es:r,axretcompute endpprognam endsend start;============================================= (3);模块1extrn compute:farpublic x,y,rd_seg segmentx dw 1y dw 4d_seg endse_seg segmentr dw ?e_seg endsc_seg segmentmain proc farassume cs:c_seg,ds:d_seg,es:e_seg start:mov ax,d_segmov ds,axmov ax,e_segmov es,axcall far ptr computemov ax,4c00hint 21hmain endpc_seg endsend start;模块2extrn x:word,y:word,r:wordpublic computeprognam segmentassume cs:prognamcompute proc farmov ax,xadd ax,ysub ax,3mov es:r,axretcompute endpprognam endsend。

微机原理、汇编与接口技术习题答案 第6章习题答案

微机原理、汇编与接口技术习题答案 第6章习题答案

微机原理、汇编与接口技术第六章习题答案6.16.26.36.4stack segment stack 'stack'dw 32 dup(0)stack endscode segmentstart proc farassume ss: stack, cs: codepush dssub ax, axpush axCALL I6116 ;调用写入6116子程序MOV AH, 2 ;回车换行MOV DL, 0DHINT 21HMOV DL, 0AHINT 21HCALL O6116 ;调用读出6116子程序retstart endp;写入6116:将键入字符的ASCII码写入6116I6116 PROCMOV BL, 0 ;定义页地址码(16个地址为一页)MOV CX, 128 ;定义页数LOP1: PUSH CXMOV DX, 380H ;将页地址从74LS273输出MOV AL, BLOUT DX, ALMOV CX, 16 ;定义页内单元数MOV DX, 390H ;将键入数写入16个单元LOP2: MOV AH, 1INT 21HOUT DX, ALINC DXLOOP LOP2INC BL ;换页POP CXLOOP LOP1 ;页数未满换页重新写入16个单元RETI6116 ENDP;读出6116:将写入6116的数据读出送显示O6116 PROCMOV BL, 0MOV CX, 128LOP3 PUSH CXMOV DX, 390HMOV AL, BLOUT DX, ALMOV CX, 16MOV DX 380H ;将16个单元的数据送显示LOP4: IN AL, DXPUSH DXMOV DL, AL ;将6116中读出的ASCII码送DLMOV AH, 2 ;2号功能调用显示DL中的字符INT 21HPOP DXINC DXLOOP LOP4INC BLPOP CXLOOP LOP3RETO6116 ENDPcode endsend start6.5stack segment stack 'stack'dw 32 dup(0)stack endscode segmentstart proc farassume ss: stack, cs: codepush dssub ax, axpush axMOV AH, 2 ;用2号功能调用输出字符,调用号送AHMOV CX, 100 ;字符个数送计数器MOV DX, 380HWAIT0: IN AL, DX ;从244读入TEST AL, 80H ;测试状态位是否为0JNZ WAIT0 ;不为0,等待继续测试状态WAIT1: IN AL, DX ;状态为0,继续读入TEST AL, 80H ;测试状态是否为1JZ WAIT1 ;不为1,等待继续测试状态IN AL, DX ;状态为1,读入数据即ASCII码AND AL, 7FH ;去掉状态位MOV DL, AL ;ASCII码送DL,输出字符INT 21HLOOP WAIT0-3 ;跳到给DX赋值380H的MOV指令,该指令为3字节retstart endpcode endsend start6.6stack segment stack 'stack'dw 32 dup(0)stack endsdata segmentOBUF DB 4 DUP(0)data endscode segmentbegin proc farassume ss: stack, cs: code, ds: datapush dssub ax,axpush axmov ax,datamov ds,axMOV BX,0FFSET OBUF+3 ;建立指针MOV BYTE PTR [BX],'$';存字符串结束符$MOV DX,380H ;读入二进制数IN AL,DXMOV CH,10AG: MOV AH,0 ;无符号数扩展为16位DIV CHADD AH,30H ;转换为ASCII码DEC BXMOV [BX],AH ;存入输出数据区中OR AL,ALJNZ AGMOV DX,BXMOV AH,9INT 21Hretbegin endpcode endsend begin6.7用除2取余法将BCD数转换为二进制数的程序如下:stack segment stack 'stack'dw 32 dup(0)stack endsdata segmentIBUF DB 4, 0, 4 dup(0)data endscode segmentstart proc farassume ss: stack, cs: code, ds: datapush dssub ax,axpush axmov ax,datamov ds,axMOV DX,OFFSET IBUF ;键入十进制数MOV AH,10INT 21HMOV DX,0 ;将键入数以压缩BCD数形式放AX中MOV CH,IBUF+1 ;将键入数的个数送计数器CH中MOV CL,4MOV BX,2AGAIN1: AND IBUF[BX],0FH ;将数据区中的ASCII码转换为BCD数SHL AX,CL ;将BCD数左移1位OR DL,IBUF[BX] ;将数据区中的1位BCD放入DX的最低4位INC BXDEC CHJNZ AGAIN1MOV CX,8 ;用除2取余法将DX中的压缩BCD数转换为二进制数AGAIN2: SHR DX,1RCR AL,1MOV AH,DLAND AH,88HSHR AH,1SHR AH,1SUB DL,AHSHR AH,1SUB DL,AHLOOP AGAIN2MOV DX,380H ;二进制数从74LS273输出OUT DX,ALretstart endpcode endsend start用(百位⨯10+十位)⨯10+个位的方法将BCD数转换为二进制数的程序段如下:MOV CL,IBUF+1 ;将键入数的个数送计数器CX中MOV CH,0MOV SI,2MOV AL, 0 ;开始将十进制数转换为二进制数AGAIN: MOV AH, 10 ;((0×10+a2)×10+…)×10+a0MUL AHAND BYTE PTR [SI], 0FH ;将十进制数的ASCII码转换为BCD数ADD AL,[SI]INC SILOOP AGAIN6.8stack segment stack 'stack'dw 32 dup(0)stack endsdata segmentSEGPT DB 3FH,6,5BH,4FH,66H,7,7FH,6FH,6FH,76H,77H,7CH,39H,5EH,79H,71H data endscode segmentstart proc farassume ss: stack, cs: code, ds: datapush dssub ax,axpush axmov ax,datamov ds,axMOV DX,380HIN AL,DXSUB AL,30HCMP AL,0AHJB NS7SUB AL,7MOV BL,ALMOV BH,0MOV AL,SEGPT[BX]OUT DX,ALretstart endpcode endsend start6.9stack segment stack 'stack'dw 32 dup(0)stack endscode segmentstart proc farassume ss: stack, cs: codepush dssub ax, axpush axMOV DX, 380HLOP1: IN AL, DX ;读入设备1和设置2的状态AND AL, 6 ;测试2台设备的状态,同时使AL的D0位为0JZ LOP2 ;都正常,即AL的D1位和D2位都为0,AL为0MOV AL, 1 ;有一台异常AL不为0,AL置1,即AL的D0位为1 LOP2: OUT DX, ALMOV AH, 11 ;11号功能调用,键入任一键退出程序INT 21HCMP AL, 0 ;无键入AL=0,有键入AL=FFHJE LOP1 ;无键入,去LOP1继续监视2台设备retstart endpcode endsend start6.10stack segment stack 'stack'dw 32 dup(0)stack endscode segmentbegin proc farassume ss: stack, cs: codepush dssub ax, axpush axMOV DX, 380HIN AL, DX ;读入原码TEST AL, 80H ;判原码数的符号JZ NONEG ;正数的原码和补码相同,不用求补AND AL, 7FH ;负数,求其绝对值NEG AL ;对绝对值求补得该负数的补码NONEG: OUT DX, ALretbegin endpcode endsend begin6.11在显示器上显示:行*列的程序如下:stack segment stack 'stack'dw 32 dup(0)stack endscode segmentstart proc farassume ss: stack, cs: codepush dssub ax, axpush axMOV DX, 380H ;检测全键盘MOV AL, 0 ;键盘的8行全为低电平OUT DX, ALLOP1: IN AL, DX ;读入列值CMP AL, 0FFH ;列值是FFH吗?JE LOP1 ;是,全键盘无键闭合,继续检测MOV AH, 7FH ;键盘的行检测的输出值,被检测行为0,其余行为1 LOP2: MOV AL, AH ;检测键盘的一行OUT DX, AL ;输出行检测值IN AL, DX ;读入列值,列值不为FFH有键闭合CMP AL, 0FFH ;被检测行有键闭合吗?JNE LOP3 ;有键闭合,结束逐行扫描去LOP3ROR AH, 1 ;该行无键闭合,改变行检测的输出值检测另一行JMP LOP2LOP3: MOV DL, 0 ;求行值0~7,即AH中的那个0的位置AS1: SHR AH ,1 ;0在最低位DL=0,……,0在最高位DL=7JNC AS2JMP AS1AS2: ADD DL, 30H ;将行值转换为ASCII码MOV AH, 2 ;输出行值INT 21HMOV DL, '*';输出乘号:*INT 21HMOV DL, 0 ;求列值0~7,即AL中的那个0的位置AS3: SHR AL, 1JNC AS4INC DLJMP AS3AS4: ADD DL, 30H ;将列值转换为ASCII码INT 21H ;输出列值retstart endpcode endsend start6.12stack segment stack 'stack'dw 32 dup(0)stack endsdata segmentSEGPT DB 77H,7CH,39H,5EH,79H,71H,6FH,76Hdata endscode segmentstart proc farassume ss: stack, cs: code, ds: datapush dssub ax, axMOV DX, 380HLOP: IN AL, DXMOV BX,0LOP1: SHR AL,1JNC LOP2INC BLJMP LOP1LOP2: MOV AL,SEGPT[BX]OUT DX, ALMOV AH,11INT 21HCMP AL,0JE LOPretstart endpcode endsend start6.13stack segment stack 'stack'dw 32 dup(0)stack endscode segmentstart proc farassume ss: stack, cs: codepush dssub ax, axpush axMOV DX 260HIN AL, DXMOV AH, ALINC DXCMP AL, AHJNC NXCHGXCHG AL, AHNXCHG: SUB AL, AHDASINC DXINC DXOUT DX, ALretstart endpcode endsend start6.14stack segment stack 'stack'dw 32 dup(0)stack endscode segmentstart proc farassume ss: stack, cs: codepush dssub ax, axpush axMOV BL, 240MOV DX, 260HLOP: ADD BL, 16MOV AL, BLOUT DX, ALLOOP $ ;延时MOV AH, 11INT 21HCMP AL, 0JE LOPretstart endpend start6.15输出周期性的方波、锯齿波、三角波、正弦波的程序如下:stack segment stack 'stack'dw 32 dup (0)stack endsdata segmentOBF DB 80H, …, 0FFH, …, 80H, …, 00H, …;正弦波的数据(一周期)N EQU $ -OBFdata endscode segmentstart proc farassume ss: stack, cs: code, ds: datapush dssub ax, axpush axmov ax, datamov ds, axMOV DX, 380HAGAIN: MOV AH, 1 ;键入一字符,应为大写!INT 21HCMP AL, 'F'JE FBCMP AL, 'J'JE JCBCMP AL, 'S'JE SJBCMP AL, 'Z'JE ZXB ;按下F、J、B和Zret ;4个键以外的键退出该程序FB: MOV AL, 0 ;方波输出OUT DX, ALCALL DELAY1CALL DELAY1MOV AH, 11INT 21HCMP AL, 0JE FBJMP AGAINJCB: INC AL ;锯齿波输出OUT DX, ALCALL DELAY2MOV BL, AL ;保护ALMOV AH, 11CMP AL, 0MOV AL, BL ;恢复ALJE JCBJMP AGAINSJB: INC AL ;三角波输出OUT DX, ALCALL DELAY3CMP AL, -1JNE SJBSJB1: DEC ALOUT DX, ALCALL DELAY3CMP AL, 0JNE SJB1MOV AH, 11INT 21HCMP AL, 0JE SJBJMP AGAINZXB: MOV BX, OFFSET OFB ;正弦波输出MOV CX, NZXB1: MOV AL, [BX]OUT DX, ALCALL DELAY4INC BXLOOP ZXB1MOV AH, 11INT 21HCMP AL, 0JE ZXBJMP AGAINstart endpDELAY1: PROCDL11: MOV SI, 0DL12: DEC SIJNZ DL12LOOP DL11POP CXRETDELAY1 ENDPDELAY2 ;延时程序结构一样DELAY3 ;仅CX取值不同;故略DELAY4code endsend start6.1stack segment stack 'stack'dw 32 dup(0)stack endscode segmentstart proc farassume ss: stack, cs: codepush dssub ax,axpush axmov ax,datamov ds,axMOV CL,4LOP1: MOV AX,0LOP2: PUSH AXMOV DX, 381HROR AX,CL ;高8位数据移入ALOUT DX, ALMOV DX, 380HMOV AL,AH ;低4位数据移入AL的低4位SHR AL,CLOUT DX, AL ;再写一遍MOV AH,11 ;检查键盘有无键入INT 21HCMP AL,0JNE BAK ;键盘有键入,退出POP AXINC AXCMP AX,1000HJNE LOP2JMP LOP1BAK: POP AXretstart endpcode endsend start6.17stack segment stack 'stack'dw 32 dup(0)stack endsdata segmentBUF DB 16 DUP(0)data endscode segmentstart proc farassume ss: stack, cs: code, ds: datapush dssub ax,axpush axmov ax,datamov ds,axMOV BX,0MOV DX,260HLOP: OUT DX,ALPUSH DXMOV DX,270HWT: MOV AL,DXSHR AL,1JNC WTPOP DXIN AL,DXMOV BUF[BX],ALINC BXINC DXLOOP LOPretstart endpcode endsend start6.18stack segment stack 'stack'dw 32 dup(0)stack endsdata segmentBUFF DW 100 DUP(0)data endscode segmentstart proc farassume ss: stack, cs: code, ds: datapush dssub ax,axmov ax,datamov ds,axMOV BX,0MOV CX,100LOP: MOV DX, 380H ;两片74LS244都不选中OUT DX, AL ;产生SC信号启动AD转换INC DXWAIT: IN AL, DX ;读取转换结束信号TEST AL, 4 ;测试CC信号JNZ WAIT ;CC信号为1,表明AD转换未结束,等待IN AL, DX ;CC信号为0,转换结束,读取高4位数据AND AL, 0FH ;屏蔽AL的高4位,保留AL的低4位即高4位数据MOV AH, ALINC DXIN AL, DX ;读取低8位,转换结果在AX中MOV BUFF[BX],AXINC BXINC BXLOOP LOPretstart endpcode endsend start。

汇编语言程序设计教程(第二版)习题参考答案

汇编语言程序设计教程(第二版)习题参考答案

汇编语言程序设计教程(第二版)习题参考答案第1章计算机基础知识1.计算机的应用分哪几个方面,请举例说明书中未提到的领域的计算机应用。

科学计算、数据处理、计算机控制、计算机辅助设计、人工智能、企业管理、家用电器、网络应用。

书中未提及的如:远程教育、住宅小区控制、飞行系统控制与管理等。

2.简述计算机的发展过程,请查阅相关资料,列出微机的发展过程。

电子管、晶体管、集成电路、大规模集成电路以IBM为例,微机的发展:4004、8008、8080、8086/8088、80286、80386、80486、Pentium 系列3.计算机的字长是怎么定义的,试举例说明。

计算机能同时处理二进制信息的位宽定义为计算机的字长。

如8086能同时进行16位二进制数据的运算、存储和传输等操作,该机器的字长为16位。

4.汇编语言中的基本数据类型有哪些?数值型数据和非数值型数据。

非数值数据如字符、字符串、逻辑值等。

(1)7BCH=011110111100B=1980D(2)562Q=101110010B=370D(3)90D=01011010B=5AH(4)1110100.111B=164.7Q=74.EH30H~39H 41H~5AH 61H~7AH9.在汇编语言中,如何表示二进制、八进制、十进制和十六进制的数值?用相应进制的数值加上进制标记即可。

二进制用B,如10101010B八进制用Q,如437Q。

十进制用D或不用,如54D,或54。

十六进制用H,如27A8H10.完成下列二进制数的加减运算。

(1)10101010 + 11110000 (2)11001100 + 01010100=110011010 =100100000(3)11011010 - 01010010 (4)11101110 - 01001101=10001000 =1010000111.完成下列十六进制数的加减运算。

(1)0FEA9 - 8888=7621H (2)0FFFF - 1234=EDCBH(3)0EAC0 + 0028=EAE8H (4)3ABC + 1678=5134H12.完成下列BCD码的运算。

《汇编语言程序设计》1~10章习题答案

《汇编语言程序设计》1~10章习题答案

《汇编语⾔程序设计》1~10章习题答案1.11.21.31.41.5 (字长 n=8)1.61.7(1) (2) (3) (4) (5)1.8 设补码长度为字节(即为8位)1.9(1) 21-(-18)= 15H-0EEH= 27H (2) 71- 36 = 47H- 24H= 23H (3) -5+ 120 =0FBH+ 78H= 73H (4) -10- 20 =0F6H- 14H=0E2H (5) -85-(-40)=0ABH-0D8H=0D3H 1.1057H,69H,6EH,64H,6FH,77H,73H,20H,39H,35H, 56H,69H,73H,75H,61H,6CH,20H,62H,61H,73H,69H,63HP26第⼆章习题·答案2.6 见P19堆栈:内存中以”先⼊后出”为原则存取、最⼤空间为64KB 的存储区域称之为堆栈栈底:栈区最⾼地址单元的前⼀个单元为栈底4017H:000AH=4017AH 4015H:002AH=4017AH 4010H:007AH=4017AH 说明了同⼀个物理地址可以⽤多个逻辑地址表⽰。

3.1(1) 寄存器寻址(2) 寄存器间接寻址, 物理地址=30700H(3) 变址寻址/寄存器相对寻址,物理地址=31804H(4) 基址寻址/寄存器相对寻址,物理地址=41700H(5) 基址变址寻址, 物理地址=30800H(6) 相对基址变址寻址, 物理地址=42504H3.2(1) 错:源不能是基址基址寻址。

(2) 错:源和⽬不能同时为内存单元。

(3) 错:直接给出的移位位数不能是3。

(4) 错:取反指令只能有⼀个操作数。

(5) 错:不能将⽴即数直接送⼊段寄存器。

(6) 错:⽬不能是段寄存器CS。

(7) 错:第⼀个操作数不能是⽴即数。

(8) 当VALUE1为字变量时,对;否则为错:源和⽬的类型(长度)不⼀致。

(9) 错:源和⽬不能同时为段寄存器。

汇编语言(王爽)_第二版_课后题全_答案6

汇编语言(王爽)_第二版_课后题全_答案6

解题过程:物理地址=SA*16+EA20000h=SA*16+EASA=(20000h-EA)/16=2000h-EA/16EA取最大值时,SA=2000h-ffffh/16=1001h,SA为最小值EA取最小值时,SA=2000h-0h/16=2000h,SA为最大值这里的ffffH/16=fffh是通过WIN自带计算器算的按位移来算确实应该为fff.fh,这里小数点后的f应该是省略了单就除法来说,应有商和余数,但此题要求的是地址最大和最小,所以余数忽略了如果根据位移的算法(段地址*16=16进制左移一位),小数点后应该是不能省略的我们可以反过来再思考下,如果SA为1000h的话,小数点后省略SA=1000h,EA取最大ffffh,物理地址为1ffffh,将无法寻到20000H单元这道题不应看成是单纯的计算题检测点2.3下面的3条指令执行后,cpu几次修改IP?都是在什么时候?最后IP中的值是多少?mov ax,bxsub ax,axjmp ax答:一共修改四次第一次:读取mov ax,bx之后第二次:读取sub ax,ax之后第三次:读取jmp ax之后第四次:执行jmp ax修改IP最后IP的值为0000H,因为最后ax中的值为0000H,所以IP中的值也为0000H实验一查看CPU和内存,用机器指令和汇编指令编程2实验任务(1)使用Debug,将下面的程序段写入内存,逐条执行,观察每条指令执行后,CPU中相关寄存器中内容的变化。

机器码汇编指令寄存器b8 20 4e mov ax,4E20H ax=4E20H05 16 14 add ax,1416H ax=6236Hbb 00 20 mov BX,2000H bx=2000H。

汇编语言课后习题及答案 按章节 超全面

汇编语言课后习题及答案 按章节 超全面

`00第一章课外练习题一、单项选择题:1.从键盘输入的字符,在计算机内存储的是它的(A)(A)二进制编码(B)四进制编码(C)八进制编码(D)十六进制编码2.6位无符号二进制数能表示的最大十进制数是(B)。

(A)64 (B)63 (C)32 (D)31 3.十进制数269变换为十六进制数是(C)。

(A)10B (B)10C (C)10D (D)10E 4.8位的微型计算机系统是以16位来表示地址,则该微机系统有(C)个地址空间。

(A)255 (B)65535 (C)65536 (D)1048576 5.8位有符号二进制数能表示的最大十进制数是(D)。

(A)256 (B)255 (C)128 (D)127 6.十六进制数88H,可表示成下面几种形式,请找出错误的表示(D)。

(A)无符号十进制数136 (B)带符号十进制数-120(C)压缩型BCD十进制数88 (D)8位二进制数-8的补码表示7.有一个数值152,它与十六进制数6A相等,那么该数值是(B)。

(A)二进制数(B)八进制数(C)十进制数(D)四进制数8.7位ASCII总共可表示(C)个符号。

(A)256 (B)127 (C)128 (D)255 9.4B的字长是(C)。

(A)8位(B)16位(C)32位(D)64位二、判断题(判断每题正误,对的在题后括号内划“√”,错的划“×”)1.字节通常用英文单词“Bit”来表示(×)。

2.目前广泛使用的Pentium计算机其字长为5个字节(×)。

3.存储器中将8个相邻的二进制位作为一个单位,这种单位称为字节(√)。

4.微型计算机的字长并不一定是字节的整数倍(×)。

三、填空题1.8位有/无符号整数的表示范围写成16进制形式为(80~~7F)/(00~~FF)。

2.己知:计算机中有一个“01100001”编码,如果把它看作是无符号数,它是十进制什么数(97);如果认为它是BCD,则表示(01100001)BCD;认为它是某个ASCII,则代表(a)字符。

汇编语言程序设计_第6章 子程序设计(参考答案)

汇编语言程序设计_第6章 子程序设计(参考答案)

第6章子程序设计本章要点:子程序的定义、调用和返回,寄存器的保护盒恢复,参数传递方法尤其是堆栈传递参数,模块化程序设计的基本方法,DOS功能调用。

一、单项选择题6.1.1 下列叙述不正确的是(A)。

A. 在子程序中的保护现场只能用堆栈来实现B. 在子程序中的保护现场用堆栈来实现是其中的一种方法C. 在子程序中的保护现场可以有多种实现方法D. 在子程序中的保护现场可以将要保护的内容送内存变量来实现6.1.2 下列叙述不正确的是(B)。

A. 在汇编语言程序中,每一个过程允许有多条RET指令B. 在汇编语言程序中,每一个过程只允许出现一条RET指令C. 在汇编语言程序中,每一个过程结束之前一定有一条RET指令D. 在汇编语言程序中,以过程形式表示的代码段一定有一条RET指令存在6.1.3 下列叙述正确的是(B)。

A. 执行一条段内返回指令,先从堆栈弹出两个字节的内容,然后SP-2。

B. 执行一条段内返回指令,先从堆栈弹出两个字节的内容,然后SP+2。

C. 执行一条段内返回指令,先从SP-2,然后从堆栈弹出两个字节的内容。

D. 执行一条段内返回指令,先从SP+2,然后从堆栈弹出两个字节的内容。

6.1.4 在进行DOS功能调用时,其功能号应先送(C)。

A. AL寄存器B. BL寄存器C.AH寄存器D. DH寄存器二、填空题6.2.1 在子程序的设计中,通常用堆栈来保护现场和恢复现场。

而堆栈的操作原则是__先进后出,或后进先出___。

6.2.2 如果主程序和子程序在同一代码段中,则主程序调用子程序时只改变__偏移__地址;如果主程序和子程序不在同一代码段中,则主程序调用子程序时要改变__段地址和偏移_____地址。

6.2.3 一个子程序调用另一个子程序称为___子程序嵌套____;一个子程序直接或间接调用该子程序本身称为___递归(调用)_。

6.2.4 以过程定义的子程序有两种类型的属性,它们分别是___NEAR_____和___FAR_______。

汇编语言第6章答案

汇编语言第6章答案

第6章流程控制习题1。

指令指针EIP是通用寄存器还是专用寄存器?有指令能够直接给它赋值吗?哪些指令的执行会改变它的值?解答:EIP是专用寄存器,不能通过指令直接给它赋值。

可以改变其值的指令有:(1)无条件分支,包括:跳转(jmp)、调用(call)、中断(int)。

(2)条件分支,与标志位CF、OF、PF、SF、ZF相关的条件跳转指令。

(3)循环指令,LOOP、LOOPE等。

3.相对于BASIC语言中GOTO语句作用的IA-32处理器指令是哪条?跳转指令jmp习题4.IA-32处理器通过改变EIP寄存器的数值就可以改变程序,如果程序需要无条件跳转到标号done位置执行,使用“MOVL done, %EIP”语句是否可以达到,为什么?如果不能实现该功能,应该使用哪条指令?解答:不能。

不能对EIP寄存器直接赋值.使用指令jmp done可以实现。

习题6条件转移指令Jxx所利用的条件保存在何处?有多少个不同条件的转移指令?保存在EFLAGES寄存器中共16个(P107)习题7JA和JG指令发生跳转的条件都是“大于”,它们有什么区别?在处理带符号值和无符号值时有所区别。

计算无符号值时,使用JA,对于带符号值,使用JG。

习题8。

执行如下程序片断后,CMP指令分别使得5个状态标志CF、ZF、SF、OF和PF为0还是为1?它会使得哪些条件转移指令条件成立、发生转移?movl $0x20, %eaxmovl $0x80,%ebxcmpl %ebx,%eax解答:CF=1 ZF=0 SF=1 OF=0 PF=1可以使得发生转移的指令有:JC JS JP JNZ JNO习题9. 有如下程序片断,请使用一条指令代替其中的两条指令:(1)again:。

jz nextjmp againnext:(2)again:.。

jle nextjmp againnext:解答:(1)jnz again(2)jg again10.假设EAX和ESI存放的是有符号整数,EDX和EDI存放的是无符号整数,请用比较指令和条件转移指令实现以下判断:(1)若EDX > EDI,转到above执行;CMP %EDI,%EDX JA above(2)若EAX 〉ESI,转到greater执行;CMP %ESI,%EAX JG greater(3)若ECX = 0,转到zero执行;CMP $0,%ECX JE zero(4)若EAX-ESI产生溢出,转到overflow执行;CMP %ESI,%EAX JO overflow(5)若ESI≤EAX,转到less_eq执行;CMP %EAX,%ESI JLE less_eq(6)若EDI≤EDX,转到below_eq执行。

汇编语言第3版答案

汇编语言第3版答案

汇编语言第3版答案[正文]第一章:汇编语言概述汇编语言是一种低级语言,用于编写计算机程序,并且直接与计算机硬件进行交互。

它是机器语言的一种文本表示形式,利用助记符来代替二进制指令码。

汇编语言有助于我们更好地理解计算机的底层工作原理。

第二章:汇编语言的基本结构汇编语言程序由一系列指令组成,每个指令对应计算机的一条机器指令。

汇编语言程序通常包括数据段、代码段和堆栈段。

数据段用于存储程序中使用的数据,代码段包含程序的指令,堆栈段用于存储程序的运行时临时数据。

第三章:汇编语言的数据类型汇编语言中常见的数据类型包括字节(byte)、字(word)、双字(double word)和四字(quad word)。

不同的数据类型有不同的长度和表示范围。

在汇编语言中,我们需要指定每个变量的数据类型以确保正确的处理。

第四章:寄存器寄存器是计算机内部用于存储数据和进行运算的高速存储器。

常见的寄存器包括通用寄存器、指针寄存器、索引寄存器和标志寄存器。

在汇编语言中,我们可以直接使用这些寄存器来完成各种计算任务。

第五章:汇编语言的指令汇编语言提供了各种指令来执行不同的操作,例如算术操作、逻辑操作、数据传输和控制转移等。

每个指令都由助记符和操作数组成,助记符表示指令的类型,操作数表示指令的操作对象。

我们需要根据需要选择适当的指令完成特定的任务。

第六章:条件和循环条件和循环是编程中常用的控制结构,汇编语言也提供了相应的指令来支持条件和循环。

通过条件和循环结构,我们可以根据不同的条件决定程序的执行流程,以及多次执行特定的代码块。

第七章:子程序子程序是汇编语言中的一个重要概念,它可以将一组相关的指令封装成一个独立的代码块。

通过调用子程序,我们可以提高程序的复用性和可读性。

在子程序执行完毕后,程序会返回到调用子程序的位置继续执行。

第八章:中断和异常处理中断和异常是计算机系统中常见的事件,汇编语言提供了相应的指令和机制来处理这些事件。

通过中断和异常处理,我们可以在程序执行过程中对特定的事件做出响应,并进行相应的处理。

汇编语言程序设计第六七章答案

汇编语言程序设计第六七章答案

6.9SEGA SEGMENT DAX: DW 200 DAY DB 1000H DB->DWMAX DB 0,0 DB 0,0->DW 0SEGA ENDSCSEG SEGMENT ASSUME CS:CSEG ASSUME DS:SEGA CMP AX,DAX 此行前插入设置DS JG XGY JG->JA JZ ZERO MOV AX,DAY DAY->DAX XGY: MOV MAX,AX ZERO HLT ZERO 后加: ENDSENDS 前加CSEGEND START 6.12AX=0213H BX=0000H SI=0000H 0913:0000 96 57 13 BE 00 00 8A 047.3(1)CX=7 DI=OFFSET ARG+3 ZF=1 AL=0AH SI不变(2)CX=0 DI=DI+1 SI=SI+1 ZF=1 AL不变(3)CX=0 DI不变SI=SI+3 AL=30 ZF不变7.6(1)DSEG SEGMENTDA TA1 DB 12H,34H…DA TA2 DB 12H,34H…COUNT DW 10FLAG DB 0DSEG ENDSCSEG SEGMENTASSUME CS:CSEG, DS:DSEGSTART: MOV AX,DSEGMOV DS,AXLEA SI,DATA1LEA DI,DATA2MOV CX,COUNTAG: MOV AL,[SI]MOV BL,[DI]INC SIINC DICMP AL,BLLOOPZ AGJNZ STOPMOV FLAG,1STOP: MOV AX,4C00HINT 21HCSEG ENDSEND START(2)DSEG SEGMENTDA TA1 DB 12H,34H…DA TA2 DB 12H,34H…COUNT DW 10FLAG DB 0DSEG ENDSCSEG SEGMENTASSUME CS:CSEG, DS:DSEGSTART: MOV AX,DSEGMOV DS,AXMOV ES,AXLEA SI,DATA1 LEA DI,DATA2 MOV CX,COUNT REPE CMPSB JNZ STOP MOV FLAG ,1 STOP: MOV AX,4C00H INT 21H CSEG ENDS END START 7.19 0 CLDAND AL,AL (OR AL,AL ) INC BX 7.20DSEG SEGMENTDA TA DB 1524,2748,13,56,47,634 DB->DW CNT DW 6 AE DB 6 DUP (0)DB->DW DSEG ENDEND->ENDSCSEG SEGMENT ASSUME DS:DSEG,CS:CSEG START: MOV AX,DSEG MOV DS,AX MOV SI,DATA MOV->LEAMOV CX,CNT PUSH CL CL->CXAGAIN: ADD AX,[SI] 此行前面插入XOR AX,AX XOR DX,DX INC SI 此行前面插入ADC DX,0 DEC CL 此行前面插入INC SI JNZ AGAIN POP CLCL->CXDIV CX XOR BP,BP REPT1: DEC SI CMP AX,[SI]此行前面插入DEC SI JB NEXTMOV AE[BP],[SI] 内存传输数据需要中介 INC BPNEXT: DEC CX此行前面插入INCBPJNZ REPT1 MOV AH,4CH INT21HDSEG: ENDS DSEG:->CSEG END START。

汇编语言习题答案1-7

汇编语言习题答案1-7

汇编语言各章习题答案习题一参考答案1.1无符号数: 11010011=211=D3H,01110111=119=77H,10000011=131=83H,00101111=47=2FH,10101010=170=AAH带符号数:11010011= -45=D3H,01110111=+119=77H,10000011= -125=83H,00101111=+47=2FH,10101010= -86=AAH注意:表示带符号数时,为此数的补码表示。

1.2 5E8AH,0BE6H,3DEH,4940H1.3 00011101+00110101=01010010=52H=8201001001+11101000=00110001=31H=4910111110+01010010=00010000=10H=1610011010+11110001=10001011=8BH= -1171.4 00101001+01010011=01111100+00000110=10000010=82H=8201110011-00100100=01001111-00000110=01001001=49H=4901100110+00011000=01111110+00000110=10000100=84H=840000000100110010+01110101=0000000110100111+00000110=0000001000000111=0207H=2071.5 000020A3H,FF94H,00003456H,007FH,FFFFEC00H1.6 无符号数:0~65535,0000H~FFFFH;带符号数:-32768~+32767,8000H~7FFFH1.7 (1) 38H等于十进制数56,是十进制数56的补码,数字8的ASCII码,十进制数38的压缩BCD 码(2) FFH等于十进制数-1,是带符号数-1的补码,无符号数为255(3) 5AH等于十进制数90,是十进制数90的补码,大写字母Z的ASCII码(4) 0DH等于十进制数13,是十进制数13的补码,回车符的ASCII码1.8 (1) 108=01101100B=6CH,补码01101100B,压缩BCD码0000000100001000,ASCII码313038H(2) 46=00101110B=2EH,补码00101110B,压缩BCD码01000110,ASCII码3436H(3) –15=11110001B=F1H,补码11110001B,ASCII码2D3135H(4) 254=0000000011111110B=00FEH,补码0000000011111110B,压缩BCD码0000001001010100,ASCII码323534H1.9 (1) 56+63=01110111B,CF=0,SF=0,ZF=0,OF=0(2) 83-45=00100110B,CF=0,SF=0,ZF=0,OF=0(3) -74+29=11010011B,CF=0,SF=1,ZF=0,OF=0(4) -92-37=01111111B,CF=1,SF=0,ZF=0,OF=11.10 回车、换行、响铃、ESC键、空格键、@、P、p习题二参考答案2.9 最少划分为16个逻辑段,最多划分为65536个逻辑段(每段16个字节)每段最少16个字节单元,最大64K字节单元。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

6.1 下面的程序段有错吗?若有,请指出错误。

CRAY PROCPUSH AXADD AX, BXRETENDP CRAY答:程序有错。

改正如下:CRAY PROCADD AX, BXRETCRAY ENDP ;CRAY是过程名,应放在ENDP的前面6.2 9BHF7H57H80HF0A0:00B0H先PUSH,SP-2再PUSH,SP-2POP, SP+26.2 题堆栈及SP内容的变化过程已知堆栈寄存器SS的内容是0F0A0H,堆栈指示器SP的内容是00B0H,先执行两条把8057H 和0F79BH分别入栈的PUSH指令,然后执行一条POP指令。

试画出示意图说明堆栈及SP 内容的变化过程。

答:变化过程如右图所示:6.3 分析下面的程序,画出堆栈最满时各单元的地址及内容。

;********************************************S_SEG SEGMENT AT 1000H ;定义堆栈段DW 200 DUP (?) ;200*2=190HTOS LABEL WORDS_SEG ENDS;********************************************C_SEG SEGMENT ;定义代码段ASSUME CS: C_SEG, SS: S_SEGSTART: MOV AX, S_SEG(FLAGS)(AX)T_ADDR0000(DS)1000:0184:0186:0188:018A:018C:018ESP:01866.3 题堆栈最满时各单元的地址及内容MOV SS, AXMOV SP, OFFSET TOSPUSH DSMOV AX, 0PUSH AX┇PUSH T_ADDRPUSH AXPUSHF┇POPFPOP AXPOP T_ADDRRET;-------------------------------------------------------------------------- C_SEG ENDS ;代码段结束;******************************************END START ;程序结束答:堆栈最满时各单元的地址及内容如右图所示:6.4 分析下面的程序,写出堆栈最满时各单元的地址及内容。

;******************************************** STACK SEGMENT AT 500H ;定义堆栈段DW 128 DUP (?)TOS LABEL WORDSTACK ENDS;******************************************** CODE SEGMENT ;定义代码段MAIN PROC FAR ;主程序部分ASSUME CS: CODE, SS: STACKSTART: MOV AX, STACKMOV SP, OFFSET TOSPUSH DSSUB AX, AXPUSH AX;MAIN PART OF PROGRAM GOES HEREMOV AX, 4321HCALL HTOARETMAIN ENDP ;主程序部分结束;-------------------------------------------------------------------- HTOA PROC NEAR ;HTOA子程序CMP AX, 15JLE B1PUSH AX0500:00EC:00EE:00F0:00F2:00F4:00F6:00F8:00FA:00FC:00FESP:00EE返回POP BP地址0003H返回POP BP地址0002H返回POP BP地址0001H主程序返回地址0000(DS)6.4 题堆栈最满时各单元的地址及内容PUSH BPMOV BX, [BP+2]AND BX, 000FHMOV [BP+2], BXPOP BPMOV CL, 4SHR AX, CLCALL HTOAPOP BPB1: ADD AL, 30HCMP AL, 3AHJL PRINTITADD AL, 7HPRINTIT: MOV DL, ALMOV AH, 2INT 21HRETHOTA ENDP ;HOTA子程序结束;--------------------------------------------------------------------CODE ENDS ;代码段结束;******************************************END START ;程序结束答:堆栈最满时各单元的地址及内容如右上图所示:6.5 下面是一个程序清单,请在下面的图中填入此程序执行过程中的堆栈变化。

;*************************0000 STACKSG SEGMENT0000 20 [. DW 32 DUP (?)]0040 STACKSG ENDS;*************************0000 CODESG SEGMENT PARA ‘CODE’;--------------------------------------0000 BEGIN PROC FARASSUME CS: CODESG, SS: STACKSG0000 1E PUSH DS0001 2B C0 SUB AX, AX0003 50 PUSH AX0004 E8 0008 R CALL B10;--------------------------------------0007 CB RET0008 BEGIN ENDP;--------------------------------------0008 B10 PROC0008 E8 000C R CALL C10;--------------------------------------000B C3 RET000C B10 ENDP;--------------------------------------000C C10 PROC;--------------------------------------000C C3 RET000D C10 ENDP;--------------------------------------000D CODESG ENDS;*************************END BEGIN答:程序执行过程中的堆栈变化如下图所示。

( 0016H )( 0018H )( 001AH )( 001CH )( 001EH )( 0020H )SP:(DS)( 0016H )( 0018H )( 001AH )( 001CH )( 001EH )( 0020H )0000(DS)( 0016H )( 0018H )( 001AH )( 001CH )( 001EH )( 0020H )0007 0000 (DS)0020H001EH001CH001AH( 0016H ) ( 0018H ) ( 001AH ) ( 001CH ) ( 001EH ) ( 0020H )000B 0007 0000 (DS)( 0016H ) ( 0018H ) ( 001AH ) ( 001CH ) ( 001EH ) ( 0020H ) SP:000B 0007 0000 (DS)( 0016H ) ( 0018H ) ( 001AH )( 001CH )( 001EH )( 0020H )000B00070000(DS)( 0016H )( 0018H )( 001AH )( 001CH )( 001EH )( 0020H )000B00070000(DS)0018H001AH001CH0020H( 0016H )( 0018H )( 001AH )( 001CH )( 001EH )( 0020H )BEGIN PUSH DS PUSH AX CALL B10 偏移地址堆栈6.6 写一段子程序SKIPLINES,完成输出空行的功能。

空出的行数在AX寄存器中。

答:程序如下:CSEG SEGMENTSKIPLINES PROC FARASSUME CS: CSEGBEGIN: PUSH CXPUSH DXMOV CX, AXDISP: MOV DL, 0DH ;显示回车换行,即输出空行MOV AH, 2 ;显示一个字符的DOS调用INT 21HMOV DL, 0AHMOV AH, 2 ;显示一个字符的DOS调用INT 21HLOOP DISPPOP DXPOP CXRETSKIPLINES ENDPEND6.7 设有10个学生的成绩分别是76,69,84,90,73,88,99,63,100和80分。

试编制一个子程序统计60~69分,70~79分,80~89分,90~99分和100分的人数,分别存放到S6,S7,S8,S9和S10单元中。

答:程序如下:DSEG SEGMENTRECORD DW 76,69,84,90,73,88,99,63,100,80S6 DW 0S7 DW 0S8 DW 0S9 DW 0S10 DW 0DSEG ENDS;******************************************CSEG SEGMENTMAIN PROC FARASSUME CS: CSEG, DS: DSEGSTART: PUSH DS ;设置返回DOSSUB AX, AXPUSH AXMOV AX, DSEGMOV DS, AX ;给DS赋值BEGIN: MOV CX, 10CALL COUNT┇;后续程序RETMAIN ENDP;--------------------------------------------------------------------------COUNT PROC NEAR ;成绩统计子程序MOV SI, 0NEXT: MOV AX, RECORD[SI]MOV BX, 10 ;以下5句是根据成绩计算相对S6的地址变化量DIV BL ;计算公式为:((成绩)/10-6)*2送(BX)MOV BL, AL ;此时(BH)保持为0不变SUB BX, 6 ;应为只统计60分以上成绩SAL BX, 1 ;(BX)*2INC S6[BX] ;S6是S6,S7,S8,S9和S10单元的首地址ADD SI, 2LOOP NEXTRETCOUNT ENDP ;COUNT子程序结束;--------------------------------------------------------------------------CSEG ENDS ;以上定义代码段;******************************************END START6.8 编写一个有主程序和子程序结构的程序模块。

相关文档
最新文档