INCDX
OTHER:INCSI
LOOPNEXT
CODEENDS
ENDBEGIN
4.12统计数据块中正数与负数的个数,并将正数与负数分别送到两个缓冲区。 【答】参考程序:
BLOCKDB-1,-3,5,6,-2,0,20,10 PLUS_DDB8DUP(?);正数缓冲区 MINUS_DDB8DUP(?);负数缓冲区 PLUSDB0 MINUSDB0
MOVSI,OFFSETBLOCK MOVDI,OFFSETPLUS_D MOVBX,OFFSETMINUS_D MOVCX,8;数据个数送CX
GOON:LODSB;AL←[SI]
TESTAX,80H
JNZJMIUS;为负数,转 INCPLUS;正数个数加一 STOSB;[DI]←AL,传正数 JMPAGAIN
JMIUS:INCMINUS;负数个数加一
XCHGBX,DI
STOSB;送负数到缓冲区 XCHGBX,DI
AGAIN:DECCX
JNZGOON
4.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码。) 【答】参考程序: DATASEGMENT ADRDB4DUP(?) DATAENDS
CODESEGMENT MAINPROCFAR
ASSUMECS:CODE,DS:DATA
START:MOVAX,7EC3H;假设ax中存放7ec3h
LEASI,ADR MOVDL,4
AGAIN:
MOVBX,AX ANDBX,000FH ADDBL,30H CMPBL,'9' JGADUST JMPSTORE
ADUST:ADDBL,07H STORE:MOV[SI],BL
INCSI MOVCL,4 ROLAX,CL DECDL JNZAGAIN
MAINENDP CODEENDS
ENDSTART
4.14编写一个子程序将AX中的2进制数,转换成10进制ASCII码,存于ADR开始的五个单元中。 【答】参考程序:
BINEQU5555H;假设二进制数为5555H DATASEGMENT
ADRDB4DUP(?)
DATAENDS
STACKSEGMENT
STADB100DUP(?)
TOPEQULENGTHSTA
STACKENDS CODESEGMENT
ASSUMECS:CODE,DS:DATA,SS:STACK
START:MOVAX,DATA
MOVDS,AX
MOVAX,STACK MOVSS,AX MOVAX,TOP MOVSP,AX MOVAX,BIN LEABX,ADR
MOVCX,10000D CALLBINTODEC MOVCX,1000D CALLBINTODEC MOVCX,100D CALLBINTODEC MOVCX,10D
CALLBINTODEC MOVCX,01D
CALLBINTODEC
MOVAX,04CH;返回DOS INT21H
MAINENDP
;十进制转二进制,完成一位运算,十进制存于ax中,结果存于bx所指向的地址中 BINTODECPROCNEAR
MOVDX,0 DIVCX
ADDAL,30H MOV[BX],AL MOVAX,DX INCBX RET
BINTODECENDP
CODEENDS
ENDSTART
4.15编写一个子程序,对AL中的数据进行偶校验,并将经过校验的结果放回AL中。 【答】参考程序: JIAOYANPROCFAR
MOVAL,1001110B ORAL,AL JNPNEXT MOVAL,0 JMPDONE
NEXT:MOVAL,1 DONE:MOVAH,04CH
INT21H
JIAOYANENDP
4.16从2000H单元开始的区域,存放100个字节的字符串,其中有几个$符号(ASCII码为24),找出第一 个$符号,送AL中,地址送BX。 【答】参考程序:
SEARCHPROCFAR
MOVDI,2000H MOVCX,100 MOVAL,24H CLD
REPNZSCASB JNZSTOP DECDI
MOVBX,DI MOVAL,[DI]
STOP:RET SEARCHENDP
4.17用串操作指令实现:先将100H个数从2170H单元处搬到1000H单元处,然后从中检索等于AL中字 符的单元,并将此单元换成空格字符。 【答】参考程序:
MOVAL,24H MOVSI,2170H MOVDI,1000H MOVCX,100H CLD
DO:REPMOVSB
MOVDI,1000H MOVCX,100H CLD
REPNZSCASB DECDI
MOV[DI],20H INCDI CMPCX,0 JNZDO HLT
4.18从60H个元素中寻找一个最大的值,并放到AL中,假设这60个元素放在DATA1开始的单元中。 【答】参考程序: DATASEGMENT
DATA1DB0,1,2,3,4,5,6,7,8,9; DATAENDS
STACKSEGMENT
STADB20DUP(?)
TOPEQULENGTHSTA STACKENDS CODESEGMENT
ASSUMECS:CODE,DS:DATA,SS:STACK
START:MOVAX,DATA
MOVDS,AX
MOVAX,STACK MOVSS,AX MOVAX,TOP MOVSP,AX MOVCX,10 MOVAL,0
LEABX,DATA1
AGAIN:CMPAL,[BX]
JGENEXT;大于等于转移
MOVAL,[BX]
NEXT:INCBX
LOOPAGAIN MOVAH,4CH INT21H
CODEENDS
ENDSTART
4.19排序程序设计:把表中元素按值的大小升序排列。要求显示排序前和排序后的数据。 【答】参考程序: DATASEGMENT
TABDB'8095554'
N=$-TAB
OKDB0DH,0AH,'OK!$' DATAENDS
STACKSEGMENT STADB20DUP(?)
TOPEQULENGTHSTA STACENDS
CODESEGMENT
ASSUMECS:CODE,DS:DATA,SS:STACK
STAR:MOVAX,DATA
MOVDS,AX;初始化数据段 MOVAX,STACK MOVSS,AX MOVAX,TOP MOVSP,AX CALLARRAY
DO:MOVAH,4CH
INT21H;返回DOS
ARRAYPROCNEAR
PUSHAX PUSHBX PUSHCX PUSHDX
MOVDL,N-1;置外循环次数 MOVDH,1;设有交换标志 XORBX,BX
UPPER:ORDH,DH;
JZDISP;无交换,已排好序,退出 MOVDH,0;无交换 MOVCX,N-1
SUBCX,BX;CX=CX-I内循环次数 MOVSI,0;指向表首
INNER:MOVAL,TAB[SI];字符送AL
INCSI;指向下个字符
CMPAL,TAB[SI];比较表中相邻字符 JBEDON;小于
XCHGAL,TAB[SI];否则交换,大字符下 MOVTAB[SI-1],AL;小字符上浮 MOVDH,1;有交换,DH=1
DON:LOOPINNER;内循环结束?CX-1
INCBX;一次内循环完成,加一 DECDL;外循环次数减一 CMPDL,0
JNZUPPER;外循环次数非零,继续
DISP:MOVDX,OFFSETTAB
MOVAH,09H
INT21H;显示排好序的字符
POPDX POPCX POPBX POPAX RET
ARRAYENDP CODEENDS
ENDSTAR
4.20编写一段程序,接收从键盘输入的10个数,输入回车符表示结束,然后将这些数加密后存于BUFF 缓冲区中。加密表为:输入数字:0,1,2,3,4,5,6,7,8,9;密码数字:7,5,9,1,3,6,8, 0,2,4。
【答】参考程序: DATASEGMENT
TABLEDB7,5,9,1,3,6,8,0,2,4;密码表 BUFFDB10DUP(?),'$'存放转换数字的缓冲区 DATAENDS
STACKSEGMENT
STADB20DUP(?)
TOPEQULENGTHSTA STACKENDS CODESEGMENT
MOVAX,STACK MOVSS,AX
MOVDI,OFFSETBUFF LEABX,TABLE MOVCX,0DH
RE1:MOVAH,1;从键盘输入
INT21H
CMPAL,0DH JZDONE SUBAL,30H XLAT
ADDAL,30H MOV[DI],AL INCDI LOOPRE1
DONE:MOVDX,OFFSETBUFF
MOVAH,09H INT21H
MOVAH,4CH INT21H
CODEENDS
4.21编程序从键盘接收一个4位16进制数,转换为10进制数后,送显示。
【答】算法:先将输入的十六进制数保存到BX中,BX中的数范围在+32767~-32768之间,先检查BX 中的符号位,以决定输出“+”还是“-”;若是负数,应先求补,得到原码后即可与正数作统一处理。 转换方法为将被转换的二进制数先除;以10000,商即为万位数,再将余数除以1000,商为千位数,依 此类推,求出百、十位数,剩的为个位数。最后,将各个数加上30H,即成为对应字符。 DATASEGMENT
OUT_ASC_SUMdb6dup(?),'$' DATAENDS
STACKSEGMENT
STADB20DUP(?)
TOPEQULENGTHSTA STACKENDS CODESEGMENT
ASSUMECS:CODE,DS:DATA,SS:STACK START:MOVAX,DATA
MOVDS,AX