微机基础原理与接口技术(楼顺天第二版)第四章习题集解答.doc
-/微机原理与接口技术(楼顺天第二版)习题解答第4章 汇编语言程序设计4.1、已知在BUF的起始处保存有N个字符的ASCII码,编写汇编语言程序实现,将这组字符串传送到缓冲区BUFR中,并且使字符串的顺序与原来的顺序相反。答: BUF DB BONJOUR_BELLEBUFRDB 100 DUP(?)MOV CX, NLEA SI, BUFLEA DI, BUFRADD DI,CXDEC DIL1:MOV AL,SIMOV DI,ALINC SIDEC DILOOP L14.2、利用移位、传送和相加指令实现AX的内容扩大10倍。答:将扩大后的结果放在DX:AX中,注意到10AX8AX2AX。XOR DX,DXSHL AX, 1RCLDX, 1MOV BX,AXMOVCX,DXSHL AX, 1RCLDX, 1SHL AX, 1RCLDX, 1ADD AX, BXADCDX, CX4.3、在缓冲区VAR中连续存放着3个16位的无符号数,编写程序实现将其按递增关系排列;如果VAR中保存的为有符号数,则再编写程序实现将其按递减关系排列。答:VAR DW 1236,-432,3900XOR SI,SIMOV AX,VARSICMP AX, VARSI+2JAE L1XCHG AX, VARSI+2L1: CMP AX, VARSI+4JAE L2XCHG AX, VARSI+4L2:MOV VARSI, AXMOV AX,VARSI+2CMP AX, VARSI+4JAE L3XCHG AX, VARSI+4L3: MOV VARSI+2, AX4.4、编写程序段实现将AL和BL中的每一位依次交叉,得到的16位字保存在DX中,例如(AL)01100101B,(BL)11011010B,则得到的(DX)10110110 10011001B。答:利用移位指令完成。XOR DX,DXMOV CX,8L1:SHR AL,1RCR DX,1SHR BL,1RCR DX,1LOOP L14.5、在变量VAR1和VAR2中分别保存有两个字节型的正整数,编写完整的汇编语言程序实现:(1)当两数中有一个奇数时,将奇数存入VAR1,偶数存入VAR2;(2)当两数均为奇数时,两个变量的内容不变;(3)当两数均为偶数时,两数缩小一倍后存入原处。答:当VAR1为奇数时,不论VAR2的奇偶性,这两个单元的内容均不变;只有当VAR1为偶数时,如果VAR2为奇数,则VAR1与VAR2内容交换;如果VAR2为偶数,则两数缩小一倍后存入原处。DATA SEGMENT VAR1 DB 28 VAR2 DB 36DATA ENDSCODE SEGMENT ASSUME CS:CODE, DS:DATA, ES:DATASTART:MOV AX, DATAMOV DS,AXMOV ES, AXMOV AL,VAR1MOV BL,VAR2TESTAL,1JZ EVEN1JMP OVER EVEN1: TESTBL,1 JZ EVEN2 MOV VAR1,BLMOVVAR2,ALJMPOVEREVEN2:SHRAL,1MOVVAR1,ALSHRBL,1MOVVAR2,BL OVER:MOV AH,4CHMOV AL,0INT 21HCODEENDSEND START4.6、已知在字变量VAR1、VAR2和VAR3中保存有3个相同的代码,但有一个错码,编写程序段找出这个错码,并将它送到AX,其地址送SI;如果3个代码都相同,则在AX中置1标志。答:在数据段中定义:VAR1 DW 5A34HVAR2 DW 5A35HVAR3 DW 3A34H 在代码段中编写程序段:MOV AX,-1MOV BX,VAR1CMP BX,VAR2JZ L2CMP BX,VAR3JZ L1MOV AX,BXLEA SI,VAR1JMP OVERL1:MOV AX,VAR2LEA SI,VAR2JMP OVERL2:CMP BX,VAR3JZ OVERMOV AX,VAR3LEA SI,VAR3OVER:4.7、分析下列程序段的功能:MOV CL,04SHL DX,CLMOV BL,AHSHL AX,CLSHR BL,CLOR DL,BL解:程序段完成DX:AX组成的32位无符号数左移4位,低位补零(也即除以16)。4.8、阅读下列程序段,指出它完成什么运算。CMP AX, 0JGE EXITNEG AXEXIT: 答:取AX的绝对值。4.9、答:将DX中的值转换为相应的ASCII码字符存入DISP对应的4字节存储单元中。例如DX=3F0BH,则在DISP中存放3, F, 0, B。4.10、答:将FIRST和SECOND数据相加,结果存入FIRST中,FIRST中的结果为:10H,61H,01H。4.11、答:将从390H端口读入的数据的低4位转换为对应16进制数的ASCII码,然后往390H端口输出。例如读入的数据为29H,则输出9, 读入的数据为1BH,则输出B。4.12、答:实际上完成BX内容循环右移2位,因此,BX寄存器的内容为C02DH。4.13、答:完成BX内容逻辑右移5位,因此,BX寄存器的内容为03EAH。4.14、答:(1)AX=FFF3H,DX=FFFAH;(2)AX=1FF2H,DX=0002H4.15、答:AX=FFFCH,BX=200AH,CX=0008H,DX=2010H,SI=2000H4.16、答:LEA SI,BUFFERSLEA DI,BUFFERTMOV CX,NADD DI,NADD DI,NSUB DI,2L1:MOV AX,SIMOV DI,AXADD SI,2SUB DI,2LOOP L14.17、答:ENCRPYTION PROC NEAR LEA SI,ARRAY XOR DX,DX MOV AX,SI MOV BX,5 DIV BX MOV CX, AX ADD SI, 2L1: MOV AX, SI XOR AX,0AAAAH MOV SI, AX ADD SI,10 LOOP L1 RETENCRPYTION ENDP4.18、答:DATA SEGMENT ARRAY DB 12,28,128,35,46,69,120,89,93,100,112,125,200DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART: MOV AX,DATA MOV DS,AX XOR CX,CX MOV CL,ARRAY ;数据个数存入AX MOV SI,OFFSET ARRAY+1 ;SI存放第一个数的偏移地址 XOR DX,DX XOR AX,AX ;AX用来存放和,首先清零XH: XOR BX,BX MOV BL,SI ADD AX,BX JNC BUYICHU ADD DX,1BUYICHU:INC SI LOOP XH CMP DX,0 JZ OVER MOV DX,-1OVER: HLTCODE ENDSEND START4.19、答:程序如下:MOV CX,NLEA SI,BUFMOV AX,SIMOV DX,AXADD SI,2L1:CMP AX,SIJBE NOCHG1XCHG AX,SINOCHG1:CMP DX,SIJAE NOCHG2XCHG DX,SINOCHG2: ADD SI,2LOOP L1如果BUF中存放的是有符号数,则只需要将程序中的两行内容修改:JBE NOCHG1改成:JLE NOCHG1JAE NOCHG2改成:JGE NOCHG24.20、答:设BUFFER中存放的是字节型数据。采用双指针方法:SI为读指针,DI为写指针,从低地址开始,内存中读出一个字节,如果不为0,则写入内存;如果为0,则不进行写操作。LEA SI, BUFFERXOR CX,CXMOV CL, SIINC SIMOV DI, SIXOR BH,BHXOR AL,ALL1:CMP SI,ALJZ L2MOV BL,SIMOV DI,BLINC DIINC BHL2:INC SILOOP L1MOV BUFFER,BH4.21、答:MOV CX,N MOV BX,BUF1 MOV SI,0 MOV DI,OFFSET PRODUCTXH: MOV AX,BUFNSI PUSH AX MUL BX MOV DI,AX ;乘积低位字 ADD DI,2 MOV DI,DX ;乘积高位字 POP AX XOR DX,DX DIV BX MOV QUOTIENTSI,AX ;商 MOV REMAINDERSI,DX ;余数 ADD SI,2 LOOP XH 4.22、答:统计AL中1的个数,只需将AL右移,移出的一位内容进行累加,子程序为:COUNTBYTE PROC NEAR PUSH AX PUSH CX MOV CX,8 XOR BL,BLCOU1: SHR AL,1 ADC BL,0 LOOP COU1 POP CX POP AX RETCOUNTBYTE ENDP在此基础上,可以检测出字节型缓冲区BUF中0和1个数相等的元素个数,即一个字节中有4个1。设BUF中有N个字节型数据,结果保持在BH中。MOV CX,NLEA SI, BUFXOR BH,BHL1: MOV AL,SICALL COUNTBYTECMP BL,4JNZ L2INC BHL2: INC SILOOP L14.23、答:4.24、答:4.25、答:;产生N个伪随机数 MOV CX,N MOV SI,OFFSET NUM XOR AH,AH MOV AL,23XH: MOV SI,AL PUSH AX ADD AX,0 JNP FEIJISHU INC CNT ADD SUMODD,AXFEIJISHU: POP AX ADD AL,17 INC SI LOOP XH 4.26、答:4.27、答:4.28、答:4.29、答:4.30、答:4.31、答:4.32、答:4.33、答: STACK SEGMENT STACK STACK DW 100H DUP(?) TOP LABEL BYTESTACK ENDSDATA SEGMENTBUFFER DB 3 ;首字节为字符串长度 DB ABC ;字符串DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACKSTART: MOV AX,STACK MOV SS,AX LEA SP,TOP MOV AX,DATA MOV DS,AX MOV ES,AX LEA DI,BUFFER XOR CX,CX MOV CL,DI INC DI CALL SETEVEN MOV AH,4CH;返回DOS MOV AL,0 INT 21HSETEVEN PROC NEAR ;加偶校验子程序 PUSH AX PUSH BX PUSH CX PUSH DISETEVEN1: MOV AL,DI CALL COUNTBYTE AND BL,01H JZ SETEVEN2 OR AL,80H MOV DI,ALSETEVEN2: INC DI LOOP SETEVEN1 POP DI POP CX POP BX POP AX RETSETEVEN ENDPCOUNTBYTE PROC NEAR PUSH AX PUSH CX MOV CX,8 XOR BL,BLCOU1: SHR AL,1 ADC BL,0 LOOP COU1 POP CX POP AX RETCOUNTBYTE ENDPCODE ENDSEND START4.34、答: MOV AX,SI2*N TEST AX,8000H JZ OVER MOV CX,NXH: MOV AX,SI NEG AX MOV SI,AX ADD SI,2 LOOP XH OVER:NOP4.35、答:设奖斐波那契数列存放在字变量RESULT中。在数据段中定义 RESULT DW 100H DUP(?)在代码段中编写子程序FIBONACCIPROC NEAR XOR DI,DI MOV RESULTDI,1 ;前两个数为1 MOV RESULTDI+2,1 ADD DI,4 MOV CX,NL1: MOV AX, RESULTDI-4 ADD AX, RESULTDI-2 MOV RESULTDI,AX ADD DI,2 LOOP L1 RETFIBONACCI ENDP4.36、答:在数据段中定义变量:TABLE DW INFORM1, INFORM2, INFORM3, INFORM4, INFORM5 DW INFORM6, INFORM7, INFORM8, INFORM9, INFORM10在代码段中编写程序段:MOVCX,10XORSI,SIL1:MOVDX,TABLESIMOVAH,9INT21HADDSI,2CALLWAITLOOPL1这里,WAIT为延时子程序,用于在显示信息之间的停顿。4.37、答:先编写一个子程序DISPALD,完成以3位十进制数形式显示出AL的内容。DISPALDPROC NEARPUSH AXPUSH CXPUSH DXXOR AH,AHMOV CL,100DIV CLPUSH AXMOV DL,30HADD DL,ALMOV AH,2INT 21HPOP AXMOV AL,AHXOR AH,AHMOV CL,10DIV CLPUSH AXMOV DL,30HADD DL,ALMOV AH,2INT 21HPOP AXMOV DL,30HADD DL,AHMOV AH,2INT 21HPOP DXPOP CXPOP AXRETDISPALDENDP在此基础上,根据题目要求,需要用到3个指针:SI指向源数组ARRAY,DI指向正数数组ARRAYP,BX指向负数数组ARRAYN。MOVCX,20XORDX,DXLEA SI,ARRAYLEA DI,ARRAYPLEA BX,ARRAYNL1:MOVAL,SIANDAL,ALJSL2MOVDI,ALINCDIINC DLJMPL3L2:MOVBX,ALINCBXINC DHL3:INCSILOOPL1MOVAL,DLCALLDISPALDMOVAL,DHCALLDISPALD4.38、答:设BUFFER中存放的是有符号数。MOV CX,100LEA SI,BUFFERMOV AX, 7FFFHL1:AND WORD PTR SI,1JNZ L2CMP SI,AXJGE L2MOV AX,SIL2:ADD SI,2LOOP L14.39、答:BL用于存放项数。STACK SEGMENT STACK STACK DW 100H DUP(?)TOP LABEL WORDSTACK ENDSDATA SEGMENT DB 100H DUP(?)DATA ENDSCODE SEGMENT ASSUME CS:CODE, DS:DATA, ES:DATA, SS:STACKSTART: MOV AX,DATA MOV DS,AX MOV ES,AX MOV AX,STACK MOV SS,AX LEA SP,TOP MOV BL,1 MOV CX,0 COUNT: MOV AL, BL MUL BL ADD CX,AX CMP CX,2000 JA EXIT INC BL JMP COUNTEXIT:4.40、答:设数据段的段名为SEGNAME,则有SEGINTODS MOCRO SEGNAMEMOV AX, SEGNAMEMOV DS,AXENDMSEGINTOES MOCRO SEGNAMEMOV AX, SEGNAMEMOV ES,AXENDM4.41、答:设输入字符串保存在BUFIN中,则有:INSTRMACRO BUFINMOVAH, 10LEADX, BUFININT21HENDM 应该注意,BUFIN为键盘缓冲区,应该满足格式要求,详见INT 21H的10号功能说明。4.42、答:CRLFMACROMOVAH, 02MOVDL, 10INT21HMOVDL, 13INT21HENDM4.43、答:设DF=0(1)L1:MOV AL, SIMOV ES:DI, ALINCSIINCDILOOP L1(2)L1:MOV AL, SIINCSILOOP L1(3)L1:MOV ES:DI, AL INCDILOOP L1(4)L1:MOV AL, SICMP AL, ES:DIINCSIINCDILOOP L14.44、答: STR1中有17个字符(含一个空格),设DS和ES均指向STR1和STR2所在的段。(1)CLDMOVCX,17LEASI,STR1LEADI,STR2REPMOVSB(2)MOVCX,17LEASI,STR1LEADI,STR2ADDSI,CXDECSIL1:MOVAL,SIMOVDI,ALDECSIINCDILOOPL1(3)LEASI,STR1MOVDX,SI+6(4)MOVCX,17LEASI,STR1MOVAL,20HL1:CMP SI, ALJZL2INCSILOOPL1L2:4.45、答: STRING中保存了30个字符。MOVCX,30LEASI,STRINGMOVAL,&L1:CMPSI,ALJNZL2MOVBYTE PTR SI,/L2:INCSILOOPL14.46、答:将缓冲区FIRST中100个字节传送到SECOND中。4.47、答:在缓冲区STRING中搜索非空格字符,如果有非空格则转到FOUND,如果200个单元中都是空格,则转到NOT_FOUND。4.48、答:设DS和ES均指向字符串OLDS和NEWS所在的段。CLDMOVCX,5LEASI,OLDSLEADI,NEWSREPZCMPSBJNZNEW_LESS4.49、答:设STRING中的字符个数为N。MOVCX,NLEASI,STRINGMOVAL,5FHL1:ANDSI,ALINCSILOOP L14.50、答:利用字符串操作指令比较方便,也可以采用循环完成。(1) TASK1 MOVCX, 50MOVAL, 20HLEADI, STUDENT_PRINTREPSTOSB(2) TASK2MOVCX, 9MOVAL, _LEADI, STUDENT_ADDRREPNZSCASBJZFOUNDNOT_FOUND:FOUND:(3) TASK3MOVCX, 9MOVAL, _LEADI, STUDENT_ADDRADDDI, CXSTDREPNZSCASBJZFOUNDNOT_FOUND:FOUND:(4) TASK4MOVCX, 30MOVAL, 20HLEADI, STUDENT_ NAMEREPZSCASBJNZNOT_FOUNDMOVCX, 50MOVAL, *LEADI, STUDENT_PRINTREPSTOSBNOT_FOUND:(5) TASK5MOVCX, 30LEASI, STUDENT_ NAMELEADI, STUDENT_PRINTREPMOVSBLEASI, STUDENT_ ADDRMOVCX, 9REPMOVSB4.51、答:4.52、答:4.53、答: 4.54、答:先讨论随机数产生方法,通常采用同余法:可以产生0到N-1之间的随机数,其中,称为种子,且位于0,N-1,当取不同值是产生不同的随机数列。为任意正整数,一般取小于N的质数,N越大随机性越好。这里我们可以进一步简化:取,这样就不需要进行乘法运算。种子相同,其产生的随机数序列是相同的,因此应该选择随机的种子,这一点很重要。我们这里采取读取机器时钟,取其百分之一秒值作为种子。程序如下: M=45N=50STACK SEGMENT DW 100H DUP(?)TOP LABEL WORDSTACK ENDSDATA SEGMENTPARAADB 23PARABDB 11SCORE DB N*5 DUP(50)MEANSCORE DB N DUP(0)LEVELDB 6 DUP(0)STR0DB Total : ,2 DUP(?),0AH,0DH,$STR1 DB LevleA: ,2 DUP(?),0AH,0DH,$STR2 DB LevleB: ,2 DUP(?),0AH,0DH,$STR3 DB LevleC: ,2 DUP(?),0AH,0DH,$STR4 DB LevleD: ,2 DUP(?),0AH,0DH,$STR5 DB LevleE: ,2 DUP(?),0AH,0DH,$STR6 DB LevleF: ,2 DUP(?),0AH,0DH,$DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACKSTART: MOV AX,DATA MOV DS,AX MOV ES,AX MOV AX,STACK MOV SS,AX LEA SP,TOP; Input score dataMOV AH,2CHINT 21HSEED:CMP DL,NJBE BELOWSUB DL,NJMP SEEDBELOW: MOV AL,DL MOV CX,M*5 LEA SI,SCORE MOV BL,PARAAXOR DX,DXMOV DL,PARABLP: ADD SI,AL INC SIMUL BL ADD AX,DXLP1:CMP AX,NJB BELOW1SUB AX,NJMP LP1BELOW1: LOOP LP; Computing mean score for every student MOV CX,M LEA SI,SCORE LEA DI,MEANSCORE MOV BL,5LP2:XOR AX,AX PUSH CXMOV CX,5LP3: ADD AL,SIADC AH,0INC SILOOP LP3DIV BLMOV DI,ALINC DIPOP CXLOOP LP2; Counting levelsLEA SI,MEANSCOREMOV CX,MLP4:MOV AL,SICMP AL,90JB LEVELAINC LEVELJMP LP5LEVELA:CMP AL,80JB LEVELBINC LEVEL+1JMP LP5LEVELB:CMP AL,70JB LEVELCINC LEVEL+2JMP LP5LEVELC:CMP AL,66JB LEVELDINC LEVEL+3JMP LP5LEVELD:CMP AL,60JB LEVELEINC LEVEL+4JMP LP5LEVELE:INC LEVEL+5LP5:INC SILOOP LP4; Display the resultMOV AL,MCALL TRANSMOV STR0+8,ALMOV STR0+9,AHMOV AH,9LEA DX, STR0INT 21HMOV CX,6LEA BX,STR1LEA SI,LEVELLP6:MOV AL,SIINC SICALL TRANSMOV BX+8,ALMOV BX+9,AHMOV AH,9MOV DX,BXINT 21HADD BX,13LOOP LP6 MOV AH,4CH ;Return to DOS MOV AL,0 INT 21HTRANSPROC NEARPUSH BXMOV BL,10XOR AH,AHDIV BL ADD AX,3030HPOP BXRETTRANS ENDPCODE ENDS END START4.55、答:程序的编程思路为:程序共5个功能,可采用跳转表法来实现多路分支结构程序设计。现将这5个程序段,各程序段的首地址分别标号为G1,G2,G3,G4,G5。将5个程序段的入口地址做成表TABLE放入数据段,程序根据给定的参数计算出欲转入的程序段的首地址在TABLE中的位置后,取出该地址,跳转至该程序段。首先,通过调用子程序MENU,设置显示器,并输出提示文档。接着,读取1-5之间的ASCII表示数。然后,通过跳转表TABLE实现由输入参数转入相应的程序段。由于表中按“字”存放数据,则每个数据的位移量是:0、2、4、6、8。对于输入参数N,计算位移量的公式是N=(N-1)*2。当输入1时,跳转到标号G1。调用子程序CHGLTR,完成将输入字符串中的小写字母变换成大写字母。用户按键,若为ESC,则转到主程序段首调用MENU,否则,转到标号G1;当输入2时,跳转到标号G2。调用子程序MAXLTR,完成在输入字符串中找最大值。用户按键,若为ESC,则转到主程序段首调用MENU,否则,转到标号G2;当输入3时,跳转到标号G3。调用子程序SORTNUM,完成输入数据组的排序。用户按键,若为ESC,则转到主程序段首调用MENU,否则,转到标号G3。当输入4时,跳转到标号G4。调用子程序TIMCHK,完成时间的显示。用户按键,若为ESC,则转到主程序段首调用MENU,否则,转到标号G4。当输入5时,跳转到标号G5。结束程序的运行,返回操作系统。程序流程框图见图4-1。图4-1 主程序流程框图START初始化调用子程序MENU设置光标位置(41,10)带回显的控制台输入(AL) 输入字符(AL) 5将跳转表TABLE的偏移地址送入(BX)(AL) (AL) 1(AL) (AL) * 2AL按符号扩展成AX(BX) TABLE(BX) (B
收藏
- 资源描述:
-
-/
微机原理与接口技术(楼顺天第二版)习题解答
第4章 汇编语言程序设计
4.1、已知在BUF的起始处保存有N个字符的ASCII码,编写汇编语言程序实现,将这组字符串传送到缓冲区BUFR中,并且使字符串的顺序与原来的顺序相反。
答: BUF DB "BONJOUR_BELLE"
BUFR DB 100 DUP(?)
MOV CX, N
LEA SI, BUF
LEA DI, BUFR
ADD DI,CX
DEC DI
L1:
MOV AL,[SI]
MOV [DI],AL
INC SI
DEC DI
LOOP L1
4.2、利用移位、传送和相加指令实现AX的内容扩大10倍。
答:将扩大后的结果放在DX:AX中,注意到10AX=8AX+2AX。
XOR DX,DX
SHL AX, 1
RCL DX, 1
MOV BX,AX
MOV CX,DX
SHL AX, 1
RCL DX, 1
SHL AX, 1
RCL DX, 1
ADD AX, BX
ADC DX, CX
4.3、在缓冲区VAR中连续存放着3个16位的无符号数,编写程序实现将其按递增关系排列;如果VAR中保存的为有符号数,则再编写程序实现将其按递减关系排列。
答:VAR DW 1236,-432,3900
XOR SI,,SI
MOV AX,VAR[SI]
CMP AX, VAR[SI+2]
JAE L1
XCHG AX, VAR[SI+2]
L1:
CMP AX, VAR[SI+4]
JAE L2
XCHG AX, VAR[SI+4]
L2:
MOV VAR[SI], AX
MOV AX,VAR[SI+2]
CMP AX, VAR[SI+4]
JAE L3
XCHG AX, VAR[SI+4]
L3:
MOV VAR[SI+2], AX
4.4、编写程序段实现将AL和BL中的每一位依次交叉,得到的16位字保存在DX中,例如(AL)=01100101B,(BL)=11011010B,则得到的(DX)=10110110 10011001B。
答:利用移位指令完成。
XOR DX,DX
MOV CX,8
L1:
SHR AL,1
RCR DX,1
SHR BL,1
RCR DX,1
LOOP L1
4.5、在变量VAR1和VAR2中分别保存有两个字节型的正整数,编写完整的汇编语言程序实现:
(1)当两数中有一个奇数时,将奇数存入VAR1,偶数存入VAR2;
(2)当两数均为奇数时,两个变量的内容不变;
(3)当两数均为偶数时,两数缩小一倍后存入原处。
答:当VAR1为奇数时,不论VAR2的奇偶性,这两个单元的内容均不变;只有当VAR1为偶数时,如果VAR2为奇数,则VAR1与VAR2内容交换;如果VAR2为偶数,则两数缩小一倍后存入原处。
DATA SEGMENT
VAR1 DB 28
VAR2 DB 36
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA, ES:DATA
START:
MOV AX, DATA
MOV DS,AX
MOV ES, AX
MOV AL,VAR1
MOV BL,VAR2
TEST AL,1
JZ EVEN1
JMP OVER
EVEN1:
TEST BL,1
JZ EVEN2
MOV VAR1,BL
MOV VAR2,AL
JMP OVER
EVEN2:
SHR AL,1
MOV VAR1,AL
SHR BL,1
MOV VAR2,BL
OVER:
MOV AH,4CH
MOV AL,0
INT 21H
CODE ENDS
END START
4.6、已知在字变量VAR1、VAR2和VAR3中保存有3个相同的代码,但有一个错码,编写程序段找出这个错码,并将它送到AX,其地址送SI;如果3个代码都相同,则在AX中置-1标志。
答:在数据段中定义:
VAR1 DW 5A34H
VAR2 DW 5A35H
VAR3 DW 3A34H
在代码段中编写程序段:
MOV AX,-1
MOV BX,VAR1
CMP BX,VAR2
JZ L2
CMP BX,VAR3
JZ L1
MOV AX,BX
LEA SI,VAR1
JMP OVER
L1:
MOV AX,VAR2
LEA SI,VAR2
JMP OVER
L2:
CMP BX,VAR3
JZ OVER
MOV AX,VAR3
LEA SI,VAR3
OVER:
4.7、分析下列程序段的功能:
MOV CL,04
SHL DX,CL
MOV BL,AH
SHL AX,CL
SHR BL,CL
OR DL,BL
解:程序段完成DX:AX组成的32位无符号数左移4位,低位补零(也即除以16)。
4.8、阅读下列程序段,指出它完成什么运算。
CMP AX, 0
JGE EXIT
NEG AX
EXIT: …
答:取AX的绝对值。
4.9、答:将DX中的值转换为相应的ASCII码字符存入DISP对应的4字节存储单元中。例如DX=3F0BH,则在DISP中存放3, F, 0, B。
4.10、答:将FIRST和SECOND数据相加,结果存入FIRST中,FIRST中的结果为:10H,61H,01H。
4.11、答:将从390H端口读入的数据的低4位转换为对应16进制数的ASCII码,然后往390H端口输出。例如读入的数据为29H,则输出9, 读入的数据为1BH,则输出B。
4.12、答:实际上完成BX内容循环右移2位,因此,BX寄存器的内容为C02DH。
4.13、答:完成BX内容逻辑右移5位,因此,BX寄存器的内容为03EAH。
4.14、答:(1)AX=FFF3H,DX=FFFAH;(2)AX=1FF2H,DX=0002H
4.15、答:AX=FFFCH,BX=200AH,CX=0008H,DX=2010H,SI=2000H
4.16、答:LEA SI,BUFFERS
LEA DI,BUFFERT
MOV CX,N
ADD DI,N
ADD DI,N
SUB DI,2
L1:
MOV AX,[SI]
MOV [DI],AX
ADD SI,2
SUB DI,2
LOOP L1
4.17、答:ENCRPYTION PROC NEAR
LEA SI,ARRAY
XOR DX,DX
MOV AX,[SI]
MOV BX,5
DIV BX
MOV CX, AX
ADD SI, 2
L1:
MOV AX, [SI]
XOR AX,0AAAAH
MOV [SI], AX
ADD SI,10
LOOP L1
RET
ENCRPYTION ENDP
4.18、答:DATA SEGMENT
ARRAY DB 12,28,128,35,46,69,120,89,93,100,112,125,200
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
XOR CX,CX
MOV CL,ARRAY ;数据个数存入AX
MOV SI,OFFSET ARRAY+1 ;SI存放第一个数的偏移地址
XOR DX,DX
XOR AX,AX ;AX用来存放和,首先清零
XH: XOR BX,BX
MOV BL,[SI]
ADD AX,BX
JNC BUYICHU
ADD DX,1
BUYICHU:INC SI
LOOP XH
CMP DX,0
JZ OVER
MOV DX,-1
OVER: HLT
CODE ENDS
END START
4.19、答:程序如下:
MOV CX,N
LEA SI,BUF
MOV AX,[SI]
MOV DX,AX
ADD SI,2
L1:
CMP AX,[SI]
JBE NOCHG1
XCHG AX,[SI]
NOCHG1:
CMP DX,[SI]
JAE NOCHG2
XCHG DX,[SI]
NOCHG2:
ADD SI,2
LOOP L1
如果BUF中存放的是有符号数,则只需要将程序中的两行内容修改:
JBE NOCHG1 改成:JLE NOCHG1
JAE NOCHG2 改成:JGE NOCHG2
4.20、答:设BUFFER中存放的是字节型数据。采用双指针方法:SI为读指针,DI为写指针,从低地址开始,内存中读出一个字节,如果不为0,则写入内存;如果为0,则不进行写操作。
LEA SI, BUFFER
XOR CX,CX
MOV CL, [SI]
INC SI
MOV DI, SI
XOR BH,BH
XOR AL,AL
L1:
CMP [SI],AL
JZ L2
MOV BL,[SI]
MOV [DI],BL
INC DI
INC BH
L2:
INC SI
LOOP L1
MOV BUFFER,BH
4.21、答:MOV CX,N
MOV BX,BUF1
MOV SI,0
MOV DI,OFFSET PRODUCT
XH: MOV AX,BUFN[SI]
PUSH AX
MUL BX
MOV [DI],AX ;乘积低位字
ADD DI,2
MOV [DI],DX ;乘积高位字
POP AX
XOR DX,DX
DIV BX
MOV QUOTIENT[SI],AX ;商
MOV REMAINDER[SI],DX ;余数
ADD SI,2
LOOP XH
4.22、答:统计AL中1的个数,只需将AL右移,移出的一位内容进行累加,子程序为:
COUNTBYTE PROC NEAR
PUSH AX
PUSH CX
MOV CX,8
XOR BL,BL
COU1:
SHR AL,1
ADC BL,0
LOOP COU1
POP CX
POP AX
RET
COUNTBYTE ENDP
在此基础上,可以检测出字节型缓冲区BUF中0和1个数相等的元素个数,即一个字节中有4个1。设BUF中有N个字节型数据,结果保持在BH中。
MOV CX,N
LEA SI, BUF
XOR BH,BH
L1: MOV AL,[SI]
CALL COUNTBYTE
CMP BL,4
JNZ L2
INC BH
L2: INC SI
LOOP L1
4.23、答:
4.24、答:
4.25、答:;产生N个伪随机数
MOV CX,N
MOV SI,OFFSET NUM
XOR AH,AH
MOV AL,23
XH: MOV [SI],AL
PUSH AX
ADD AX,0
JNP FEIJISHU
INC CNT
ADD SUMODD,AX
FEIJISHU:
POP AX
ADD AL,17
INC SI
LOOP XH
4.26、答:
4.27、答:
4.28、答:
4.29、答:
4.30、答:
4.31、答:
4.32、答:
4.33、答:
STACK SEGMENT STACK STACK
DW 100H DUP(?)
TOP LABEL BYTE
STACK ENDS
DATA SEGMENT
BUFFER DB 3 ;首字节为字符串长度
DB ABC ;字符串
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK
START:
MOV AX,STACK
MOV SS,AX
LEA SP,TOP
MOV AX,DATA
MOV DS,AX
MOV ES,AX
LEA DI,BUFFER
XOR CX,CX
MOV CL,[DI]
INC DI
CALL SETEVEN
MOV AH,4CH ;返回DOS
MOV AL,0
INT 21H
SETEVEN PROC NEAR ;加偶校验子程序
PUSH AX
PUSH BX
PUSH CX
PUSH DI
SETEVEN1:
MOV AL,[DI]
CALL COUNTBYTE
AND BL,01H
JZ SETEVEN2
OR AL,80H
MOV [DI],AL
SETEVEN2:
INC DI
LOOP SETEVEN1
POP DI
POP CX
POP BX
POP AX
RET
SETEVEN ENDP
COUNTBYTE PROC NEAR
PUSH AX
PUSH CX
MOV CX,8
XOR BL,BL
COU1:
SHR AL,1
ADC BL,0
LOOP COU1
POP CX
POP AX
RET
COUNTBYTE ENDP
CODE ENDS
END START
4.34、答:
MOV AX,SI[2*N]
TEST AX,8000H
JZ OVER
MOV CX,N
XH: MOV AX,[SI]
NEG AX
MOV [SI],AX
ADD SI,2
LOOP XH
OVER:NOP
4.35、答:设奖斐波那契数列存放在字变量RESULT中。在数据段中定义
RESULT DW 100H DUP(?)
在代码段中编写子程序
FIBONACCI PROC NEAR
XOR DI,DI
MOV RESULT[DI],1 ;前两个数为1
MOV RESULT[DI+2],1
ADD DI,4
MOV CX,N
L1:
MOV AX, RESULT[DI-4]
ADD AX, RESULT[DI-2]
MOV RESULT[DI],AX
ADD DI,2
LOOP L1
RET
FIBONACCI ENDP
4.36、答:在数据段中定义变量:
TABLE DW INFORM1, INFORM2, INFORM3, INFORM4, INFORM5
DW INFORM6, INFORM7, INFORM8, INFORM9, INFORM10
在代码段中编写程序段:
MOV CX,10
XOR SI,SI
L1: MOV DX,TABLE[SI]
MOV AH,9
INT 21H
ADD SI,2
CALL WAIT
LOOP L1
这里,WAIT为延时子程序,用于在显示信息之间的停顿。
4.37、答:先编写一个子程序DISPALD,完成以3位十进制数形式显示出AL的内容。
DISPALD PROC NEAR
PUSH AX
PUSH CX
PUSH DX
XOR AH,AH
MOV CL,100
DIV CL
PUSH AX
MOV DL,30H
ADD DL,AL
MOV AH,2
INT 21H
POP AX
MOV AL,AH
XOR AH,AH
MOV CL,10
DIV CL
PUSH AX
MOV DL,30H
ADD DL,AL
MOV AH,2
INT 21H
POP AX
MOV DL,30H
ADD DL,AH
MOV AH,2
INT 21H
POP DX
POP CX
POP AX
RET
DISPALD ENDP
在此基础上,根据题目要求,需要用到3个指针:SI指向源数组ARRAY,DI指向正数数组ARRAYP,BX指向负数数组ARRAYN。
MOV CX,20
XOR DX,DX
LEA SI,ARRAY
LEA DI,ARRAYP
LEA BX,ARRAYN
L1: MOV AL,[SI]
AND AL,AL
JS L2
MOV [DI],AL
INC DI
INC DL
JMP L3
L2: MOV [BX],AL
INC BX
INC DH
L3: INC SI
LOOP L1
MOV AL,DL
CALL DISPALD
MOV AL,DH
CALL DISPALD
4.38、答:设BUFFER中存放的是有符号数。
MOV CX,100
LEA SI,BUFFER
MOV AX, 7FFFH
L1: AND WORD PTR [SI],1
JNZ L2
CMP [SI],AX
JGE L2
MOV AX,[SI]
L2: ADD SI,2
LOOP L1
4.39、答:BL用于存放项数。
STACK SEGMENT STACK STACK
DW 100H DUP(?)
TOP LABEL WORD
STACK ENDS
DATA SEGMENT
DB 100H DUP(?)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA, ES:DATA, SS:STACK
START:
MOV AX,DATA
MOV DS,AX
MOV ES,AX
MOV AX,STACK
MOV SS,AX
LEA SP,TOP
MOV BL,1
MOV CX,0
COUNT:
MOV AL, BL
MUL BL
ADD CX,AX
CMP CX,2000
JA EXIT
INC BL
JMP COUNT
EXIT:
4.40、答:设数据段的段名为SEGNAME,则有
SEGINTODS MOCRO SEGNAME
MOV AX, SEGNAME
MOV DS,AX
ENDM
SEGINTOES MOCRO SEGNAME
MOV AX, SEGNAME
MOV ES,AX
ENDM
4.41、答:设输入字符串保存在BUFIN中,则有:
INSTR MACRO BUFIN
MOV AH, 10
LEA DX, BUFIN
INT 21H
ENDM
应该注意,BUFIN为键盘缓冲区,应该满足格式要求,详见INT 21H的10号功能说明。
4.42、答:CRLF MACRO
MOV AH, 02
MOV DL, 10
INT 21H
MOV DL, 13
INT 21H
ENDM
4.43、答:设DF=0
(1) L1: MOV AL, [SI]
MOV ES:[DI], AL
INC SI
INC DI
LOOP L1
(2) L1: MOV AL, [SI]
INC SI
LOOP L1
(3) L1: MOV ES:[DI], AL
INC DI
LOOP L1
(4) L1: MOV AL, [SI]
CMP AL, ES:[DI]
INC SI
INC DI
LOOP L1
4.44、答: STR1中有17个字符(含一个空格),设DS和ES均指向STR1和STR2所在的段。
(1) CLD
MOV CX,17
LEA SI,STR1
LEA DI,STR2
REP MOVSB
(2) MOV CX,17
LEA SI,STR1
LEA DI,STR2
ADD SI,CX
DEC SI
L1: MOV AL,[SI]
MOV [DI],AL
DEC SI
INC DI
LOOP L1
(3) LEA SI,STR1
MOV DX,[SI+6]
(4) MOV CX,17
LEA SI,STR1
MOV AL,20H
L1: CMP [SI], AL
JZ L2
INC SI
LOOP L1
L2:
4.45、答: STRING中保存了30个字符。
MOV CX,30
LEA SI,STRING
MOV AL,’&’
L1: CMP [SI],AL
JNZ L2
MOV BYTE PTR [SI],’/’
L2: INC SI
LOOP L1
4.46、答:将缓冲区FIRST中100个字节传送到SECOND中。
4.47、答:在缓冲区STRING中搜索非空格字符,如果有非空格则转到FOUND,如果200个单元中都是空格,则转到NOT_FOUND。
4.48、答:设DS和ES均指向字符串OLDS和NEWS所在的段。
CLD
MOV CX,5
LEA SI,OLDS
LEA DI,NEWS
REPZ CMPSB
JNZ NEW_LESS
4.49、答:设STRING中的字符个数为N。
MOV CX,N
LEA SI,STRING
MOV AL,5FH
L1: AND [SI],AL
INC SI
LOOP L1
4.50、答:利用字符串操作指令比较方便,也可以采用循环完成。
(1) TASK1 MOV CX, 50
MOV AL, 20H
LEA DI, STUDENT_PRINT
REP STOSB
(2) TASK2 MOV CX, 9
MOV AL, ‘_’
LEA DI, STUDENT_ADDR
REPNZ SCASB
JZ FOUND
NOT_FOUND: ……
FOUND: ……
(3) TASK3 MOV CX, 9
MOV AL, ‘_’
LEA DI, STUDENT_ADDR
ADD DI, CX
STD
REPNZ SCASB
JZ FOUND
NOT_FOUND: ……
FOUND: ……
(4) TASK4 MOV CX, 30
MOV AL, 20H
LEA DI, STUDENT_ NAME
REPZ SCASB
JNZ NOT_FOUND
MOV CX, 50
MOV AL, ‘*’
LEA DI, STUDENT_PRINT
REP STOSB
NOT_FOUND: ……
(5) TASK5 MOV CX, 30
LEA SI, STUDENT_ NAME
LEA DI, STUDENT_PRINT
REP MOVSB
LEA SI, STUDENT_ ADDR
MOV CX, 9
REP MOVSB
4.51、答:
4.52、答:
4.53、答:
4.54、答:先讨论随机数产生方法,通常采用同余法:
可以产生0到N-1之间的随机数,其中,称为种子,且位于[0,N-1],当取不同值是产生不同的随机数列。为任意正整数,一般取小于N的质数,N越大随机性越好。这里我们可以进一步简化:取,这样就不需要进行乘法运算。
种子相同,其产生的随机数序列是相同的,因此应该选择随机的种子,这一点很重要。我们这里采取读取机器时钟,取其百分之一秒值作为种子。
程序如下:
M=45
N=50
STACK SEGMENT
DW 100H DUP(?)
TOP LABEL WORD
STACK ENDS
DATA SEGMENT
PARAA DB 23
PARAB DB 11
SCORE DB N*5 DUP(50)
MEANSCORE DB N DUP(0)
LEVEL DB 6 DUP(0)
STR0 DB Total : ,2 DUP(?),0AH,0DH,$
STR1 DB LevleA: ,2 DUP(?),0AH,0DH,$
STR2 DB LevleB: ,2 DUP(?),0AH,0DH,$
STR3 DB LevleC: ,2 DUP(?),0AH,0DH,$
STR4 DB LevleD: ,2 DUP(?),0AH,0DH,$
STR5 DB LevleE: ,2 DUP(?),0AH,0DH,$
STR6 DB LevleF: ,2 DUP(?),0AH,0DH,$
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK
START:
MOV AX,DATA
MOV DS,AX
MOV ES,AX
MOV AX,STACK
MOV SS,AX
LEA SP,TOP
; Input score data
MOV AH,2CH
INT 21H
SEED:
CMP DL,N
JBE BELOW
SUB DL,N
JMP SEED
BELOW:
MOV AL,DL
MOV CX,M*5
LEA SI,SCORE
MOV BL,PARAA
XOR DX,DX
MOV DL,PARAB
LP:
ADD [SI],AL
INC SI
MUL BL
ADD AX,DX
LP1:
CMP AX,N
JB BELOW1
SUB AX,N
JMP LP1
BELOW1:
LOOP LP
; Computing mean score for every student
MOV CX,M
LEA SI,SCORE
LEA DI,MEANSCORE
MOV BL,5
LP2:
XOR AX,AX
PUSH CX
MOV CX,5
LP3:
ADD AL,[SI]
ADC AH,0
INC SI
LOOP LP3
DIV BL
MOV [DI],AL
INC DI
POP CX
LOOP LP2
; Counting levels
LEA SI,MEANSCORE
MOV CX,M
LP4:
MOV AL,[SI]
CMP AL,90
JB LEVELA
INC LEVEL
JMP LP5
LEVELA:
CMP AL,80
JB LEVELB
INC LEVEL+1
JMP LP5
LEVELB:
CMP AL,70
JB LEVELC
INC LEVEL+2
JMP LP5
LEVELC:
CMP AL,66
JB LEVELD
INC LEVEL+3
JMP LP5
LEVELD:
CMP AL,60
JB LEVELE
INC LEVEL+4
JMP LP5
LEVELE:
INC LEVEL+5
LP5:
INC SI
LOOP LP4
; Display the result
MOV AL,M
CALL TRANS
MOV STR0+8,AL
MOV STR0+9,AH
MOV AH,9
LEA DX, STR0
INT 21H
MOV CX,6
LEA BX,STR1
LEA SI,LEVEL
LP6:
MOV AL,[SI]
INC SI
CALL TRANS
MOV [BX+8],AL
MOV [BX+9],AH
MOV AH,9
MOV DX,BX
INT 21H
ADD BX,13
LOOP LP6
MOV AH,4CH ;Return to DOS
MOV AL,0
INT 21H
TRANS PROC NEAR
PUSH BX
MOV BL,10
XOR AH,AH
DIV BL
ADD AX,3030H
POP BX
RET
TRANS ENDP
CODE ENDS
END START
4.55、答:程序的编程思路为:
程序共5个功能,可采用跳转表法来实现多路分支结构程序设计。现将这5个程序段,各程序段的首地址分别标号为G1,G2,G3,G4,G5。将5个程序段的入口地址做成表TABLE放入数据段,程序根据给定的参数计算出欲转入的程序段的首地址在TABLE中的位置后,取出该地址,跳转至该程序段。
首先,通过调用子程序MENU,设置显示器,并输出提示文档。接着,读取‘1’-‘5’之间的ASCII表示数。然后,通过跳转表TABLE实现由输入参数转入相应的程序段。由于表中按“字”存放数据,则每个数据的位移量是:0、2、4、6、8。对于输入参数N,计算位移量的公式是N=(N-1)*2。
当输入‘1’时,跳转到标号G1。调用子程序CHGLTR,完成将输入字符串中的小写字母变换成大写字母。用户按键,若为ESC,则转到主程序段首调用MENU,否则,转到标号G1;
当输入‘2’时,跳转到标号G2。调用子程序MAXLTR,完成在输入字符串中找最大值。用户按键,若为ESC,则转到主程序段首调用MENU,否则,转到标号G2;
当输入‘3’时,跳转到标号G3。调用子程序SORTNUM,完成输入数据组的排序。用户按键,若为ESC,则转到主程序段首调用MENU,否则,转到标号G3。
当输入‘4’时,跳转到标号G4。调用子程序TIMCHK,完成时间的显示。用户按键,若为ESC,则转到主程序段首调用MENU,否则,转到标号G4。
当输入‘5’时,跳转到标号G5。结束程序的运行,返回操作系统。
程序流程框图见图4-1。
图4-1 主程序流程框图
START
初始化
调用子程序MENU
设置光标位置(41,10)
带回显的控制台输入
(AL) ← 输入字符
(AL) < ‘1’
(AL) > ‘5’
将跳转表TABLE的偏移地址送入(BX)
(AL) ← (AL) – ‘1’
(AL) ← (AL) * 2
AL按符号扩展成AX
(BX) ← TABLE
(BX) ← (B
展开阅读全文