习题四汇编语言程序设计主要内容:汇编语言程序设计。
主要介绍汇编语言程序的设计方法与编程原理,重点掌握算术运算程序、字符串处理程序、码制转换程序、子程序设计程序、常用DOS和BIOS功能调用程序、汇编语言常用伪指令。
4.1 分析执行下列指令序列后的结果:1)MOV AX,1234HMOV BX,00FFHAND AX,BX【答】(AX)=0034H2)MOV AL,01010101BAND AL,00011111B ;(AL)=00010101BOR AL,11000000B ;(AL)=11010101BXOR AL,00001111B ;(AL)=11011010BNOT AL【答】(AL)=00100101B3)MOV DL,05HMOV AX,0A00HMOV DS,AXMOV SI,0HMOV CX,0FHAGAIN: INC SICMP [SI],DLLOOPNE AGAINHLT本程序实现了什么功能?【答】在以0A001H开始的15个单元中查找05H。
4)MOV AX,DSEGADDRMOV DS, AXMOV ES,AXMOV SI, OFFSET B1ADDRMOV DI,OFFSET B2ADDRMOV CX,NCLDREP MOVSBHLT本程序实现了什么功能?【答】将B1ADDR中N个字节数据传送到B2ADDR开始的15个存储单元。
5)MOV AX, 0HMOV DS,AXMOV ES, AXMOV AL,05HMOV DI,0A000HMOV CX,0FHCLDAGAIN: SCASBLOOPNE AGAINHLT本程序实现了什么功能?【答】从地址0A000H开始的15个单元中查找字节型数据05H,用条件循环LOOPNZ,控制数据05H的查找。
4.2 阅读程序:1). CLDLEA DI,[0100H]MOV CX, 0080HXOR AX, AXREP STOSW本程序实现了什么功能?【答】将DS中起始地址为0100H的128个字节单元清零。
2). MOV AL, 08HSAL AL,01H ;(AL)=00010000HMOV BL, ALMOV CL ,02HSAL AL,CL ;(AL)=01000000HADD AL,BL ;(AL)=01010000H本程序实现了什么功能?【答】将AL中的内容乘以10。
4.3 试分析下列程序完成什么功能?MOV DX,3F08HMOV AH,0A2HMOV CL,4SHL DX,CL ;(DX)=F080HMOV BL,AHSHL BL,CL ;(BL)=20HSHR BL,CL ;(BL)=02HOR DL,BL ;(DL)=82H【答】将DX中的低4位数据8H分离出来,将AH中的低4位数据2H分离出来,合并为82H 存放在DL。
4.4 已知程序段如下:MOV AX,1234HMOV CL,4ROL AX,CLDEC AXMOV CX,4MUL CX试问:(1)每条指令执行后,AX寄存器的内容是什么?(2)每条指令执行后,CF,SF 及ZF的值分别是什么?(3)程序运行结束时,AX及DX寄存器的值为多少?【答】MOV AX,1234H ; (AX)=1234H, CF=SF=ZF=0MOV CL,4ROL AX,CL ; (AX)=2341H ,CF=1,SF=ZF=0DEC AX ; (AX)=2340H, CF=1,SF=ZF=0MOV CX,4 ;MUL CX ;(AX)= 8000H ,CF=ZF=0,SF=1,DX=04.5 试分析下列程序段:ADD AX,BXJNC L2SUB AX,BXJNC L3JMP SHORTL5如果AX、BX的内容给定如下:AX BX(1)14C6H 80DCH (程序转向L2)(2)B568H 54B7H (程序转向SHORTL5 )问该程序在上述情况下执行后,程序转向何处?【答】(1) 程序转向L2。
(2) 程序转向SHORTL5。
4.6 以下为某个数据段,试问各个变量分别占多少字节,该数据段共占多少字节?DATA SEGMENTVAR1 DW 9 ;2字节VAR2 DD 10 DUP(?),2 ;44字节VAR3 DB 2 DUP(?,10 DUP(?)) ;22字节VAR4 DB ‘HOW ARE YOU' ;11字节DATA ENDS【答】该数据段共占79字节。
4.7 下列语句在存储器中分别为变量分配多少字节空间?并画出存储空间的分配图。
VAR1 DB 10,2 ;2字节VAR2 DW 5DUP(?),0 ;12字节VAR3 DB ‘HOW ARE YOU?',‘$' ;13字节;2字节4.8 编写一段程序,比较两个5字节的字符串OLDS和NEWS,若相同,在RESULT置0,否则置0FFH。
【答】参考程序:DATA SEGMENTOLDS DB 1,2,3,4,5NEWS DB 1,2,3,4,'A'N = $-NEWSRESULT DB 0DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART: MOV AX,DATAMOV DS,AX ;初始化MOV SI,OFFSET OLDSMOV DI,OFFSET NEWSMOV CX,NDON: MOV AL, [SI]CMP AL, [DI]JNZ NOEQU ;串不相等转INC SIINC DILOOP DONMOV AL,0JMP OUTPUTNOEQU: MOV AL,0FFHOUTPUT: MOV RESULT,ALSTOP: JMP STOP ;程序陷阱CODE ENDSEND START4.9 编程求和Y=A1 + A2 + …. + A100 。
其中Ai为字节变量。
【答】参考程序:DATA SEGMENTTABLE DW 1111H,2222H,3333H,2222HCOUNT EQU $-TABLEYAL DW ?YAH DW ?DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATAMIAN PROC FARPUSH DSMOV AX, 0PUSH AXMOV AX, DATAMOV DS, AXMOV DX,0XOR AX, AX ;清AXMOV BX, OFFSET TABLEMOV CX, 4LP: ADD AX, [BX] ;求和ADC DX,0INC BXINC BX ;指向下一个数LOOP LP ;未加完,继续MOV YAL,AX ;存和MOV YAH,DXMAIN ENDPCODE ENDSEND START4.10 内存中以FIRST和SECOND开始的单元中分别存放着两个16位组合的十进制(BCD码)数,低位在前。
编程序求这两个数的组合的十进制和,并存到以THIRD开始的单元。
【答】参考程序:1325+9839=?DATA SEGMENTFIRST DB 05H,02H,03H,01H ;SECOND DB 09H,03H, 08H,09H;THIRD DB 20 DUP (?)DATA ENDSSTACK SEGMENTST1 DB 100 DUP (‘SA’)TOP1 EQU $ - ST1STACK ENDSCODE SEGMENTASUMME CS:CODE,DS:DATA,SS:STACKMAIN PROC FARSTART: MOV AX, DAT ;初始化数据段MOV DS, AXMOV AX, STACK ;初始化堆栈段MOV SS, AXMOV AX, TOP1MOV SP, AXMOV CX, 4 ;计算4次MOV BX, OFFSET DAT1 ;取数据地址MOV SI , OFFSET DAT2 ;取数据地址MOV DI , OFFSET SUM ;取结果地址MOV AH, 00H ;将暂存标志的AH清0DON1: MOV AL, [BX] ;取第一个数SAHF ;将AH中的标志送标志寄存器ADC AL, [DI] ;与第二个数带进位加AAA ;十进制校正LAHF ;将标志寄存器内容送AHOR AL, 30H ;计算值拼成ASCII码MOV [DI], AL ;存结果的ASCII码INC BX ;指向第一个数的下一位INC SI ;指向第二个数的下一位INC DI ;指向结果单元的下一位LOOP DON1 ;未计算完,继续AND AH, 01H ;将最高位的进位标志送AHOR AH, 30H ;最高位的进位位拼成ASCII码MOV [DI], AH ;存结果的最高位MOV AH, 02H ;调用DOS的02H功能显示MOV CX, 05H ;显示数据的位数DON2: MOV DL,[DI] ;显示数据送DLINT 21H ;显示DEC DI ;显示数据所在存储单元加一LOOP DON2 ;未显示完,继续MOV AH, 4CH ;返回DOSINT 21HRETMAIN ENDPCODE ENDSEND START4.11 试编程序,统计由40000H开始的16K个单元中所存放的字符“A“的个数,并将结果存放在DX中。
【答】参考程序DATA SEGMENTBUF DB 'DFASFAAAFDFAAFFFA'COUNT EQU $-BUFDATA ENDSSTACK SEGMENTBUFF DW 100 DUP (?)M EQU $- STASTACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKBEGIN: MOV AX,DATAMOV DS,AXMOV AX,STACKMOV SS,AXMOV AX,MMOV SP,AXMOV CX,COUNTMOV DX,0LEA SI,BUFMOV AL,'A'CALL FindCharMOV AH,4CHINT 21H ;返回DOSFindChar PROC NEARPUSH DXNEXT : CMP [SI],ALJNZ OTHERINC DXOTHER: INC SILOOP NEXTPOP DXRETFindChar ENDPCODE ENDSEND BEGIN4.12 统计数据块中正数与负数的个数,并将正数与负数分别送到两个缓冲区。
【答】解法一:采用串操作指令,要程序片段:BLOCK DB -1,-3,5,6,-2,0,20,10PLUS_D DB 8 DUP(?) ;正数缓冲区MINUS_D DB 8 DUP(?) ;负数缓冲区PLUS DB 0MINUS DB 0MOV SI,OFFSET BLOCKMOV DI,OFFSET PLUS_DMOV BX,OFFSET MINUS_DMOV CX, 8 ;数据个数送CXGOON: LODSB ;AL←[SI]TEST AX, 80HJNZ JMIUS ;为负数,转INC PLUS ;正数个数加一STOSB ;[DI] ←AL,传正数JMP AGAINJMIUS: INC MINUS ;负数个数加一XCHG BX, DISTOSB ;送负数到缓冲区XCHG BX, DIAGAIN: DEC CXJNZ GOON解法二:用比较指令CMP、转移指令JA/JNA/JB/JNB、循环指令LOOP等BLOCK DB -1,-3,5,6,-2,0,20,10N EQU $-BLOCKPLUS_D DB 8 DUP(?) ;正数缓冲区PLUS DB 0MINUS_D DB 8 DUP(?) ;负数缓冲区MINUS DB 0……MOV SI,OFFSET BLOCKMOV DI,OFFSET PLUS_DMOV BX,OFFSET MINUS_DMOV CX, N ;数据个数送CXGOON: MOV AL,[SI]TEST AL, 80HJNZ JMIUS ;为负数,转INC PLUS ;正数个数加一MOV [DI],AL ;传正数INC DIJMP AGAINJMIUS: INC MINUS ;负数个数加一MOV [BX],ALINC BXAGAIN: INC SIDEC CXJNZ GOON4.13 编写一个子程序将AX中的十六进制数,转换成ASCII码, 存于ADR开始的四个单元中。