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

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.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版 第六单元

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章习题答案

习题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位二进制补码计算下列各题,并用十六进制数表示其运算结果。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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 编写一个有主程序和子程序结构的程序模块。