习题四 汇编语言程序设计.doc

上传人:rrsccc 文档编号:8897162 上传时间:2021-01-23 格式:DOC 页数:11 大小:132.50KB
返回 下载 相关 举报
习题四 汇编语言程序设计.doc_第1页
第1页 / 共11页
习题四 汇编语言程序设计.doc_第2页
第2页 / 共11页
习题四 汇编语言程序设计.doc_第3页
第3页 / 共11页
习题四 汇编语言程序设计.doc_第4页
第4页 / 共11页
习题四 汇编语言程序设计.doc_第5页
第5页 / 共11页
点击查看更多>>
资源描述

《习题四 汇编语言程序设计.doc》由会员分享,可在线阅读,更多相关《习题四 汇编语言程序设计.doc(11页珍藏版)》请在三一文库上搜索。

1、习题四 汇编语言程序设计主要内容:汇编语言程序设计。主要介绍汇编语言程序的设计方法与编程原理,重点掌握算术运算程序、字符串处理程序、码制转换程序、子程序设计程序、常用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)=00

2、100101B3)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 MO

3、VDS,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

4、 ,02H SALAL,CL;(AL)=01000000H ADDAL,BL;(AL)=01010000H 本程序实现了什么功能? 【答】 将AL中的内容乘以10。4.3 试分析下列程序完成什么功能? MOVDX,3F08HMOVAH,0A2HMOVCL,4 SHLDX,CL;(DX)=F080H MOVBL,AHSHLBL,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,C

5、LDECAXMOVCX,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 J

6、MPSHORTL5 如果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、.7 下列语句在存储器中分别为变量分配多少字节空间?并画出存储空间的分配图。 VAR1DB10,2 ;2字节VAR2DW5DUP(?),0 ;12字节VAR3DBHOW ARE YOU?,$ ;13字节VAR4DD-1,1,0 ;2字节Var1Var2Var3Var410?HFFH2?OFFH?WFFH?FFH?A01H?R00H?E00H?00H?Y00H?O00H0U00H0?00H$4.8 编写一段程序,比较两个5字节的字符串OLDS和NEWS,若相同,在RESULT置0,否则置0FFH。【答】参考程序:OLDSDB 1,2,3,4,5NEWSDB 1,2,3,4,5RESULTDB ?

8、MOVSI,OFFSET OLDSMOVDI,OFFSET NEWSMOVCX,10CLD REPCMPSB JNZNOEQU ;串不相等转MOVAL,0JMPOUTPT NOEQU:MOVAL,0FFH OUTPT:MOV RESULT,ALSTOP:JMPSTOP4.9 编程求和Y=A1 + A2 + . + A100 。其中Ai为字节变量。【答】参考程序:DATASEGMENTTABLEDW 12,3,45,.YALDW ?YAHDW ?DATAENDS .MIANPROCFARPUSHDSMOVAX, 0PUSHAXMOVAX, DATAMOVDS, AXMOVDX,0XORAX, A

9、X;清AXMOVBX, OFFSET TABLEMOVCX, 4CLCLP: ADDAX, BX;求和JNCDONINCDXCLC DON: INCBXINCBX;指向下一个数LOOPLP;未加完,继续MOVYAL,AX;存和MOVYAH,DXMAINENDPCODEENDSEND START4.10 内存中以FIRST和SECOND开始的单元中分别存放着两个16位组合的十进制(BCD码)数,低位在前。编程序求这两个数的组合的十进制和,并存到以THIRD开始的单元。【答】参考程序:1325+9839=?DATA SEGMENTFIRSTDB 05H,02H,03H,01H ;SECONDDB

10、09H,03H, 08H,09H;THIRDDB 20 DUP (?)DATAENDSSTACKSEGMENTST1DB100 DUP (SA)TOP1 EQU LENGTH ST1STACK ENDSCODESEGMENTASUMMECS:CODE,DS:DATA,SS:STACKMAINPROCFARSTART:MOVAX, DAT;初始化数据段MOVDS, AXMOVAX, STACK;初始化堆栈段MOVSS, AXMOVAX, TOP1MOVSP, AXMOVCX, 4;计算4次MOVBX, OFFSETDAT1;取数据地址MOVSI , OFFSETDAT2;取数据地址MOVDI ,

11、 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, 02

12、H;调用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 DATA1DB DFASFAAAFDFAAFFFACOUNTEQU $-DATA1DATAENDSSTACKSEGMENTSTA DB 100 DUP

13、 (?)TOP EQU LENGTH STA STACK ENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKBEGIN:MOVAX,DATAMOVDS,AXMOVAX,STACKMOVSS,AXMOVAX,TOPMOVSP,AXMOVCX,COUNTMOVDX,0LEASI,DATA1MOVBL,A NEXT :CMPSI,BLJNZOTHERINCDXOTHER:INCSILOOPNEXTCODEENDSEND BEGIN4.12 统计数据块中正数与负数的个数,并将正数与负数分别送到两个缓冲区。【答】参考程序:BLOCKDB -1,-3,5,6,-2,

14、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: DECCXJNZGOON4.13 编

15、写一个子程序将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 4 DUP(?)DATA ENDSCODE SEGMENTMAIN PROCFARASSUMECS:CODE,DS:DATASTART:MOVAX,7EC3H ;假设ax中

16、存放7ec3hLEA SI,ADRMOV DL,4AGAIN:MOV BX,AXAND BX,000FHADD BL,30HCMP BL,9JG ADUSTJMP STOREADUST:ADD BL ,07HSTORE:MOVSI,BLINC SIMOV CL,4ROL AX,CLDEC DLJNZ AGAINMAIN ENDPCODE ENDS ENDSTART4.14 编写一个子程序将AX中的2进制数,转换成10进制ASCII码, 存于ADR开始的五个单元中。【答】参考程序:BIN EQU 5555H;假设二进制数为5555HDATA SEGMENTADRDB 4 DUP(?)DATA E

17、NDSSTACK SEGMENTSTA DB 100 DUP (?)TOPEQU LENGTH STA STACKENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTART:MOVAX,DATAMOVDS,AXMOVAX,STACKMOVSS,AXMOVAX,TOPMOVSP,AXMOV AX,BINLEA BX,ADRMOV CX,10000DCALL BINTODECMOV CX,1000DCALL BINTODECMOV CX,100DCALL BINTODEC MOVCX,10DCALLBINTODECMOV CX,01DCALL BINT

18、ODECMOV AX,04CH ;返回DOSINT 21HMAIN ENDP;十进制转二进制,完成一位运算,十进制存于ax中,结果存于bx所指向的地址中BINTODEC PROCNEARMOVDX,0DIVCXADD AL,30HMOVBX,ALMOV AX,DXINC BXRETBINTODEC ENDPCODE ENDSENDSTART 4.15 编写一个子程序,对AL中的数据进行偶校验,并将经过校验的结果放回AL中。【答】参考程序:JIAOYAN PROCFARMOVAL,1001110BORAL, ALJNPNEXTMOVAL,0JMP DONE NEXT: MOV AL,1DONE:

19、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

20、AL,24HMOVSI,2170HMOVDI,1000HMOV CX,100HCLDDO: REP MOVSBMOV DI,1000HMOV CX,100HCLDREPNZ SCASBDEC DIMOVDI,20HINC DICMP CX,0JNZ DOHLT4.18 从60H个元素中寻找一个最大的值,并放到AL中,假设这60个元素放在DATA1开始的单元中。【答】参考程序:DATASEGMENT DATA1 DB 0,1,2,3,4,5,6,7,8,9 ;DATAENDSSTACK SEGMENTSTADB 20 DUP (?)TOPEQU LENGTH STASTACKENDSCODESE

21、GMENTASSUME CS:CODE,DS:DATA,SS:STACKSTART:MOVAX,DATAMOV DS,AXMOVAX,STACKMOVSS,AXMOV AX,TOPMOV SP,AXMOVCX,10MOVAL,0LEABX,DATA1AGAIN: CMPAL,BXJGENEXT ;大于等于转移MOVAL,BXNEXT : INCBXLOOPAGAINMOVAH,4CHINT21HCODEENDSENDSTART4.19 排序程序设计: 把表中元素按值的大小升序排列。要求显示排序前和排序后的数据。【答】参考程序:DATASEGMENT TABDB8095554 N=$-TAB O

22、KDB0DH,0AH,OK!$ DATAENDSSTACKSEGMENT STADB20 DUP(?)TOPEQULENGTHSTASTACENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKSTAR: MOVAX,DATAMOVDS,AX ;初始化数据段MOVAX,STACKMOVSS,AXMOVAX,TOPMOVSP,AXCALLARRAYDO:MOVAH,4CHINT21H ;返回DOSARRAY PROCNEARPUSHAXPUSHBXPUSHCXPUSHDXMOVDL,N-1;置外循环次数MOVDH,1;设有交换标志XORBX, BX UPPER

23、: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

24、,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 SEGMENTS

25、TA DB 20 DUP(?)TOP EQU LENGTH STASTACK ENDSCODESEGMENTMOVAX,STACKMOV SS,AXMOV DI , OFFSET BUFFLEA BX , TABLEMOV CX,0DHRE1:MOV AH , 1 ;从键盘输入INT21HCMPAL,0DHJZDONESUBAL,30HXLATADDAL,30HMOVDI , ALINCDILOOPRE1DONE: MOV DX , OFFSET BUFFMOV AH , 09HINT 21HMOV AH,4CHINT 21HCODE ENDS4.21 编程序从键盘接收一个4位16进制数,转换

26、为10进制数后,送显示。【答】算法:先将输入的十六进制数保存到BX中,BX中的数范围在+32767-32768之间,先检查BX中的符号位,以决定输出“+”还是“-”;若是负数,应先求补,得到原码后即可与正数作统一处理。转换方法为将被转换的二进制数先除;以10000,商即为万位数,再将余数除以1000,商为千位数,依此类推,求出百、十位数,剩的为个位数。最后,将各个数加上30H,即成为对应字符。DATASEGMENTOUT_ASC_SUM db 6 dup(?),$DATAENDSSTACKSEGMENTSTA DB 20 DUP(?)TOP EQU LENGTH STASTACKENDSCOD

27、E SEGMENTASSUME CS :CODE,DS:DATA,SS:STACKSTART:MOVAX,DATAMOVDS,AXMOVAX,STACKMOVSS,AXMOVAX,TOPMOVSP,AXMOVCX , 4 ;输入4次MOVDX , CX ;转换4次MOVBX , 0 ;用BX保存输入数RE1:MOVAH , 1 ;从键盘输入INT21HCALLZH ;通过子程序转换SHLBX , CL ;组合成十六进制数ADDBL , ALDECDXJNZRE1 ;循环输入四个数MOVAX,BXMOVOUT_ASC_SUM , +CMPAX , 0JGEL4 ;不是负数,转移 NEGAXMOV

28、OUT_ASC_SUM , -L4:CWDMOVBX , 10000DIVBXADDAL , 30H ;将万位转换为数字(商应在AX内,但因为商不大于9,所以有效部分在al内)MOVOUT_ASC_SUM+1 , AL ;保存万位数字MOVAX , DX ;将余数置入AX内,以便当作被除数CWDMOVBX , 1000DIVBXADDAL , 30HMOVOUT_ASC_SUM+2 , AL;保存千位数字MOVAX , DX;将余数置入AX内,以便当作被除数 MOVBL , 100DIVBLADDAL , 30HMOVOUT_ASC_SUM+3 , AL;保存百位数字MOVAL , AHCBW

29、MOVBL , 10DIVBLADDAL , 30HMOVOUT_ASC_SUM+4 , AL;保存十位数字ADDAH , 30HMOVOUT_ASC_SUM+5 , AH;保存个位数字MOVDX , OFFSET OUT_ASC_SUMMOVAH , 09HINT21HMOVAH,4CHINT21HZHPROCCMPAL , 9;将ASCII码转换为16进制JBEA2;键入值9(0-9)则减30HCMPAL, a;键入值a(A-F) 则减37HJBA1SUBAL , 20H;值在a -f则先减20H,再减37HA1:SUBAL , 7A2: SUBAL , 30HRETZHENDP CODEENDSEND START(以上参考答案由黄玉清整理)

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1