习题4-汇编语言程序设计.doc_第1页
习题4-汇编语言程序设计.doc_第2页
习题4-汇编语言程序设计.doc_第3页
习题4-汇编语言程序设计.doc_第4页
习题4-汇编语言程序设计.doc_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

习题四 汇编语言程序设计主要内容:汇编语言程序设计。主要介绍汇编语言程序的设计方法与编程原理,重点掌握算术运算程序、字符串处理程序、码制转换程序、子程序设计程序、常用DOS和BIOS功能调用程序、汇编语言常用伪指令。4.1 分析执行下列指令序列后的结果: 1)MOVAX,1234H MOVBX,00FFH ANDAX,BX【答】(AX)=0034H2)MOVAL,01010101B ANDAL,00011111B;(AL)=00010101B ORAL,11000000B;(AL)=11010101B XORAL,00001111B;(AL)=11011010B NOTAL【答】(AL)=00100101B3)MOVDL,05H MOVAX,0A00H MOVDS,AX MOVSI,0H MOVCX,0FH AGAIN:INCSI CMPSI,DL LOOPNEAGAIN HLT 本程序实现了什么功能?【答】在以0A001H开始的15个单元中查找05H。4)MOVAX,DSEGADDR MOVDS, AX MOVES,AX MOVSI, OFFSET B1ADDR MOVDI,OFFSET B2ADDR MOVCX,N CLD REPMOVSB HLT 本程序实现了什么功能?【答】 将B1ADDR中N个字节数据传送到B2ADDR开始的15个存储单元 。 5)MOVAX, 0H MOVDS,AX MOVES, AX MOVAL,05H MOVDI,0A000H MOVCX,0FH CLD AGAIN:SCASBLOOPNEAGAIN HLT本程序实现了什么功能?【答】从地址0A000H开始的15个单元中查找字节型数据05H,用条件循环LOOPNZ,控制数据05H的查找。4.2 阅读程序:1).CLD LEADI,0100H MOVCX, 0080H XORAX, AX REPSTOSW 本程序实现了什么功能?【答】将DS中起始地址为0100H的128个字节单元清零。2).MOVAL, 08H SALAL,01H;(AL)=00010000H MOVBL, AL MOVCL ,02H SALAL,CL;(AL)=01000000H ADDAL,BL;(AL)=01010000H 本程序实现了什么功能? 【答】 将AL中的内容乘以10。4.3 试分析下列程序完成什么功能? MOVDX,3F08HMOVAH,0A2HMOVCL,4 SHLDX,CL;(DX)=F080H MOVBL,AH SHLBL,CL;(BL)=20H SHRBL,CL;(BL)=02H ORDL,BL;(DL)=82H 【答】将DX中的低4位数据8H分离出来,将AH中的低4位数据2H分离出来,合并为82H存放在DL。4.4 已知程序段如下: MOVAX,1234H MOVCL,4 ROLAX,CL DECAX MOVCX,4MULCX 试问:(1)每条指令执行后,AX寄存器的内容是什么?(2)每条指令执行后,CF,SF及ZF的值分别是什么?(3)程序运行结束时,AX及DX寄存器的值为多少? 【答】MOVAX,1234H; (AX)=1234H, CF=SF=ZF=0 MOVCL,4 ROLAX,CL; (AX)=2341H ,CF=1,SF=ZF=0 DECAX; (AX)=2340H,CF=1,SF=ZF=0 MOVCX,4;MULCX;(AX)= 8000H ,CF=ZF=0,SF=1,DX=04.5 试分析下列程序段: ADDAX,BX JNCL2 SUBAX,BX JNCL3 JMPSHORTL5 如果AX、BX的内容给定如下: AXBX (1)14C6H80DCH (程序转向 L2)(2)B568H54B7H (程序转向 SHORTL5 )问该程序在上述情况下执行后,程序转向何处? 【答】(1) 程序转向 L2。(2) 程序转向 SHORTL5。4.6 以下为某个数据段,试问各个变量分别占多少字节,该数据段共占多少字节? DATASEGMENT VAR1DW9 ;2字节VAR2DD10 DUP(?),2 ;44字节VAR3DB2 DUP(?,10 DUP(?) ;22字节VAR4DB HOW ARE YOU ;11字节DATA ENDS【答】该数据段共占79字节。4.7 下列语句在存储器中分别为变量分配多少字节空间?并画出存储空间的分配图。 VAR1DB10,2 ;2字节VAR2DW5DUP(?),0 ;12字节VAR3DBHOW ARE YOU?,$ ;13字节VAR4DD-1,1,0 ;2字节Var1Var2Var3Var410?FFH2?U00H?O00H?Y00H?01H?E00H?R00H?A00H?00H?W00H0O00H0H00H$4.8 编写一段程序,比较两个5字节的字符串OLDS和NEWS,若相同,在RESULT置0,否则置0FFH。【答】参考程序:DATA SEGMENT OLDSDB 1,2,3,4,5 NEWSDB 1,2,3,4,A N = $-NEWS RESULTDB 0DATAENDSCODESEGMENT ASSUME CS:CODE,DS:DATASTART: MOV AX,DATA MOV DS,AX ;初始化 MOV SI,OFFSET OLDS MOV DI,OFFSET NEWS MOV CX,N DON: MOV AL, SI CMP AL, DI JNZ NOEQU ;串不相等转 INC SI INC DI LOOP DON MOV AL,0 JMP OUTPUTNOEQU:MOV AL,0FFH OUTPUT:MOV RESULT,ALSTOP:JMP STOP ;程序陷阱CODE ENDS END START4.9 编程求和Y=A1 + A2 + . + A100 。其中Ai为字节变量。【答】参考程序:DATASEGMENTTABLEDW 1111H,2222H,3333H,2222HCOUNT EQU $-TABLEYALDW ?YAHDW ?DATAENDS CODE SEGMENTASSUME CS:CODE,DS:DATAMIANPROCFARPUSHDSMOVAX, 0PUSHAXMOVAX, DATAMOVDS, AXMOVDX,0XORAX, AX;清AXMOVBX, OFFSET TABLEMOVCX, 4LP: ADDAX, BX;求和ADC DX,0 INCBXINCBX;指向下一个数LOOPLP;未加完,继续MOVYAL,AX;存和MOVYAH,DXMAINENDPCODEENDSEND START4.10 内存中以FIRST和SECOND开始的单元中分别存放着两个16位组合的十进制(BCD码)数,低位在前。编程序求这两个数的组合的十进制和,并存到以THIRD开始的单元。【答】参考程序:1325+9839=?DATA SEGMENTFIRSTDB 05H,02H,03H,01H ;SECONDDB 09H,03H, 08H,09H;THIRDDB 20 DUP (?)DATAENDSSTACKSEGMENTST1DB 100 DUP (SA)TOP1 EQU $ - ST1STACK ENDSCODESEGMENTASUMMECS:CODE,DS:DATA,SS:STACKMAINPROCFARSTART:MOVAX, DAT;初始化数据段MOVDS, AXMOVAX, STACK;初始化堆栈段MOVSS, AXMOVAX, TOP1MOVSP, AXMOVCX, 4;计算4次MOVBX, OFFSETDAT1;取数据地址MOVSI , OFFSETDAT2;取数据地址MOVDI , OFFSET SUM;取结果地址MOVAH, 00H;将暂存标志的AH清0DON1:MOVAL, BX;取第一个数 SAHF;将AH中的标志送标志寄存器ADCAL, DI;与第二个数带进位加AAA;十进制校正LAHF;将标志寄存器内容送AHORAL, 30H;计算值拼成ASCII码MOVDI, AL;存结果的ASCII码INCBX;指向第一个数的下一位INCSI;指向第二个数的下一位INCDI;指向结果单元的下一位LOOPDON1;未计算完,继续ANDAH, 01H;将最高位的进位标志送AHORAH, 30H;最高位的进位位拼成ASCII码MOVDI, AH;存结果的最高位MOVAH, 02H;调用DOS的02H功能显示MOVCX, 05H;显示数据的位数DON2: MOVDL,DI;显示数据送DLINT21H;显示DECDI;显示数据所在存储单元加一LOOPDON2;未显示完,继续MOVAH, 4CH;返回DOSINT21H RET MAINENDP CODEENDS ENDSTART 4.11 试编程序,统计由40000H开始的16K个单元中所存放的字符“A“的个数,并将结果存放在DX中。【答】参考程序DATA SEGMENT BUFDB DFASFAAAFDFAAFFFACOUNTEQU $-BUFDATAENDSSTACKSEGMENTBUFF DW 100 DUP (?)M EQU $- STA STACK ENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKBEGIN:MOVAX,DATAMOVDS,AXMOVAX,STACKMOVSS,AXMOVAX,MMOVSP,AXMOVCX,COUNTMOVDX,0LEASI,BUFMOVAL,A CALL FindCharMOV AH,4CHINT 21H ;返回 DOSFindChar PROC NEAR PUSH DXNEXT :CMPSI,ALJNZOTHERINCDXOTHER:INCSILOOPNEXTPOP DXRETFindChar ENDPCODEENDSEND BEGIN4.12 统计数据块中正数与负数的个数,并将正数与负数分别送到两个缓冲区。【答】解法一:采用串操作指令,要程序片段:BLOCKDB -1,-3,5,6,-2,0,20,10 PLUS_DDB 8 DUP(?);正数缓冲区MINUS_DDB 8 DUP(?);负数缓冲区PLUSDB 0MINUSDB 0MOVSI,OFFSET BLOCKMOVDI,OFFSET PLUS_DMOVBX,OFFSET MINUS_DMOVCX, 8;数据个数送CXGOON:LODSB;AL SITESTAX,80HJNZJMIUS;为负数,转INCPLUS;正数个数加一STOSB ;DI AL,传正数JMPAGAINJMIUS:INCMINUS;负数个数加一XCHGBX,DISTOSB;送负数到缓冲区XCHGBX,DIAGAIN: DECCXJNZ GOON解法二:用比较指令CMP、转移指令JA/JNA/JB/JNB、循环指令LOOP等BLOCK DB -1,-3,5,6,-2,0,20,10 N EQU $-BLOCK PLUS_D DB 8 DUP(?);正数缓冲区 PLUS DB 0 MINUS_D DB 8 DUP(?);负数缓冲区MINUS DB 0 MOV SI,OFFSET BLOCK MOV DI,OFFSET PLUS_D MOV BX,OFFSET MINUS_D MOV CX, N;数据个数送CXGOON: MOV AL,SI TEST AL, 80H JNZ JMIUS;为负数,转 INC PLUS;正数个数加一 MOV DI,AL;传正数 INC DI JMP AGAINJMIUS: INC MINUS;负数个数加一 MOV BX,AL INC BXAGAIN: INC SI DEC CX JNZ GOON4.13 编写一个子程序将AX中的十六进制数,转换成ASCII码, 存于ADR开始的四个单元中。提示:1)、AX中的数从左到右,转换成ASCII码,用循环左移ROL和AND指令,把提出的一个十六进制数置BL中;2)、0 9 的ASCII码:30 39H,A F 的ASCII码:41H 46H。( 先把每个数加30H,判断是否为数字0 9?若是A F,再加07H,得字母的ASCII码。)【答】参考程序:DATASEGMENTADR DB 5 DUP(?)DATA ENDSCODE SEGMENTMAIN PROCFARASSUME CS:CODE,DS:DATASTART:MOVAX,7EC3H ;假设ax中存放7ec3hLEA SI,ADRMOV DL,4AGAIN:MOV BX,AXAND BX,000FHADD BL,30HCMP BL,9JG ADUSTJMP STOREADUST:ADD BL ,07HSTORE:MOV SI,BLINC SIMOV CL,4ROL AX,CLDEC DLJNZ AGAINMAIN ENDPCODE ENDS END START4.14 编写一个子程序将AX中的2进制数,转换成10进制ASCII码, 存于ADR开始的五个单元中。【答】算法分析:(1)一个16位2进制数,其值最大为65535。采用除10取余数方法,即可得到各个位。A)十进制数a5a4a3a2a1,除以10,余数a1为个位;商a5a4a3a2B)a5a4a3a2再除以10,余数a2为十位;C)以此类推,得到百位、千位、万位。(2)再将其加上30H则得到ASCII码,以便输出显示。(3)若数据为负数,用0减去该数,可得绝对值,再将符号位记录下来即可。参考程序:DATASEGMENTBIN DW -1988 ;带符号二进制数ADR DB 6 DUP(0),$ ;十进制数以ASCII码存储DATAENDSCODESEGMENTASSUME CS:CODE,DS:DATATRAN PROC FARMOV AX,DATAMOV DS,AXMOVAX,BINLEA DI,ADRCALL BINASCII ;十六位二进制数转换为十进制ascii码MOVAH,4CHINT 21H ;返回DOSTRANENDP;子程序BINASCII功能:将16位二进制数转换为ASCII码,存于ADR开始的连续6个单元,并显示;入口参数:AX=待转换的数, 预定义一个缓存区ADR,7个字节,最末字节为$字符。;出口参数:DI=转换好的ASCII码首地址,显示该十进制数据BINASCIIPROCPUSH BXPUSH CXPUSH DXTESTAX,8000H ;判断数据的符号JNS PLUS MINUS: MOV BYTE PTRDI,-;将符号存储NEG AX ;如是负数,取相反数去掉符号位 JMP GOPLUS: MOV BYTE PTRDI,+;将符号码存储 GO: ADDDI,5 ;DI指向个位MOV CX,5MOVBX,10 LP: MOV DX,0DIV BX ;算法为a/10 ,余数为一个低位十进制数ADD DL,30H ;转换为ASCII码 MOVBYTE PTRDI,DL ;从个位开始存储DEC DILOOP LPMOVDX,DIMOVAH,09HINT 21H ;显示POP DXPOP CXPOP BXRETBINASCIIENDP CODE ENDSEND TRAN 4.15 编写一个子程序,对AL中的数据进行偶校验,并将经过校验的结果放回AL中。【答】参考程序:JIAOYAN PROCFARMOVAL,1001110BORAL, ALJNPNEXTMOVAL,0JMP DONE NEXT: MOV AL,1DONE:MOV AH,04CHINT 21HJIAOYANENDP4.16 从2000H单元开始的区域,存放100个字节的字符串,其中有几个$符号(ASCII 码为24),找出第一个$符号,送AL中,地址送BX。【答】参考程序:SEARCHPROC FARMOV DI,2000HMOVCX,100MOV AL,24HCLDREPNZSCASB JNZSTOPDECDIMOVBX,DIMOV AL,DISTOP:RETSEARCH ENDP4.17 用串操作指令实现:先将100H个数从2170H单元处搬到1000H单元处,然后从中检索等于AL中字符的单元,并将此单元换成空格字符。【答】参考程序:MOV AL,24HMOVSI,2170HMOVDI,1000HMOV CX,100HCLDDO: REP MOVSBMOV DI,1000HMOV CX,100HCLDREPNZ SCASBDEC DIMOV DI,20HINC DICMP CX,0JNZ DOHLT4.18 从60H个元素中寻找一个最大的值,并放到AL中,假设这60个元素放在BUF开始的单元中。【答】参考程序:DATASEGMENT BUF DB 0,1,2,3,4,5,6,7,8,9 ;DATAENDSSTACK SEGMENTSTADB 20 DUP (?)TOPEQU $- STASTACKENDSCODESEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTART:MOVAX,DATAMOV DS,AXMOVAX,STACKMOVSS,AXMOV AX,TOPMOV SP,AXMOVCX,10MOVAL,0LEABX,BUFAGAIN: CMPAL,BXJGENEXT ;大于等于转移MOVAL,BXNEXT : INCBXLOOPAGAINMOVAH,4CHINT21HCODEENDSENDSTART4.19 排序程序设计: 把表中元素按值的大小升序排列。要求显示排序前和排序后的数据。【答】参考程序:DATASEGMENT TABDB8095554 N=$-TAB OKDB0DH,0AH,OK!$ DATAENDSSTACKSEGMENT STADB20 DUP(?)TOPEQU $-STASTACKENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKSTAR: MOVAX,DATAMOVDS,AX ;初始化数据段MOVAX,STACKMOVSS,AXMOVAX,TOPMOVSP,AXCALLARRAYDO:MOVAH,4CHINT21H ;返回DOSARRAY PROCNEARPUSHAXPUSHBXPUSHCXPUSHDXMOVDL,N-1;置外循环次数MOVDH,1;设有交换标志XORBX, BX UPPER:ORDH,DH ;JZDISP;无交换,已排好序,退出 MOVDH,0;无交换MOVCX,N-1 SUBCX,BX;CX=CX-I内循环次数 MOVSI,0;指向表首INNER:MOVAL,TABSI;字符送ALINCSI;指向下个字符CMPAL,TABSI;比较表中相邻字符JBEDON;小于 XCHGAL,TABSI;否则交换,大字符下 MOVTABSI-1,AL;小字符上浮MOVDH,1;有交换,DH=1 DON:LOOPINNER;内循环结束?CX-1INCBX;一次内循环完成,加一DECDL;外循环次数减一 CMPDL,0JNZUPPER;外循环次数非零,继续 DISP: MOVDX,OFFSET TABMOVAH,09HINT21H;显示排好序的字符POPDXPOPCXPOPBXPOPAXRETARRAYENDP CODEENDSENDSTAR 4.20 编写一段程序,接收从键盘输入的10个数,输入回车符表示结束,然后将这些数加密后存于BUFF缓冲区中。加密表为:输入数字: 0,1,2,3,4,5,6,7,8,9;密码数字:7,5,9,1,3,6,8,0,2,4。【答】参考程序:DATA SEGMENTTABLE DB 7,5,9,1,3,6,8,0,2,4;密码表BUFF DB 10 DUP(?) ,$存放转换数字的缓冲区DATA ENDSSTACK SEGMENTSTA DB 20 DUP(?)TOP EQU LENGTH STASTACK ENDSCODESEGMENTMOVAX,STACKMOV SS,AXMOV DI , OFFSET BUFFLEA BX , TABLEMOV CX,0DHINPUT:MOV AH , 1 ;从键盘输入INT21HCMPAL,0DH ;0DH为回车符JZDONESUBAL,30HXLATADDAL,30HMOVDI , ALINCDILOOPINPUTDONE: MOV DX , OFFSET BUFFMOV AH , 09HINT 21HMOV AH,4CHINT 21HCODE ENDS4.21 编程序从键盘接收一个4位16进制数,转换为10进制数后,送显示。【答】算法:(1)先将输入的十六进制数的ASCII码,处理成16进制数保存到BX中,BX中的数范围在+32767-32768之间;(2)先检查BX中的符号位,以决定输出“+”还是“-”;若是负数,应先求补,得到原码后即可与正数作统一处理。转换方法可以调用题4.14中的BINASCII子程序。DATASEGMENTADR DB 6 DUP(0),$ ;十进制数以ASCII码存储DATAENDSSTACKSEGMENTSTA DB 20 DUP(0)TOP EQU $- STASTACKENDSCODE SEGMENTASSUME CS :CODE,DS:DATA,SS:STACK

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论