• 1.85 MB
  • 2022-04-22 11:46:18 发布

微机原理与接口技术(楼顺天版)课后习题解答.pdf

  • 117页
  • 当前文档由用户上传发布,收益归属用户
  1. 1、本文档共5页,可阅读全部内容。
  2. 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
  3. 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
  4. 文档侵权举报电话:19940600175。
'微机原理与接口技术楼顺天周佳社编著科学出版社找了好久�终于在期末从老师那儿弄了一份�希望对大家有用�微机原理与接口技术楼顺天周佳社编著科学出版社2006年习题解答因时间紧�习题解答由部分老师提供�还没有经过仔细校对�肯定有不少错误�请各位指正。另外�习题有多种解法�答案不唯一�仅供参考。 第1章数制与码制1.将下列十进制数转换成二进制数��1�58��2�67.625;�3�5721;解��1�58D=00111010B�2�67.625D=01000011.1010B�3�5721D=0001011001011001B2.将二进制数变换成十六进制数��1�10010101B��2�1101001011B��3�1111111111111101B��4�0100000010101B��5�01111111B��6�010000000001B解��1�10010101B=95H�2�1101001011B=34BH�3�1111111111111101B=FFFDH�4�0100000010101B=815H�5�01111111B=7FH�6�010000000001B=401H3.将十六进制数变换成二进制数和十进制数��1�78H��2�0A6H��3�1000H��4�0FFFFH解��1�78H=120D=01111000B�2�0A6H=166D=10100110B�3�1000H=4096D=0001000000000000H�4�0FFFFH=65535D=1111111111111111B4.将下列十进制数转换成十六进制数��1�39��2�299.34375��3�54.5625解��1�39D=27H�2�299.34375D=12B.58H�3�54.5625D=36.9H5.将下列二进制数转换成十进制数��1�10110.101B��2�10010010.001B��3�11010.1101B解��1�10110.101B=22.625D �2�10010010.001B=146.125D�3�11010.1101B=26.8125D6.计算�按原进制运算���1�10001101B�11010B��2�10111B�11100101B��3�1011110B�1110B��4�124AH�78FH��5�5673H�123H��6�1000H�F5CH�解��1�10100111B�2�11111100B�3�1010000B�4�19D9H�5�5796H�6�A4H7.已知a=1011B,b=11001B,c=100110B,按二进制完成下列运算�并用十进制运算检查计算结果��1�a+b;�2�c-a-b;�3�a×b;�4�c÷b解�a=1011B=11Db=11001B=25Dc=100110B=38D�1�100100B=36D�2�10B=2D�3�100010011B=275D�4�1B余1101B=13D8.已知a=00111000B,b=11000111B,计算下列逻辑运算��1�aANDb;�2�aORb;�3�aXORb;�4�NOTa解��1�00000000B�2�11111111B�3�11111111B�4�11000111B9.设机器字长为8位�写出下列各数的原码和补码��1�+1010101B;�2�-1010101B;�3�+1111111B;�4�-1111111B;�5�+1000000B;�6�-1000000B解��1�原01010101B补01010101B�2�原11010101B补10101011B �3�原01111111B补01111111B�4�原11111111B补10000001B�5�原01000000B补01000000B�6�原11000000B补11000000B10.写出下列十进制数的二进制补码表示�设机器字长为8位���1�15��2��1��3�117��4�0��4��15��5�127��6��128��7�80解��1��00001111B�补�2��11111111B�补�3��01110101B�补�4��00000000B�补�5��11110001B�补�6��01111111B�补�7��10000000B�补�8��01010000B�补11.设机器字长为8位�先将下列各数表示成二进制补码�然后按补码进行运算�并用十进制数运算进行检验��1�87�73��2�87���73���3�87���73���4���87��73��5���87��73��6���87����73��解��1�1110B=14D�2�00001110B进位舍弃�3�10100000B=-96D溢出�4�11110010B=-14D�5�01100000B=96D溢出�6�11110010B=-14D12.已知a,b,c,d为二进制补码�a=00110010B,b=01001010B,c=11101001B,d=10111010B,计算��1�a+b;�2�a+c;�3�c+b;�4�c+d;�5�a-b;�6�c-a;�7�d-c;�8�a+d-c解��1�01111100B �2�00011011B�3�00110011B�4�10100011B�5�11101000B�6�10110111B�7�11010001B�8�11B13.设下列四组为8位二进制补码表示的十六进制数�计算a+b和a-b�并判断其结果是否溢出��1�a=37H,b=57H;�2�a=0B7H,b=0D7H;�3�a=0F7H,b=0D7H;�4�a=37H,b=0C7H解��1�a+b=8EH溢出,a-b=E0H未溢出�2�8EH未溢出,E0H未溢出�3�CEH未溢出,20H未溢出�4�FEH未溢出70H未溢出14.求下列组合BCD数的二进制和十六进制表示形式��1�3251�2�12907�3�2006解��1�0011001001010001B=3251H�2�0001001010010111B=12907H�3�0010000000000110B=2006H15.将下列算式中的十进制数表示成组合BCD码进行运算�并用加6/减6修正其结果��1�38�42��2�56�77��3�99�88��4�34�69��5�38�42��6�77�56��7�15�76��8�89�23解��1�00111000B+01000010B=01111010B低BCD码位需要加6修正01111010B+00000110B=10000000B=80BCD�2�01010110B+01110111B=11001101B高、低BCD码位都需要加6修正11001101B+01100110B=000100110011B=133BCD�3�10011001B+10001000B=000100100001B高、低BCD码位都需要加6修正000100100001B+01100110B=000110000111B=187BCD�4�00110100B+01101001B=10011101B低BCD码位需要加6修正 10011101B+00000110B=10100011B修正结果使高BCD码位需要加6修正10100011B+01100000B=000100000011B=103BCD�5�00111000B-01000010B=�-1�11110110B高BCD码位需要减6修正�-1�11110110B-01100000B=�-1�10010110B=-100+96=-4BCD�6�01110111B-01010110B=00100001B=21BCD�7�00011001B-01110110B=�-1�10011111B高、低BCD码位都需要减6修正�-1�10011111B-01100110B=�-1�00111001B=-100+39=-61BCD�8�10001001B-00100011B=01100110B=66BCD16.将下列字符串表示成相应的ASCII码�用十六进制数表示���1�Example1;�2�XiDianUniversity;�3�-108.652;�4�Howareyou?;�5�Computer�6�InternetWeb解��1�45H�78H,61H,6DH,70H,6CH,65H�20H�31H�2�58H,69H,44H,69H,61H,6EH,20H,55H,6EH,69H,76H,65H�72H,73H,69H,74H,79H�3�2DH,31H,30H,38H,2EH,36H,35H,32H�4�48H,6FH,77H,20H,61H72H,65H,20H79H,6FH,75H�5�43H,6FH,6DH,70H,75H,74H,65H,72H�6�49H,6EH,74H,65H72H,6EH,65H,74H,20H,57H,65H,62H17.将下列字符串表示成相应的ASCII码�用十六进制数表示���1�Hello�2�123456;�注�表示回车��3�ASCII;�4�Thenumberis2315解��1�48H,65H,6CH,6CH,6FH�2�31H,32H,33H,0DH,34H,35H,36H�3�41H,53H,43H,49H,49H�4�54H,68H,65H,20H,6EH,75H,6DH,62H,65H,72H 第2章8086CPU结构与功能1.微处理器内部结构由哪几部分组成�阐述各部分的主要功能。解�微处理器内部结构由四部分组成��1�算术逻辑运算单元ALU�完成所有的运算操作��2�工作寄存器�暂存寻址信息和计算过程中的中间结果��3�控制器�完成指令的读入、寄存和译码�并产生控制信号序列使ALU完成指定操作��4�I/O控制逻辑�处理I/O操作。2.微处理器级总线有哪几类�各类总线有什么作用�解�微处理器级总线有三类��1�数据总线�传送信息��2�地址总线�传送地址码��3�控制总线传送控制信号。3.为什么地址总线是单向的�而数据总线是双向的�解�地址码只能由CPU生成。而数据需要在CPU和存储器之间传输。4.8086/8088微处理器内部有哪些寄存器�其主要作用是什么�解�8086CPU内部有14个16位寄存器�其中8个通用寄存器�4数据寄存器AX、BX、CX、DX�4地址指针/变址寄存器SI、DI、SP、BP��4个段寄存器�CS、DS、ES、SS��2个控制寄存器�指令指针IP�微处理器状态字PSW�。应该注意的是�可以在指令中用作为地址指针的寄存器有�SI、DI、BP和BX�在微处理器状态字PSW中�一共设定了9个标志位�其中6个标志位用于反映ALU前一次操作的结果状态�CF�PF�AF�ZF�SF�OF��另3个标志位用于控制CPU操作�DF�IF�TF�。5.如果某微处理器有20条地址总线和16条数据总线��1�假定存储器地址空间与I/O地址空间是分开的�则存储器地址空间有多大��2�数据总线上传送的有符号整数的范围有多大�20解��1�存储器地址空间为�2�1MB1515�2�有符号数范围为��2~2�1�即�32768�327676.将十六进制数62A0H与下列各数相加�求出其结果及标志位CF、AF、SF、ZF、OF 和PF的值��1�1234H��2�4321H��3�CFA0H��4�9D60H解��1�74D4HCF=0AF=0SF=0ZF=0OF=0PF=1�2�A5C1HCF=0AF=0SF=1ZF=0OF=1PF=0�3�3240HCF=1AF=0SF=0ZF=0OF=0PF=0�4�0000HCF=1AF=0SF=0ZF=1OF=0PF=17.从下列各数中减去4AE0H�求出其结果及标志位CF、AF、SF、ZF、OF和PF的值��1�1234H��2�5D90H��3�9090H��4�EA04H解��1�C754HCF=1AF=0SF=1ZF=0OF=0PF=0�2�12B0HCF=0AF=0SF=0ZF=0OF=0PF=0�3�45B0HCF=0AF=0SF=0ZF=0OF=1PF=0�4�9F24HCF=0AF=0SF=1ZF=0OF=0PF=19.写出下列存储器地址的段地址、偏移地址和物理地址��1�2134�10A0��2�1FA0�0A1F��3�267A�B876解�物理地址�段地址*10H+偏移地址�1�段地址�2134H�偏移地址�10A0H�物理地址�223E0H�2�段地址�1FA0H�偏移地址�0A1FH�物理地址�2041FH�3�段地址�267AH�偏移地址�B876H�物理地址�32016H10.给定一个数据的有效地址为2359H�并且�DS��490BH�求该数据的物理地址。解�物理地址�段地址*10H+偏移地址物理地址�490BH�2359H�4B409H11.如果在一个程序段开始执行之前��CS��0A7F0H��IP��2B40H�求该程序段的第一个字的物理地址。解�物理地址�段地址*10H+偏移地址物理地址�CS*10H+IP=AAA40H12.IBMPC有哪些寄存器可用来指示存储器的地址�解�变址寄存器SI�DI�堆栈指针SP�BP�另外还有BX。 第3章8086CPU指令系统1.写出完成下列要求的变量定义语句��1�在变量var1中保存6个字变量�4512H�4512��1�100/3�10H�65530��2�在变量var2中保存字符串�’BYTE’,’word’,’WORD’��3�在缓冲区buf1中留出100个字节的存储空间��4�在缓冲区buf2中�保存5个字节的55H�再保存10个字节的240�并将这一过程重复7次��5�在变量var3中保存缓冲区buf1的长度��6�在变量pointer中保存变量var1和缓冲区buf1的偏移地址。解�var1DW4512H,4512,-1,100/3,10H,65530var2DB’BYTE’,’word’,’WORD’buf1DB100DUP�?�buf2DB7DUP�5DUP�55H�,10DUP�240��var3DBLENGTHbuf1pointerDWvar1,buf1�或者pointerDWOFFSETvar1�OFFSETbuf1�2.设变量var1的逻辑地址为0100�0000�画出下列语句定义的变量的存储分配图�var1DB12��12�20/6�4DUP�0�55H�var2DB‘Assemble’var3DW‘AB’,‘cd’,‘E’var4DWvar2var5DDvar2解� 3.指令正误判断�对正确指令写出源和目的操作数的寻址方式�对错误指令指出原因�设VAR1,VAR2为字变量,L1为标号���1�MOVSI�100�2�MOVBX�VAR1[SI]�3�MOVAX,[BX]�4�MOVAL,[DX]�5�MOVBP,AL�6�MOVVAR1,VAR2�7�MOVCS,AX�8�MOVDS,0100H�9�MOV[BX][SI],1�10�MOVAX,VAR1+VAR2�11�ADDAX,LENGTHVAR1�12�ORBL,TYPEVAR2�13�SUB[DI],78H�14�MOVSVAR1,VAR2�15�PUSH100H�16�POPCS�17�XCHGAX,ES�18�MOVDS,CS�19�JMPL1+5�20�DIVAX,10�21�SHLBL,2�22�MOVAL,15+23�23�MULCX�24�XCHGCL,[SI]�25�ADCCS:[0100],AH�26�SBBVAR1�5,154解��1�MOVSI,100正确。源�立即数寻址�目的�寄存器寻址�2�MOVBX,VAR1[SI]正确。源�寄存器相对寻址�目的�寄存器寻址�3�MOVAX,[BX]正确。源�寄存器间接寻址�目的�寄存器寻址�4�MOVAL,[DX]错误。寄存器间接寻址时�DX,AX,CX不能作地址寄存器�5�MOVBP,AL错误。操作数类型不一致�6�MOVVAR1,VAR2错误。两存储单元之间不能用MOV指令传送数据 �7�MOVCS,AX错误。CS不能为目的操作数�8�MOVDS,0100H错误。目的操作数为段寄存器时�源操作数不能为立即数�9�MOV[BX][SI]�1错误。指令类型不定。�10�MOVAX,VAR1+VAR2错误。MOV指令中不能完成加法运算�11�ADDAX,LENGTHVAR1正确。源�立即数寻址。目的�寄存器寻址�12�ORBL,TYPEVAR2正确。源�立即数寻址。目的�寄存器寻址�13�SUB[DI],78H错误。指令类型不定�14�MOVSVAR1,VAR2正确。目的、源均为隐含寻址。操作数仅指出操作数类型�15�PUSH100H错误。将常数压入堆栈�要通过寄存器来实现�16�POPCS错误。目的操作数不能为CS�17�XCHGAX�ES错误。XCHG指令的操作数不能是段寄存器�18�MOVDS�CS错误。MOV指令不能从段寄存器到段寄存器�19�JMPL1+5正确。段内直接转移�20�DIVAX�10错误。指令格式错误。�21�SHLBL�2错误。移位指令的移位数为1或者CL�22�MOVAL�15+23正确。源:立即数寻址�目的:寄存器。编译时就处理为38�23�MULCX正确。源�寄存器寻址�目的�寄存器寻址�24�XCHGCL�[SI]正确。源�寄存器间接寻址�目的�寄存器寻址�25�ADCCS:[0100],AH正确。源:寄存器寻址,目的:直接寻址�数据在代码段中��26�SBBVAR1-5,154正确。源�立即数寻址�目的�直接寻址。4.说明下列指令对的区别��1�MOVAX�VAR1与MOVAX�OFFSETVAR1�2�MOVAX�VAR2与LEAAX�VAR2�3�MOVAL�LENGTHVAR1与MOVAL�SIZEVAR1�4�MOVAL�ES:[DI]CMPAL,[SI]与CMPSB�5�SHRAL�1与SARAL�1�6�SHRAL�1与RORAL�1�7�ROLBX�1与RCLBX�1解��1�MOVAX�VAR1把变量VAR1对应地址单元中的一个字送入AXMOVAX�OFFSETVAR1把VAR1的有效地址的偏移地址送入AX �2�MOVAX�VAR2把变量VAR2对应地址单元中的一个字送入AXLEAAX�VAR2把VAR2的有效地址的偏移地址送入AX�3�MOVAL�LENGTHVAR1把变量VAR1的长度送入ALMOVAL�SIZEVAR1把变量VAR1的大小送入AL�4�MOVAL�ES�[DI]CMPAL�[SI]把以ES为段地址�DI为偏移地址的一个字节送入AL�并与以SI内容为偏移地址的一个字节作比较�改变标志寄存器内容。�相当于作ES��DI�与�DS:�SI�内容比较�CMPSB对字符串中的一字节比较。寻址方式隐含。源串的地址由DS:SI指定�目的串的地址由ES:DI指定。�相当于作DS:�SI�与ES��DI�内容比较��5�SHRAL�1AL逻辑右移1位�最高位移入0,最低位移入CF。SARAL�1AL算术右移1位�以最高位内容移入�最低位移入CF,其余各位右移一位。�6�SHRAL�1AL逻辑右移1位�最高位移入0,最低位移入CF。RORAL�1AL的各位构成环形移位�右移一位�最低位内容同时移入到CF和最高位。�7�ROLBX�1BX各位构成环形移位�左移一位�最高位内容同时移入到CF和最低位。RCLBX�1BX和CF构成环形移位�左移一位�CF内容移入到最低位�最高位移入CF。5.写出下列转移指令的寻址方式�设L1为标号�VAR1为字型变量�DVAR1为双字型变量���1�JMPL1�2�JMPNEARL1�3�JNZL1�4�JMPBX�5�JGL1�6�JMPVAR1[SI]�7�JMPFARPTRL1�8�JMPDVAR1解��1�JMPL1段内直接寻址�2�JMPNEARPTRL1段内直接寻址�3�JNZL1段内直接寻址�4�JMPBX段内间接寻址�5�JGL1段内直接寻址�6�JMPVAR1[SI]段内间接寻址�7�JMPFARPTRL1段间直接寻址�8�JMPDVAR1段间间接寻址 6.设�DS��2000H��BX��0100H��SI��0002H��20100��3412H��20102��7856H��21200��4C2AH��21202��65B7H�求下列指令执行后AX寄存器的内容��1�MOVAX�1200H��2�MOVAX�BX��3�MOVAX,[1200H];�4�MOVAX,[BX];�5�MOVAX,1100[BX];�6�MOVAX,[BX][SI];�7�MOVAX,1100[BX][SI]解��1�1200H�2�0100H�3�4C2AH�4�3412H�5�4C2AH�6�7856H�7�65B7H7.执行下列指令后�DX寄存器中的内容是多少�TABLEDW25�36��1��16�10000�13PYLDW7„„MOVBX�OFFSETTABLEADDBX�PYLMOVDX�[BX]解�DX=10FFH由-16�FFF0H�的高8位和10000�2710H�的低8位构成8.如果堆栈的起始地址为2200�0000�栈底为0100H��SP��00A8H�求�1�栈顶地址��2�SS的内容��3�再存入数据5678H�3AF2H后�SP的内容。解�栈顶地址00A8H�SS=2200H�再存入2个字后�SP=00A4H9.设已用伪指令EQU定义了4个标识符�N1EQU2100N2EQU10N3EQU20000N4EQU25000下列指令是否正确�并说明原因。�1�ADDAL�N1�N2��2�MOVAX�N3�N4��3�SUBBX�N4�N3��4�SUBAH�N4�N3�N1��5�ADDAL�N2��6�MOVAH�N2*N2解��1�错误。N1-N2=2090>255�2�正确�3�正确 �4�错误。N4-N3-N1=2900>255�5�正确�6�正确10.按下列要求写出指令��1�将AX寄存器的低4位清零�其余位不变��2�将BX寄存器的低4位置1�其余位不变��3�将AL寄存器的低4位保持不变�高4位取反��4�测试BX中的位1和位2�当这两位同时为0时将AL置0FFH�否则AL清零��5�测试BX中的位1和位2�当这两位有一位为0时将AL置0FFH�否则AL清零��6�将AL中保存的字母ASCII码变换成相应的大写字母的ASCII码��7�将AL中保存的字母ASCII码变换成相应的小写字母的ASCII码��8�将AX中的各位取反��9�将DX中的低7位取反�高9位不变��10�将CX中的低8位与高8位互换。解��1�ANDAX�0FFF0H�2�ORBX�000FH�3�XORAL�0F0H�4�TESTBX�06H�5�MOVAX�BXJZZEROANDAX�06HMOVAL�00HXORAX�06HJMPOVERJZOVERZERO�MOVAL�0FFHMOVAL�0FFHOVER�OVER��6�ANDAL�5FH或者�CMPAL�61HJLOVER�无需变换或不是字母�CMPAL�7AHJGOVER�不是字母�ANDAL�5FH或SUBAL�20HOVER� �7�ORAL�20H或者�CMPAL�41HJLOVER�不是字母�CMPAL�5AHJGOVER�无需变换或不是字母�ORAL�20H或ADDAL�20HOVER��8�XORAX�0FFFFH或者NOTAX�9�XORDX�007FH�10�XCHGCH�CL11.写出完成下述功能的程序段��1�传送40H到AL寄存器��2�将AL的内容乘以2��3�传送16H到AH寄存器��4�AL的内容加上AH的内容。计算最后结果�AL���解��1�MOVAL,40H�2�SHLAL,1�3�MOVAH,16H�4�ADDAL�AHAL=96H12.写出完成下述功能的程序段��1�从缓冲区BUF的0004偏移地址处传送一个字到AX寄存器��2�将AX寄存器的内容右移2位��3�将AX内容与BUF的0006偏移地址处的一个字相乘��4�相乘结果存入BUF的0020H偏移地址处�低位在前�。解��1�LEASI,BUF MOVAX,[SI+4](2)SHRAX,1SHRAX,1(3)MULWORDPTR6[SI](4)MOV20H[SI],AXMOV22H[SI],DX13.设�BX��11001011B�变量VAR的内容为00110010B�求下列指令单独执行后BX的内容��1�XORBX�VAR��2�ANDBX�VAR��3�ORBX�VAR��4�XORBX�11110000B��5�ANDBX�00001111B��6�TESTBX�1解��1�00F9H�2�0002H�3�00FBH�4�003BH�5�000BH�6�00CBH14.设�DX��10111011B��CL��3��CF��1�求下列指令单独执行后DX的内容��1�SHRDX�1��2�SARDX�CL��3�SHLDX�CL��4�SHLDX�1��5�RORDX�CL��6�ROLDL�CL��7�SALDH�1��8�RCLDX�CL��9�RCRDL�1解�DX=0000000010111011BCF=1CL=3�1�SHRDX�1DX逻辑右移10000000001011101B=005DH�2�SARDX�CLDX算术右移30000000000010111B=0017H�3�SHLDX�CLDX逻辑左移30000010111011000B=05D8H�4�SHLDX�1DX逻辑左移10000000101110110B=0176H�5�RORDX�CLDX循环右移30110000000010111B=6017H�6�ROLDL�CLDL循环左移30000000011011101B=00DDH�7�SALDH�1DH算术左移10000000010111011B=00BBH�8�RCLDX�CLDX带进位循环左移30000010111011100B=05DCH �9�RCRDL�1DL带进位循环右移10000000011011101B=00DDH15.选择题�各小题只有一个正确答案��1�执行下列三条指令后�MOVSP�1000HPUSHAXCALLBXa.�SP��1000H�b.�SP��0FFEH�c.�SP��1004H�d.�SP��0FFCH��2�要检查寄存器AL中的内容是否与AH相同�应使用的指令为�a.ANDAL,AHb.ORAL,AHc.XORAL,AHd.SBBAL,AH�3�指令JMPNEARPTRL1与CALLL1�L1为标号�的区别在于�a.寻址方式不同�b.是否保存IP的内容�c.目的地址不同�d.对标志位的影响不同。解��1�DPUSHUAX则AX入栈�SP=0FFEH�CALLBX则IP入栈�SP=0FFCH�2�C异或�若相同�则AL=0�ZF�1。�3�B16.寄存器DX�AX组成32位数�DX为高位�编写程序段实现��1�DX�AX右移3位�并将移出的低3位保存在CL中��2�DX�AX左移3位�并将移出的高3位保存在CL中�解��1�移出的3位应该按时序移入CL中。XORCL,CLMOVBL,3L1:SHRDX�1RCRAX�1RCLCL�1DECBLJNZL1�2�移出的3位应该按时序移入CL中。XORCL,CL MOVBL,3L1:SHLAX�1RCRDX�1RCRCL�1DECBLJNZL117.编写程序段实现将BL中的每一位重复4次�构成32位的双字DX�AX�例如当BL�01011101B时�则得到的�DX��0F0FH��AX��0FF0FH。解�算术右移时�移入的值就是最高位本身�这样可以使位内容重复�利用这一点可以实现题目的要求。XORDX,DXXORAX,AXMOVCX,4L1:SHRBL,1RCRAX,1SARAX,1SARAX,1SARAX,1LOOPL1MOVCX,4L2:SHRBL,1RCRDX,1SARDX,1SARDX,1SARDX,1LOOPL218.字变量VAR1中保存有小于38250的16位无符号数�编写程序段实现VAR1÷150�并进行四舍五入操作�将商保存在字节变量VAR2中。解�根据题意�38250÷150�255�因此商不会超过255�可以用一个字节表示。a÷b的四舍五入操作可以通过判断除后余数实现�余数大于等于除数的一半�则商加1� 否则不用加1。但这种方法用汇编语言编程实现时比较复杂�这里介绍另外一种方法�设a÷b的四舍五入后的结果为c�用『』表示取整数操作�则�a�b���a����2�c0.5���b��b���这种方法是在除法操作之前�在被除数上加上除数的一半�这样除法操作后得到的值就是考虑了四舍五入的商。VAR1DW12345VAR2DB?DATAADB150MOVAX,VAR1XORBX,BXMOVBL,DATAASHRBX,1ADDAX,BXDIVDATAAMOVVAR2,AL19.有一组无符号的16位数据保存在BUFFER中�前两个字节存放数据的个数�编程实现按下式进行滤波处理�1y(k)��x(k)�x(k�1)�x(k�2)�k�23y(k)�x(k)k�2解�滤波结果保存在FILT中。BUFFERDW0CHDW33H,18H,1BH,06H,33H,08HDW3H,6H,0FH,51H,05H,0CHFILTDW100HDUP�?�LEASI,BUFFERLEADI,FILT MOVCX,[SI]MOV[DI],CXADDSI,2ADDDI,2XORDX,DXMOVAX,[SI]MOV[DI],AXMOVBX,2[SI]MOV2[DI],BXADDSI,4ADDDI,4DECCXDECCXADDAX,BXADCDX,0MOVBX,3L1:ADDAX,[SI]ADCDX,0PUSHDXPUSHAXDIVBXMOV[DI],AXPOPAXPOPDXSUBAX,[SI-4]SUBBDX,0ADDDI,2ADDSI,2LOOPL1 20.在由字符串构成的缓冲区BUFFER中�前2个字节存放字符个数�后续每个字节存放一个字符的ASCII码。编写程序实现将字符串‘2004’替换成‘2006’。解�在数据段中定义�BUFFERDW74DB‘Thisyearis2004.In2004,wehaveaplanforreducingannualexpensive10%’DESTDB‘2004’在代码段中编写程序段�CLDLEASI,BUFFERMOVCX,[SI]ADDSI,2LEADI,DESTL1:PUSHSIPUSHDIPUSHCXMOVCX,4REPZSCASBJNZL2MOVBYTEPTR[SI-1],’6’L2:POPCXPOPDIPOPSIINCSIINCDILOOPL121.定义有下列宏指令�WAGSMACROS1,S2,S3SUBAX,AX MOVDX,AXADDAX,S1ADDAX,S2ADCDX,0ADDAX,S3ADCDX,0ENDM当采用宏调用指令“WAGS60000�25000�3000”时�执行后DX�AX�。解�宏指令WAGS完成的功能为S1+S2+S3�结果放在DX:AX中。所以�调用“WAGS60000,25000,3000”时�其结果为DX=0001H�AX=57C0H22.对上题定义的宏指令�如果采用宏调用指令“WAGSBX,CX,SI”时�写出宏展开形式。解�调用“WAGSBX,CX,SI”时�宏展开形式�SUBAX,AXMOVDX,AXADDAX,BXADDAX,CXADCDX,0ADDAX,SIADCDX,023.写出宏指令SUMMING�实现将字节缓冲区array中的内容求校验和�保留低8位��并保存在VALUE中。解�设array前两个字节保存缓冲区字节数�在宏指令SUMMING�将array和VALUE作为形式参数。SUMMINGMACROarray,VALUELEASI,arrayMOVCX,[SI]ADDSI,2XORAL,ALL1:ADDAL,[SI]INCSI LOOPL1MOVVALUE,ALENDM 第4章汇编语言程序设计1.已知在BUF的起始处保存有N个字符的ASCII码�编写汇编语言程序实现�将这组字符串传送到缓冲区BUFR中�并且使字符串的顺序与原来的顺序相反。解�BUFDB"BONJOUR_BELLE"BUFRDB100DUP(?)MOVCX,NLEASI,BUFLEADI,BUFRADDDI,CXDECDIL1:MOVAL,[SI]MOV[DI],ALINCSIDECDILOOPL12.利用移位、传送和相加指令实现AX的内容扩大10倍。解�将扩大后的结果放在DX�AX中�注意到10×AX�8×AX�2×AX。XORDX,DXSHLAX,1RCLDX,1MOVBX,AXMOVCX,DXSHLAX,1RCLDX,1SHLAX,1RCLDX,1 ADDAX,BXADCDX,CX3.在缓冲区VAR中连续存放着3个16位的无符号数�编写程序实现将其按递增关系排列�如果VAR中保存的为有符号数�则再编写程序实现将其按递减关系排列。解�VARDW1236�-432�3900XORSI,,SIMOVAX,VAR[SI]CMPAX,VAR[SI+2]JAEL1XCHGAX,VAR[SI+2]L1:CMPAX,VAR[SI+4]JAEL2XCHGAX,VAR[SI+4]L2:MOVVAR[SI],AXMOVAX,VAR[SI+2]CMPAX,VAR[SI+4]JAEL3XCHGAX,VAR[SI+4]L3:MOVVAR[SI+2],AX4.编写程序段实现将AL和BL中的每一位依次交叉�得到的16位字保存在DX中�例如�AL��01100101B��BL��11011010B�则得到的�DX��1011011010011001B。解�利用移位指令完成。XORDX,DXMOVCX,8L1:SHRAL,1RCRDX,1 SHRBL,1RCRDX,1LOOPL15.在变量VAR1和VAR2中分别保存有两个字节型的正整数�编写完整的汇编语言程序实现��1�当两数中有一个奇数时�将奇数存入VAR1�偶数存入VAR2��2�当两数均为奇数时�两个变量的内容不变��3�当两数均为偶数时�两数缩小一倍后存入原处。解�当VAR1为奇数时�不论VAR2的奇偶性�这两个单元的内容均不变�只有当VAR1为偶数时�如果VAR2为奇数�则VAR1与VAR2内容交换�如果VAR2为偶数�则两数缩小一倍后存入原处。DATASEGMENTVAR1DB28VAR2DB36DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATA,ES:DATASTART:MOVAX,DATAMOVDS,AXMOVES,AXMOVAL,VAR1MOVBL,VAR2TESTAL,1JZEVEN1JMPOVEREVEN1:TESTBL,1JZEVEN2MOVVAR1,BL MOVVAR2,ALJMPOVEREVEN2:SHRAL,1MOVVAR1,ALSHRBL,1MOVVAR2,BLOVER:MOVAH,4CHMOVAL,0INT21HCODEENDSENDSTART6.已知在字变量VAR1、VAR2和VAR3中保存有3个相同的代码�但有一个错码�编写程序段找出这个错码�并将它送到AX�其地址送SI�如果3个代码都相同�则在AX中置�1标志。解�在数据段中定义�VAR1DW5A34HVAR2DW5A35HVAR3DW3A34H在代码段中编写程序段�MOVAX,-1MOVBX,VAR1CMPBX,VAR2JZL2CMPBX,VAR3JZL1MOVAX,BXLEASI,VAR1JMPOVER L1:MOVAX,VAR2LEASI,VAR2JMPOVERL2:CMPBX,VAR3JZOVERMOVAX,VAR3LEASI,VAR3OVER:7.分析下列程序段的功能�MOVCL�04SHLDX�CLMOVBL�AHSHLAX�CLSHRBL�CLORDL�BL解�程序段完成DX:AX组成的32位无符号数左移4位�低位补零�也即除以16�。8.下列程序段执行后�求BX寄存器的内容�MOVCL�3MOVBX�0B7HROLBX�1RORBX�CL解�实际上完成BX内容循环右移2位�因此�BX寄存器的内容为C02DH。9.下列程序段执行后�求BX寄存器的内容�MOVCL�5MOVBX�7D5CHSHRBX�CL解�完成BX内容逻辑右移5位�因此�BX寄存器的内容为03EAH。 10.将BUFFERS中N个字按相反顺序传递到BUFFERT中。解�LEASI,BUFFERSLEADI,BUFFERTMOVCX,NADDDI,NADDDI,NSUBDI,2L1:MOVAX,[SI]MOV[DI],AXADDSI,2SUBDI,2LOOPL111.数组ARRAY中存放有一组字型数据�前两个字节存放数据长度�5的倍数�。为给这个数组中的数据进行加密保护�每5个数据取出一个数据进行加密处理�奇数位进行取反�偶数位不变�例如对数据0110110010110001B加密后变成1100011000011011B�编写加密程序encrpytion和解密程序unencrpytion。解�约定从第一个数据开始�每5个数据为一组�每组中的第一个数据采取加密/解密处理。由于加密算法采用的是取反操作�解密算法也采用取反操作�因此解密和解密算法是同一个程序。ENCRPYTIONPROCNEARLEASI,ARRAYXORDX,DXMOVAX,[SI]MOVBX,5DIVBXMOVCX,AXADDSI,2L1: MOVAX,[SI]XORAX,0AAAAHMOV[SI],AXADDSI,10LOOPL1RETENCRPYTIONENDP13.设BUF中存放有N个无符号数�或有符号数��编程实现求它们的最小值�存入AX�和最大值�存入DX�。解�BUF存放有N个无符号数的程序如下�MOVCX,NLEASI,BUFMOVAX,[SI]MOVDX,AXADDSI,2L1:CMPAX,[SI]JBENOCHG1XCHGAX,[SI]NOCHG1:CMPDX,[SI]JAENOCHG2XCHGDX,[SI]NOCHG2:ADDSI,2LOOPL1如果BUF中存放的是有符号数�则只需要将程序中的两行内容修改�JBENOCHG1改成�JLENOCHG1JAENOCHG2改成�JGENOCHG2 14.设BUFFER中存放有N个无符号�第1个字节存放缓冲区的长度��编程实现将其中的0元素抹去�并更新其长度。解�设BUFFER中存放的是字节型数据。采用双指针方法�SI为读指针�DI为写指针�从低地址开始�内存中读出一个字节�如果不为0�则写入内存�如果为0�则不进行写操作。LEASI,BUFFERXORCX,CXMOVCL,[SI]INCSIMOVDI,SIXORBH,BHXORAL,ALL1:CMP[SI],ALJZL2MOVBL,[SI]MOV[DI],BLINCDIINCBHL2:INCSILOOPL1MOVBUFFER,BH16.编写一个子程序实现统计AL中1的个数�然后检测出字节型缓冲区BUF中0和1个数相等的元素个数。解�统计AL中1的个数�只需将AL右移�移出的一位内容进行累加�子程序为�COUNTBYTEPROCNEARPUSHAXPUSHCX MOVCX,8XORBL,BLCOU1:SHRAL,1ADCBL,0LOOPCOU1POPCXPOPAXRETCOUNTBYTEENDP在此基础上�可以检测出字节型缓冲区BUF中0和1个数相等的元素个数�即一个字节中有4个1。设BUF中有N个字节型数据�结果保持在BH中。MOVCX,NLEASI,BUFXORBH,BHL1:MOVAL,[SI]CALLCOUNTBYTECMPBL,4JNZL2INCBHL2:INCSILOOPL119.在缓冲区BUFFER中�第1个字节存放数组的长度�<256��从第2个字节开始存放字符的ASCII码�编写子程序完成在最高位给字符加上偶校验。解�STACKSEGMENTSTACK"STACK"DW100HDUP�?�TOPLABELBYTESTACKENDS DATASEGMENTBUFFERDB3;首字节为字符串长度DB"ABC";字符串DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATA,ES:DATA,SS:STACKSTART:MOVAX,STACKMOVSS,AXLEASP,TOPMOVAX,DATAMOVDS,AXMOVES,AXLEADI,BUFFERXORCX,CXMOVCL,[DI]INCDICALLSETEVENMOVAH,4CH;返回DOSMOVAL,0INT21HSETEVENPROCNEAR;加偶校验子程序PUSHAXPUSHBXPUSHCXPUSHDISETEVEN1:MOVAL,[DI]CALLCOUNTBYTE ANDBL,01HJZSETEVEN2ORAL,80HMOV[DI],ALSETEVEN2:INCDILOOPSETEVEN1POPDIPOPCXPOPBXPOPAXRETSETEVENENDPCOUNTBYTEPROCNEARPUSHAXPUSHCXMOVCX,8XORBL,BLCOU1:SHRAL,1ADCBL,0LOOPCOU1POPCXPOPAXRETCOUNTBYTEENDPCODEENDSENDSTART20.编写程序完成求多位数�N个字�的绝对值。 21.已知斐波那契数列的定义为�F�1,F�1,F�F�F(i�3)�编写求该12ii�1i�2数列前n项的子程序。解�设奖斐波那契数列存放在字变量RESULT中。在数据段中定义RESULTDW100HDUP�?�在代码段中编写子程序FIBONACCIPROCNEARXORDI,DIMOVRESULT[DI],1�前两个数为1MOVRESULT[DI+2],1ADDDI,4MOVCX,NL1:MOVAX,RESULT[DI-4]ADDAX,RESULT[DI-2]MOVRESULT[DI],AXADDDI,2LOOPL1RETFIBONACCIENDP22.编写程序实现循环显示10条信息�保存每条信息的变量分别为INFOM1�INFORM10。解�在数据段中定义变量�TABLEDWINFORM1,INFORM2,INFORM3,INFORM4,INFORM5DWINFORM6,INFORM7,INFORM8,INFORM9,INFORM10在代码段中编写程序段�MOVCX,10XORSI,SIL1:MOVDX,TABLE[SI]MOVAH,9 INT21HADDSI,2CALLWAITLOOPL1这里�WAIT为延时子程序�用于在显示信息之间的停顿。23.编写程序实现将包含20个数据的数组ARRAY分成两个数组�正数数组ARRAYP和负数数组ARRAYN�并分别将这两个数组中数据的个数显示出来。解�先编写一个子程序DISPALD�完成以3位十进制数形式显示出AL的内容。DISPALDPROCNEARPUSHAXPUSHCXPUSHDXXORAH,AHMOVCL�100DIVCLPUSHAXMOVDL,30HADDDL,ALMOVAH,2INT21HPOPAXMOVAL,AHXORAH,AHMOVCL,10DIVCLPUSHAXMOVDL,30HADDDL,ALMOVAH,2 INT21HPOPAXMOVDL,30HADDDL,AHMOVAH,2INT21HPOPDXPOPCXPOPAXRETDISPALDENDP在此基础上�根据题目要求�需要用到3个指针�SI指向源数组ARRAY�DI指向正数数组ARRAYP�BX指向负数数组ARRAYN。MOVCX,20XORDX,DXLEASI,ARRAYLEADI,ARRAYPLEABX,ARRAYNL1:MOVAL,[SI]ANDAL,ALJSL2MOV[DI],ALINCDIINCDLJMPL3L2:MOV[BX],ALINCBXINCDHL3:INCSI LOOPL1MOVAL,DLCALLDISPALDMOVAL,DHCALLDISPALD24.编写程序实现求缓冲区BUFFER的100个字中的最小偶数�存入AX�。解�设BUFFER中存放的是有符号数。MOVCX,100LEASI,BUFFERMOVAX,7FFFHL1:ANDWORDPTR[SI],1JNZL2CMP[SI],AXJGEL2MOVAX,[SI]L2:ADDSI,2LOOPL122225.编写程序实现求级数1�2���n��的前n项和刚大于2000的项数n。解�BL用于存放项数。STACKSEGMENTSTACK"STACK"DW100HDUP�?�TOPLABELWORDSTACKENDSDATASEGMENTDB100HDUP�?�DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATA,ES:DATA,SS:STACKSTART: MOVAX,DATAMOVDS,AXMOVES,AXMOVAX,STACKMOVSS,AXLEASP,TOPMOVBL,1MOVCX,0COUNT:MOVAL,BLMULBLADDCX,AXCMPCX,2000JAEXITINCBLJMPCOUNTEXIT:26.定义一条宏指令�实现将指定数据段的段地址传送到段寄存器ES或DS的功能。解�27.定义一条宏指令�实现从键盘中输入一个字符串�利用INT21H的09号功能�。28.定义一条宏指令�实现在屏幕上输出回车、换行。29.利用其它指令完成与下列指令一样的功能��1�REPMOVSB��2�REPLODSB��3�REPSTOSB��4�REPSCASB。解�设DF=0�1�L1:MOVAL,[SI]MOVES:[DI],ALINCSIINCDI LOOPL1�2�L1:MOVAL,[SI]INCSILOOPL1�3�L1:MOVES:[DI],ALINCDILOOPL1�4�L1:MOVAL,[SI]CMPAL,ES:[DI]INCSIINCDILOOPL130.设在数据段中定义了�STR1DB‘ASSEMBLELANGUAGE’STR2DB20DUP(?)利用字符串指令编写程序段实现��1�从左到右将STR1中的字符串传送到STR2��2�从右到左将STR1中的字符串传送到STR2��3�将STR1中的第6个和第7个字节装入DX��4�扫描STR1字符串中有无空格�如有则将第一个空格符的地址传送到SI。解�STR1中有17个字符�含一个空格��设DS和ES均指向STR1和STR2所在的段。�1�CLDMOVCX,17LEASI,STR1LEADI,STR2REPMOVSB�2�MOVCX,17LEASI,STR1LEADI,STR2 ADDSI,CXDECSIL1:MOVAL,[SI]MOV[DI],ALDECSIINCDILOOPL1�3�LEASI,STR1MOVDX,[SI+6]�4�MOVCX,17LEASI,STR1MOVAL,20HL1:CMP[SI],ALJZL2INCSILOOPL1L2:31.设在数据段中定义了�STRINGDB‘TodayisSunday&July16,2000’编写程序实现将STRING中的’&’用’/’代替。解�STRING中保存了30个字符。MOVCX,30LEASI,STRINGMOVAL,’&’L1:CMP[SI],ALJNZL2MOVBYTEPTR[SI],’/’L2:INCSILOOPL1 32.分析下列程序段完成的功能�MOVCX�100LEASI�FIRSTLEADI�SECONDREPMOVSB解�将缓冲区FIRST中100个字节传送到SECOND中。33.分析下列程序段�LEADI�STRINGMOVCX�200CLDMOVAL�20HREPZSCASBJNZFOUNDJMPNOT_FOUND问�转移到FOUND的条件。解�在缓冲区STRING中搜索非空格字符�如果有非空格则转到FOUND�如果200个单元中都是空格�则转到NOT_FOUND。34.设在数据段的变量OLDS和NEWS中保存有5个字节的字符串�如果OLDS字符串不同于NEWS字符串�则执行NEW_LESS�否则顺序执行程序。解�设DS和ES均指向字符串OLDS和NEWS所在的段。CLDMOVCX,5LEASI,OLDSLEADI,NEWSREPZCMPSBJNZNEW_LESS35.编程实现将STRING字符串中的小写字母变换成大写字母。解�设STRING中的字符个数为N。 MOVCX,NLEASI,STRINGMOVAL,5FHL1:AND[SI],ALINCSILOOPL136.设在数据段中定义了�STUDENT_NAMEDB30DUP���STUDENT_ADDRDB9DUP���STUDENT_PRINTDB50DUP���编写程序实现�用空格符清除缓冲区STUDENT_PRINT�在STUDENT_ADDR中查找第一个’_’字符�在STUDENT_ADDR中查找最后一个’_’字符�如果STUDENT_NAME中全为空格符�则STUDENT_PRINT全存入’*’�将STUDENT_NAME传送到STUDENT_PRINT的前30个字节中�将STUDENT_ADDR传送到STUDENT_PRINT的后9个字节中。37.(上机题)编写程序实现�将缓冲区BUFFER中的100个字按递增排序�并按下列格式顺序显示�数据1<原序号>数据2<原序号>„„38.(上机题)按同余法产生一组随机数N�1A:<人数1>B:<人数2>C:<人数3> D:<人数4>E:<人数5>F:<人数6>39�(上机题)编写程序实现下列5项功能�通过从键盘输入1�5进行菜单式选择��1�按数字键“1”�完成将字符串中的小写字母变换成大写字母。用户输入由英文大小写字母或数字0�9组成的字符串�以回车结束��变换后按下列格式在屏幕上显示�<原字符串>例如�abcdgyt0092<新字符串>ABCDGYT0092按任一键重做�按Esc键返回主菜单。�2�按数字键“2”�完成在字符串中找最大值。用户输入由英文大小写字母或数字0�9组成的字符串�以回车结束��找出最大值后按下列格式在屏幕上显示�<原字符串>Themaximumis<最大值>�按任一键重做�按Esc键返回主菜单。�3�按数字键“3”�完成输入数据组的排序。用户输入一组十进制数值�小于255��然后变换成十六进制数�并按递增方式进行排序�按下列格式在屏幕上显示�<原数值串><新数值串>按任一键重做�按Esc键返回主菜单。�4�按数字键“4”�完成时间的显示。首先提示用户对时�即改变系统的定时器HH�MM�SS�以冒号间隔�回车结束��然后在屏幕的右上角实时显示出时间�HH�MM�SS。按任一键重新对时�按Esc键返回主菜单。�5�按数字键“5”�结束程序的运行�返回操作系统。解�※主程序的编程思路�此程序共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。结束程序的运行�返回操作系统。其流程框图见图3-1。 START初始化E调用子程序MENU设置光标位置�41,10�带回显的控制台输入(AL)←输入字符Y(AL)<‘1’NY(AL)>‘5’N将跳转表TABLE的偏移地址送入(BX)(AL)←(AL)–‘1’(AL)←(AL)*2AL按符号扩展成AX(BX)←TABLE(BX)←(BX)+(AX)N=1N=2N=5N=3N=4ABCDEND图3-1主程序流程框图 AB调用子程序CHGLTR调用子程序MAXLTR带回显的控制台输入带回显的控制台输入(AL)←输入字符(AL)←输入字符NN(AL)=ESC?(AL)=ESC?YYEECD调用子程序SORTNUM调用子程序TIMCHK带回显的控制台输入带回显的控制台输入(AL)←输入字符(AL)←输入字符NN(AL)=ESC?(AL)=ESC?YYEE图3-1�续�主程序流程框图※子程序MENU的编程思路�设置显示器显示方式为80*25彩色文本方式�清屏。逐行设置光标位置�使提示文档左对齐整体居中。输出1-5的提示文档�再输出输入N的提示。其流程框图见图3-2。STARTMN初始化清屏设置光标位置�5,7�设置光标位置�5,9�显示提示字符串STRING3显示提示字符串STRING5设置光标位置�5,5�显示提示字符串STRING1设置光标位置�5,8�设置光标位置�5,10�显示提示字符串STRING4显示提示字符串设置光标位置�5,6�STRINGN显示提示字符串STRING2N子程序MENU返回M图3-2子程序MENU流程框图 ※子程序CHGLTR的编程思路�START设置显示器显示方式为80*25彩色文本方式�清屏。设置光标位初始化清屏置�使提示文档左对齐整体居中。输出输入字符串提示文档�读取输入字符串并将其放入KEYBUF。在设置光标位置�5,5�输入字符串尾加结束标志$�输出输显示提示字符串IN_STR入字符串。从前往后�依次取字符设置光标位置�5,6�串中的每个字符�若其为小写字母�KEYBUF←输入字符串则将其ASCII码减去20H。输出变换后的字符串。最后输出说明文档。(AL)←输入字符串长度其流程框图见图3-3。AL按符号扩展成AX(CX)←(AX)在字符串尾加结束标志’$’设置光标位置�5,7�显示提示字符串PRESTR显示输入的字符串(BX)←KEYBUF+2N((BX))≥‘a’Y((BX))←((BX))∧0DFH(BX)←(BX)+1N(CX)←(CX)–1(CX)=0?Y设置光标位置�5,8�显示提示字符串NEWSTR显示变换后的字符串设置光标位置�5,9�显示提示字符串HINSTR子程序CHGLTR返回图3-3子程序CHGLTR流程框图 ※子程序MAXLTR的编程思路�START设置显示器显示方式为80*25彩色文本方式�清屏。设置光标位初始化清屏置�使提示文档左对齐整体居中。输出输入字符串提示文档�读取输设置光标位置�5,5�入字符串并将其放入KEYBUF。在显示提示字符串IN_STR输入字符串尾加结束标志$�输出输设置光标位置�5,6�入字符串。预设字符串中最大值为KEYBUF←输入字符串0。从前往后�依次取字符串中的每个字符�若其大于当前最大值�则进行替换�即可得到字符串中的最(AL)←输入字符串长度大值�并输出。最后输出说明文档。AL按符号扩展成AX其流程框图见图3-4。(CX)←(AX)在字符串尾加结束标志’$’设置光标位置�5,7�显示提示字符串OUT_STR显示输入的字符串设置光标位置�5,8�显示提示字符串MAXCHR(DL)←0(BX)←KEYBUF+2N((BX))>(DL)Y(DL)←((BX))(BX)←(BX)+1N(CX)←(CX)–1(CX)=0?Y显示字符(DL)设置光标位置�5,9�显示提示字符串HINSTR子程序MAXLTR返回图3-4子程序MAXLTR流程框图 ※子程序SORTNUM的编程思路�START设置显示器显示方式为80*25彩色文本方式�清屏。设置光标位置�使提示文档左对齐整体居中。输出输入数据组提示初始化清屏文档�读取输入数据组字符串并将其放入KEYBUF。调用子程序CIN_INT�将字符设置光标位置�5,5�串转换成数据串。判断数据串是否有错误显示提示字符串IN_NUM或者为空�若是�则重新输入数据组。调设置光标位置�5,6�用子程序MPSORT�采用冒泡法对数据串KEYBUF←输入字符串进行排序。再调用子程序INT_OUT�输出排序后的数据组。最后输出说明文档。调用子程序CIN_INT其流程框图见图3-5。Y(AL)=0?N设置光标位置�5,7�显示提示字符串OUT_NUM设置光标位置�5,8�调用子程序MPSORT调用子程序INT_OUT设置光标位置�5,9�显示提示字符串HINSTR子程序SORTNUM返回图3-5子程序SORTNUM流程框图※子程序CIN_INT的编程思路�入口参数为�无�出口参数为�AL�有无错误标志�0为有�1为无�。从前往后�依次取字符串中的每个字符进行判断。CH表示数据组数据个数�AL表示当前数据x�DL作为有无数据标志。若当前字符为空格�则转到ADDNUM�判断DL是否为1�若为1�则CH增1�调用子程序ADDNEW�增加新数x�然后DL、AL清零�否则判断当前字符c是否在‘0’-‘9’之间�若不是�则判错�将AL置0�子程序CIN_INT返回�否则�DL置1�x=x*10+c-‘0’�判断x是否超过255�若是�则判错�将AL置0�子程序CIN_INT返回�否则�对下一个字符进行操作。字符串判断结束后�若DL为1�则有新数x未加至数据组�调用子程序ADDNEW�增加新数x。将数据组个数CH放入NUMBUF�将AL置1。其流程框图见图3-6。※子程序ADDNEW的编程思路�入口参数为�CH�数据组数据个数�、AL�当前数据x��出口参数为�无。取出数据组NUMBUF的首地址�加上数据组数据个数�即为当前数据x的地址�将x放入该地址。其流程框图见图3-7。 STARTT初始化NUMBUF←(CH)(CL)←输入字符串长度(AL)←1(SI)←KEYBUF+2R(CH)←0(DH)←10(AL)←0(AL)←0(DL)←0子程序CIN_INT返回Y((SI))=‘’?NNY(DL)≠1?((SI))<‘0’RYN(CH)←(CH)+1Y调用子程序ADDNEW((SI))>‘9’R(DL)←0N(AL)←0(DL)←1(AX)←(AL)*(DH)(BH)←0(BL)←((SI))图3-6子程序CIN_INT流程框图(AX)←(AX)+(BX)(AX)←(AX)–‘0’STARTY(AH)>0R初始化NBX、AX进栈(SI)←(SI)+1(BX)←NUMBUF(CL)←(CL)-1(AL)←(CH)Y(CL)≠0?AL按符号扩展成AX(BX)←(BX)+(AX)NAX出栈Y((BX))←(AL)(DL)≠1?TBX出栈N(CH)←(CH)+1子程序ADDNEW返回调用子程序ADDNEW图3-7子程序ADDNEW流程框图 ※子程序MPSORT的编程START思路�对N个数据进行从小到大(AL)←(NUMBUF)排序�采用“冒泡法”�从前往后�每两个数据进行比较�Y当前者大于后者时�交换两者(AL)≤1的次序�否则不变。经过N-1N次比较�可以将最大值交换到AL按符号扩展成AX第N个单元。接着对前N-1个(CX)←(AX)数据�重复上述过程�使次大(SI)←NUMBUF值交换到第N-1个单元�依此(SI)←(SI)+(CX)类推�若某次比较过程�无任(CX)←(CX)–1何交换�则终止其后的所有比较过程。最多进行N-1次比较过程�可以完成数据的排序操CX、SI进栈作。(DL)←0其流程图见图3-8。(AL)←((SI))Y(AL)≥((SI)–1)N(AL)←→((SI–1))((SI))←(AL)(DL)←1(SI)←(SI)-1(CX)←(CX)–1N(CX)=0?Y((BX))>‘9‘SI、CX出栈N(DL)=1?YN(CX)←(CX)–1Y(CX)=0?子程序MPSORT返回图3-8子程(序(BXM))P>SO‘9R‘T流程框图 ※子程序IN_OUT的编程思路�START从数据组中依次取出每个数据�调用OUTNUM�将十进制数据转成十六进制进行初始化输出�数据之间输出一个空格作为分隔符。(AL)←(NUMBUF)其流程图见图3-9。AL按符号扩展成AX(CX)←(AX)(BL)←10H(SI)←NUMBUF+1(AL)←((SI))调用子程序OUTNUM(SI)←(SI)+1显示字符‘’START(CX)←(CX)–1N(CX)=0?初始化Y(AH)←0((BX))>‘9‘(AX)/(BL)→商(AL),余(AH)子程序INT_OUT返回AX进栈图3-9子程序INT_OUT流程框图Y(AH)<10N(AH)←(AH)+7※子程序OUTNUM的编程思路�入口参数�AL�待转换的数据��BL�转换进制数��出口参数�无。待转换数据x除以(AH)←(AH)+30H转换进制数�商为新的x�余数y为转换后的低(DL)←(AH)位。保存y�调用子程序OUTNUM本身�对新AX出栈�DX进栈的x进行进制转换并输入。取出y�对其进行输入�若低于10�则直接输出�否则转换成字母Y(AL)=0?输出。其流程图见图3-10。N调用子程序OUTNUMDX出栈显示字符(DL)子程序OUTNUM返回图3-10子程序OUTNUM流程框图 ※子程序TIMCHK的编程思路�设置显示器显示方式为80*25彩START色文本方式�清屏。设置光标位置�输出设置时间提示文档。读取输入时初始化清屏间字符串并将其放入KEYBUF。分别判断时、分、秒是否在有效数字范围�设置光标位置�5,6�若有效�则设置新的系统时间。调用显示提示字符串IN_TIM子程序TIME�在屏幕的右上角实时显KEYBUF←输入字符串示时间。其流程框图见图3-11。(AL)←输入字符串的1-2位数值�时�Y(AL)<0或F(AL)≥24N(CH)←(AL)(AL)←输入字符串的4-5位数值�分�Y(AL)<0或F(AL)≥60N(CL)←(AL)(AL)←输入字符串的7-8位数值�秒�Y(AL)<0或F(AL)≥60N(DH)←(AL)(DL)←0置系统时间F调用子程序TIME子程序TIMCHK返回图3-11子程序TIMCHK流程框图 ※子程序TIME的编程思路�START设置显示器显示方式为80*25彩色文本方式�清屏。设置光标位置�初始化清屏输出说明文档。实时显示时间�设置光标至屏幕右上角�读取系统时间�设置光标位置�10,9�调用子程序SHOWNUM分别对时、显示提示字符串HINSTR分、秒进行显示�并用‘:’作分隔符�设置光标等待位置�并进行延时�检设置光标位置�72,0�查键盘状态�若无键盘输入�则重复取系统时间上述步骤显示时间�否则子程序(AL)←(CH)TIME返回。调用子程序SHOWNUM其流程框图见图3-12。显示字符‘:’(AL)←(CL)调用子程序SHOWNUM显示字符‘:’(AL)←(DH)调用子程序SHOWNUM※子程序SHOWNUM的编程思路�设置光标位置�10,9�入口参数�AL�待显示的数据��出口参数�无。待显示数据x除以(BX)←0018H10�商为y�余数为z。将数字y、z分别转换成字符数字�然后输出。(CX)←0其流程框图见图3-13。START(CX)←(CX)–1Y(CX)=0?初始化AL按符号扩展成AXNCX、DX进栈(BX)←(BX)–1(CL)←10Y(BX)≠0?(AX)/(BL)→商(AL),余(AH)(AH)→(AH)+‘0’N(BH)→(AH)检查键盘状态(AL)→(AL)+‘0’显示字符(AL)、(BH)YAL=0?DX、CX出栈N子程序TIME返回子程序SHOWNUM返回图3-12子程序TIME流程框图图3-13子程序SHOWNUM流程框图 四、程序代码STACKSEGMENTSTACKDB256DUP(?)TOPLABELWORDSTACKENDSDATASEGMENTTABLEDWG1,G2,G3,G4,G5STRING1DB"1.Changesmalllettersintocapitallettersofstring;",0DH,0AH,"$"STRING2DB"2.Findthemaximumofstring;",0DH,0AH,"$"STRING3DB"3.Sortfordatas;",0DH,0AH,"$"STRING4DB"4.ShowTime;",0DH,0AH,"$"STRING5DB"5.Exit.",0DH,0AH,"$"STRINGNDB"Inputthenumberyouselect(1-5):$"IN_STRDB"Inputthestring(includingletters&numbers,lessthan60letters):",0DH,0AH,"$"PRESTRDB"Originalstring:$"NEWSTRDB"Newstring:$"OUT_STRDB"Thestringis$"MAXCHRDB"Themaximumis$"IN_NUMDB"Inputthenumbers(0-255,nomorethan20numbers):",0DH,0AH,"$"OUT_NUMDB"Sortednumbers:",0DH,0AH,"$"IN_TIMDB"Correctthetime(HH:MM:SS):$"HINTSTRDB"PressESC,gobacktothemenu;orpressanykeytoplayagain!$"KEYBUFDB61DB?DB61DUP(?)NUMBUFDB?DB20DUP(?)DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKSTART:MOVAX,DATAMOVDS,AXMOVAX,STACKMOVSS,AXMOVSP,OFFSETTOPMAIN:CALLFARPTRMENU;设置显示器AGAIN:MOVAH,2MOVBH,0;页号MOVDL,41;列号MOVDH,10;行号INT10H;光标位置设置 MOVAH,1INT21HCMPAL,"1"JBAGAINCMPAL,"5"JAAGAINSUBAL,"1";N-1SHLAL,1;(N-1)*2CBW;AL->AXLEABX,TABLEADDBX,AXJMPWORDPTR[BX]G1:CALLFARPTRCHGLTRMOVAH,8INT21HCMPAL,1BHJZMAINJMPG1G2:CALLFARPTRMAXLTRMOVAH,8INT21HCMPAL,1BHJZMAINJMPG2G3:CALLFARPTRSORTNUMMOVAH,8INT21HCMPAL,1BHJZMAINJMPG3G4:CALLFARPTRTIMCHKMOVAH,8INT21HCMPAL,1BHJZMAINJMPG4G5:MOVAH,4CHINT21H MENUPROCFAR;显示主界面;设置显示器方式MOVAH,0MOVAL,3;MOVBL,0;INT10H;清屏MOVAH,2MOVBH,0;页号MOVDL,5;列号MOVDH,5;行号INT10H;光标位置设置MOVAH,9LEADX,STRING1INT21HMOVAH,2MOVDL,5;列号MOVDH,6;行号INT10H;光标位置设置MOVAH,9LEADX,STRING2INT21HMOVAH,2MOVDL,5;列号MOVDH,7;行号INT10H;光标位置设置MOVAH,9LEADX,STRING3INT21HMOVAH,2MOVDL,5;列号MOVDH,8;行号INT10H;光标位置设置MOVAH,9LEADX,STRING4INT21HMOVAH,2MOVDL,5;列号MOVDH,9;行号INT10H;光标位置设置MOVAH,9LEADX,STRING5INT21HMOVAH,2MOVDL,5;列号 MOVDH,10;行号INT10H;光标位置设置MOVAH,9LEADX,STRINGNINT21HRETMENUENDPCHGLTRPROCFAR;将输入字符串中小写字母便换成大写字母RECHG:;设置显示器方式MOVAH,0MOVAL,3MOVBL,0INT10H;清屏MOVAH,2MOVBH,0;页号MOVDL,5;列号MOVDH,5;行号INT10H;输入提示光标位置设置MOVAH,9LEADX,IN_STRINT21H;输入字符串提示MOVAH,2MOVDL,5;列号MOVDH,6;行号INT10H;输入字符串光标位置设置MOVAH,0AHLEADX,KEYBUFINT21H;输入字符串CMPKEYBUF+1,0JZRECHG;判断输入字符串是否为空串LEABX,KEYBUF+2MOVAL,KEYBUF+1CBWMOVCX,AXADDBX,AXMOVBYTEPTR[BX],"$";在输入字符串尾加结束标志$MOVAH,2MOVBH,0;页号MOVDL,5;列号MOVDH,7;行号INT10H;源字符串提示光标位置设置MOVAH,9LEADX,PRESTR INT21H;输出源字符串提示MOVAH,9LEADX,KEYBUF+2INT21H;输出源字符串LEABX,KEYBUF+2LCHG:CMPBYTEPTR[BX],61HJBNOCHGANDBYTEPTR[BX],0DFHNOCHG:INCBXLOOPLCHG;将字符串中小写字母转换成大写字母MOVAH,2MOVBH,0;页号MOVDL,5;列号MOVDH,8;行号INT10H;新字符串提示光标位置设置MOVAH,9LEADX,NEWSTRINT21H;输出新字符串提示MOVAH,9LEADX,KEYBUF+2INT21H;输出新字符串MOVAH,2MOVBH,0;页号MOVDL,5;列号MOVDH,9;行号INT10H;提示信息光标位置设置MOVAH,9LEADX,HINTSTRINT21H;输出提示信息RETCHGLTRENDPMAXLTRPROCFAR;在输入字符串中找出最大值REMAX:;设置显示器方式MOVAH,0MOVAL,3MOVBL,0INT10H;清屏MOVAH,2MOVBH,0;页号MOVDL,5;列号MOVDH,5;行号 INT10H;输入提示光标位置设置MOVAH,9LEADX,IN_STRINT21H;输入字符串提示MOVAH,2MOVDL,5;列号MOVDH,6;行号INT10H;输入字符串光标位置设置MOVAH,0AHLEADX,KEYBUFINT21H;输入字符串CMPKEYBUF+1,0JZREMAX;判断输入字符串是否为空串LEABX,KEYBUF+2MOVAL,KEYBUF+1CBWMOVCX,AXADDBX,AXMOVBYTEPTR[BX],"$";在输入字符串位加结束标志$MOVAH,2MOVBH,0;页号MOVDL,5;列号MOVDH,7;行号INT10H;源字符串提示光标位置设置MOVAH,9LEADX,OUT_STRINT21H;输出字符串提示MOVAH,9LEADX,KEYBUF+2INT21H;输出字符串MOVAH,2MOVBH,0;页号MOVDL,5;列号MOVDH,8;行号INT10H;新字符串提示光标位置设置MOVAH,9LEADX,MAXCHRINT21H;输出字符串中最大值提示MOVDL,0LEABX,KEYBUF+2LCMP:CMP[BX],DLJBNOLCHGMOVDL,[BX] NOLCHG:INCBXLOOPLCMP;找出字符串中最大字符�放入DLMOVAH,2INT21H;输出字符串中最大字符MOVAH,2MOVBH,0;页号MOVDL,5;列号MOVDH,9;行号INT10H;提示信息光标位置设置MOVAH,9LEADX,HINTSTRINT21H;输出提示信息RETMAXLTRENDPSORTNUMPROCFAR;对输入数据组排序RESORT:;设置显示器方式MOVAH,0MOVAL,3MOVBL,0INT10H;清屏MOVAH,2MOVBH,0;页号MOVDL,5;列号MOVDH,5;行号INT10H;输入提示光标位置设置MOVAH,9LEADX,IN_NUMINT21HMOVAH,2MOVDL,5;列号MOVDH,6;行号INT10H;输入数据组光标位置设置MOVAH,0AHLEADX,KEYBUFINT21H;输入数据组字符串CALLCIN_INT;字符串转换成数据串CMPAL,0JZRESORT;判断数据串是否有错CMPNUMBUF,0JZRESORT;判断数据串是否为空 MOVAH,2MOVBH,0;页号MOVDL,5;列号MOVDH,7;行号INT10H;输出提示光标位置设置MOVAH,9LEADX,OUT_NUMINT21H;输出数据串提示MOVAH,2MOVBH,0;页号MOVDL,5;列号MOVDH,8;行号INT10H;输出数据组光标位置设置CALLFARPTRMPSORT;数据组排序CALLFARPTRINT_OUT;数据组的输出MOVAH,2MOVBH,0;页号MOVDL,5;列号MOVDH,9;行号INT10H;提示信息光标位置设置MOVAH,9LEADX,HINTSTRINT21H;输出提示信息RETSORTNUMENDPCIN_INTPROCNEAR;读入整型数;入口参数�无;出口参数为�AL�有无错误标志�0为有�1为无�MOVCL,KEYBUF+1LEASI,KEYBUF+2MOVCH,0;数据组数据个数置0MOVDH,10MOVAL,0;当前数据x=0MOVDL,0;有无数据标志置0�即无数据FNDNUM:CMPBYTEPTR[SI],""JZADDNUM;判断当前字符是否为空格CMPBYTEPTR[SI],"0"JBERRNUMCMPBYTEPTR[SI],"9"JAERRNUM;判断当前字符是否在"0"-"9"之间MOVDL,1;有无数据标志置1�即有数据MULDH XORBH,BHMOVBL,[SI]ADDAX,BXSUBAX,"0";计算出当前数据xCMPAH,0JAERRNUM;判断x是否越界JMPNEXTADDNUM:CMPDL,1JNZNEXT;判断是否有数据INCCH;数据组数据个数加1CALLADDNEWMOVDL,0MOVAL,0;清零NEXT:INCSIDECCLCMPCL,0JNZFNDNUM;依次检查各字符CMPDL,1JNZTOTAL;判断是否有未加入的数据INCCHCALLADDNEWTOTAL:MOVNUMBUF,CH;置数据组数据个数MOVAL,1;输入数据无错误JMPCRTNUMERRNUM:MOVAL,0;输入数据有错误CRTNUM:RETCIN_INTENDPADDNEWPROCNEAR;增加新数;入口参数�CH�数据组数据个数�、AL�当前数据x�;出口参数�无PUSHAXLEABX,NUMBUFMOVAL,CHCBWADDBX,AXPOPAXMOV[BX],ALRETADDNEWENDP MPSORTPROCFAR;数据组排序MOVAL,NUMBUFCMPAL,1JBENOSORT;若只有一个元素�停止排序CBWMOVCX,AXLEASI,NUMBUF;SI指向数据组首地址ADDSI,CX;SI指向数据组末地址DECCX;外循环次数LP1:;外循环开始PUSHCXPUSHSIMOVDL,0;交换标志置0LP2:;内循环开始MOVAL,[SI]CMPAL,[SI-1]JAENOXCHGXCHGAL,[SI-1];交换操作MOV[SI],ALMOVDL,1;交换标志置1NOXCHG:DECSILOOPLP2POPSIPOPCXCMPDL,1JNZNOSORT;判断交换标志LOOPLP1NOSORT:RETMPSORTENDPINT_OUTPROCFAR;输出数据组MOVAL,NUMBUFCBWMOVCX,AXMOVBL,10HLEASI,NUMBUF+1PRINT:MOVAL,[SI]CALLOUTNUMINCSIMOVAH,2MOVDL,""INT21HLOOPPRINT RETINT_OUTENDPOUTNUMPROCNEAR;将十进制数以十六进制输出;入口参数�AL�待转换的数据��BL�转换进制数16�;出口参数�无MOVAH,0DIVBLPUSHAXCMPAH,10JBPNUMADDAH,7PNUM:ADDAH,30HMOVDL,AHPOPAXPUSHDXCMPAL,0JZOUTNCALLOUTNUMOUTN:POPDXMOVAH,2INT21HRETOUTNUMENDPTIMCHKPROCFAR;设定并显示时间;设置显示器方式MOVAH,0MOVAL,3;MOVBL,0;INT10H;清屏MOVAH,2MOVBH,0;页号MOVDL,5;列号MOVDH,6;行号INT10H;设置提示光标位置设置MOVAH,9LEADX,IN_TIMINT21H;时间串提示MOVAH,0AHLEADX,KEYBUFINT21H;输入时间串 MOVBL,10MOVAL,KEYBUF+2SUBAL,"0"MULBLADDAL,KEYBUF+3SUBAL,"0"CMPAL,0JBINVALIDCMPAL,24JAEINVALID;判断时有效性MOVCH,ALMOVAL,KEYBUF+5SUBAL,"0"MULBLADDAL,KEYBUF+6SUBAL,"0"CMPAL,0JBINVALIDCMPAL,60JAEINVALID;判断分有效性MOVCL,ALMOVAL,KEYBUF+8SUBAL,"0"MULBLADDAL,KEYBUF+9SUBAL,"0"CMPAL,0JBINVALIDCMPAL,60JAEINVALID;判断秒有效性MOVDH,ALMOVDL,0MOVAH,2DHINT21H;置系统时间INVALID:CALLTIMERETTIMCHKENDPTIMEPROC;显示时间子程序;设置显示器方式MOVAH,0MOVAL,3;MOVBL,0;INT10H;清屏 MOVAH,2MOVBH,0;页号MOVDL,10;列号MOVDH,9;行号INT10H;提示信息光标位置设置MOVAH,9LEADX,HINTSTRINT21H;输出提示信息DISP1:MOVAH,2MOVBH,0;页号MOVDL,72;列号MOVDH,0;行号INT10H;提示光标位置设置MOVAH,2CH;取系统时间,CH,CL,DH分别存放时/分/秒INT21HMOVAL,CH;显示时CALLSHOWNUMMOVAH,2MOVDL,":"INT21HMOVAL,CL;显示分CALLSHOWNUMMOVAH,2MOVDL,":"INT21HMOVAL,DH;显示:秒CALLSHOWNUMMOVAH,02H;设置光标位置MOVDX,090AHMOVBH,0INT10HMOVBX,0018HRE:MOVCX,0FFFFH;延时REA:LOOPREADECBXJNZREMOVAH,0BH;或MOVAH,01HINT21H;INT16HCMPAL,0;JEDISP1JZDISP1;检查键盘状态RETTIMEENDP SHOWNUMPROC;把AL中的数字以十进制输出;入口参数�AL�待显示的数据�;出口参数�无CBWPUSHCXPUSHDXMOVCL,10DIVCLADDAH,"0"MOVBH,AHADDAL,"0"MOVAH,2MOVDL,ALINT21HMOVDL,BHINT21HPOPDXPOPCXRETSHOWNUMENDPCODEENDSENDSTART五、实验结果运行程序。主菜单界面�如图5-1。图5-1主菜单界面 在主菜单界面�图5-1�输入1�进入功能1界面�实现将字符串中的小写字母变换成大写字母。功能1界面�如图5-2。输入字符串�如�HuangCui02061488�输出结果如图5-3。按ESC键�返回主菜单界面�图5-1��按其他任意键�返回功能1界面�图5-2�。图5-2功能1界面图5-3功能1运行结果在主菜单界面�图5-1�输入2�进入功能2界面�实现在字符串中找最大值。功能2界面�如图5-4。输入字符串�如�HuangCui02061488�输出结果如图5-5。按ESC键�返回主菜单界面�图5-1��按其他任意键�返回功能2界面�图5-4�。图5-4功能2界面 图5-5功能2运行结果在主菜单界面�图5-1�输入3�进入功能3界面�实现输入数据组的排序�按递增方式进行排序并以十六进制数输出。功能3界面�如图5-6。输入数据组�如�255150116�输出结果如图5-7�若输入数据越界或有错误�则需重新输入�如图5-6。按ESC键�返回主菜单界面�图5-1��按其他任意键�返回功能3界面�图5-6�。图5-6功能3界面图5-7功能3运行结果 在主菜单界面�图5-1�输入4�进入功能4界面�实现时间的显示。功能4界面�如图5-8。输入用户设置的时间�若输入时间越界或有错误�则不修改系统时间�直接进行实时显示。如�输入12:70:00�输出结果如图5-9�显示时间由系统当时获取时间决定�本实验时�系统时间为18:27:36��输入12:00:00�输出结果如图5-10。接着�界面对时间进行实时显示�此处仅作文字说明�不附图。按ESC键�返回主菜单界面�图5-1��按其他任意键�返回功能4界面�图5-8�。图5-8功能4界面图5-9功能4运行结果1 图5-10功能4运行结果2在主菜单界面�图5-1�输入5�结束程序的运行�返回操作系统。 5章习题1.微处理器的外部结构表现为数量有限的输入输出引脚�它们构成了微处理器级总线。2.微处理器级总线经过形成电路之后形成了系统级总线。3.简述总线的定义及在计算机系统中采用标准化总线的优点。答�总线是计算机系统中模块�或子系统�之间传输数据、地址和控制信号的公共通道�它是一组公用导线�是计算机系统的重要组成部分。采用标准化总线的优点是�1)简化软、硬件设计。2)简化系统结构。3)易于系统扩展。4)便于系统更新。5)便于调试和维修。4.在微型计算机应用系统中�按功能层次可以把总线分成哪几类。答�在微型计算机应用系统中�按功能层次可以把总线分成�片内总线、元件级总线、系统总线和通信总线。5.简述RESET信号的有效形式和系统复位后的启动地址。答�RESET为系统复位信号�高电平有效�其有效信号至少要保持四个时钟周期�且复位信号上升沿要与CLK下降沿同步。系统复位后的启动地址为0FFFF0H。即��CS�=0FFFFH��IP�=0000H。6.8086CPU的M/IO信号在访问存储器时为高电平�访问I/O端口时为低电平。7.在8086系统总线结构中�为什么要有地址锁存器�答�8086CPU有20条地址线和16条数据线�为了减少引脚�采用了分时复用�共占了20条引脚。这20条引脚在总线周期的T1状态输出地址。为了使地址信息在总线周期的其他T状态仍保持有效�总线控制逻辑必须有一个地址锁存器�把T1状态输出的20位地址信息进行锁存。8.根据传送信息的种类不同�系统总线分为数据总线、地址总线和控制总线。9.三态逻辑电路输出信号的三个状态是高电平、低电平和高阻态。10.在8086的基本读总线周期中�在T1状态开始输出有效的ALE信号�在T2状态开始输出 低电平的RD信号�相应的DEN为__低__电平�DT/R为__低__电平�引脚AD15~AD0上在T1状态期间给出地址信息�在T4状态完成数据的读入。11.利用常用芯片74LS373构成8086系统的地址总线�74LS245作为总线收发器构成数据总线�画出8086最小方式系统总线形成电路。答�8086最小方式系统总线形成电路如图5.1所示。图5.18086最小方式系统总线形成电路12.微机中的控制总线提供H。A.数据信号流�B.存储器和I/O设备的地址码�C.所有存储器和I/O设备的时序信号�D.所有存储器和I/O设备的控制信号�E.来自存储器和I/O设备的响应信号�F.上述各项�G.上述C�D两项� H.上述C�D和E三项。13.微机中读写控制信号的作用是E。A�决定数据总线上数据流的方向�B�控制存储器操作读/写的类型�C�控制流入、流出存储器信息的方向�D�控制流入、流出I/O端口信息的方向�E�以上所有。14.8086CPU工作在最大方式�引脚MN/MX应接__地__。15.RESET信号在至少保持4个时钟周期的高电平时才有效�该信号结束后�CPU内部的CS为0FFFFH�IP为0000H�程序从0FFFF0H地址开始执行。16.在构成8086最小系统总线时�地址锁存器74LS373的选通信号G应接CPU的ALE信号�输出允许端OE应接地�数据收发器74LS245的方向控制端DIR应接DI/R信号�输出允许端E应接DEN信号。17.8086CPU在读写一个字节时�只需要使用16条数据线中的8条�在一个总线周期内完成�在读写一个字时�自然要用到16条数据线�当字的存储对准时�可在一个总线周期内完成�当字的存储为未对准时�则要在两个总线周期内完成。18.CPU在T状态开始检查READY信号�__高_电平时有效�说明存储器或I/O端口准3备就绪�下一个时钟周期可进行数据的读写�否则�CPU可自动插入一个或几个等待周期�TW��以延长总线周期�从而保证快速的CPU与慢速的存储器或I/O端口之间协调地进行数据传送。19.8086最大系统的系统总线结构较最小系统的系统总线结构多一个芯片8288总线控制器_。20.微机在执行指令MOV[DI]�AL时�将送出的有效信号有BC。A�RESETB.高电平的M/IO信号C.WRD.RD21.设指令MOVAX�DATA已被取到CPU的指令队列中准备执行�并假定DATA为偶地址�试画出下列情况该指令执行的总线时序图:�1�没有等待的8086最小方式;�2�有一个等待周期的8086最小方式。 答��1�没有等待的8086最小方式时序如图5.2所示。一个基本的总线周期T1T2T3T4CLKA19~A16S6~S3状态输出BHEBHEAD15~AD0A15~A0D15~D0数据输入ALEM/IORDDT/RDEN图5.2没有等待的8086最小方式时序�2�有一个等待周期的8086最小方式时序图如图5.3所示。 插入一个TW的总线周期T1T2T3TWT4CLKA19/S6~A16/S3A19~A16S6~S3状态输出BHEBHEAD15~AD0A15~A0D15~D0数据输入ALEM/IORDDT/RDEN图5.3有一个等待周期的8086最小方式时序图22.上题中如果指令分别为��1�MOVDATA+1�AX�2�MOVDATA+1�AL�3�OUTDX�AX�DX的内容为偶数��4�INAL�0F5H重做上题�1�。答��1�因为DATA为偶地址�则DATA+1为奇地址。故要完成本条指令�需要两个总线周期。时序图如图5.4所示。 图5.4执行MOVDATA+1�AX指令的时序参考图�2�DATA+1虽然为奇地址�但是AL为八位存储器�故本条指令需用一个总线周期�时序图如图5.5所示。 图5.5执行MOVDATA+1�AL指令的时序参考图�3�执行OUTDX�AX�DX的内容为偶数�指令的时序图如图5.6所示。图5.6执行OUTDX�AX指令的时序参考图�4�执行INAL�0F5H指令的时序图如图5.7所示。 图5.7执行INAL�0F5H指令的时序参考图23�8086最小方式下�读总线周期和写总线周期相同之处是�在T状态开始使1ALE信号变为有效高电平�并输出M/IO信号来确定是访问存储器还是访问I/O端口�同时送出20位有效地址�在T状态的后部�ALE信号变为低电1平�利用其下降沿将20位地址和BHE的状态锁存在地址锁存器中�相异之处从T2状态开始的数据传送阶段。 6章习题1�简述内存储器的分类及每种存储器的用途�解�内存储器按其工作方式的不同�可以分为随机存取存储器�简称随机存储器或RAM�和只读存储器�简称ROM�。随机存储器。随机存储器允许随机的按任意指定地址向内存单元存入或从该单元取出信息�对任一地址的存取时间都是相同的。由于信息是通过电信号写入存储器的�所以断电时RAM中的信息就会消失。计算机工作时使用的程序和数据等都存储在RAM中�如果对程序或数据进行了修改之后�应该将它存储到外存储器中�否则关机后信息将丢失。通常所说的内存大小就是指RAM的大小�一般以KB或MB为单位。只读存储器。只读存储器是只能读出而不能随意写入信息的存储器。ROM中的内容是由厂家制造时用特殊方法写入的�或者要利用特殊的写入器才能写入。当计算机断电后�ROM中的信息不会丢失。当计算机重新被加电后�其中的信息保持原来的不变�仍可被读出。ROM适宜存放计算机启动的引导程序、启动后的检测程序、系统最基本的输入输出程序、时钟控制程序以及计算机的系统配置和磁盘参数等重要信息。2.简述存储器的主要技术指标有哪些�解�存储器的主要技术指标有�存储容量、读写速度、非易失性、可靠性等。3.在实际工程应用中�存储器芯片的速度怎样估算�解�在选择存储器芯片时应注意是否与微处理器的总线周期时序匹配。作为一种保守的估计�在存储器芯片的手册中可以查得最小读出周期tcyc(R)(ReadCycleTime)和最小写周期tcyc(W)(WriteCycleTime)。如果根据计算�微处理器对存储器的读写周期都比存储器芯片手册中的最小读写周期大�那么我们认为该存储器芯片是符合要求的�否则要另选速度更高的存储器芯片。8086CPU对存储器的读写周期需要4个时钟周期(一个基本的总线周期)。因此�作为一种保守的工程估计�存储器芯片的最小读出时间应满足如下表达式�tcyc(R)�4T�tda�tD�T其中�T为8086微处理器的时钟周期�tda为8086微处理器的地址总线延时时间�tD为各种因素引起的总线附加延时。这里的tD应该认为是总线长度、附加逻辑电路、总线驱动器等引起的延时时间总和。同理�存储器芯片的最小写入时间应满足如下表达式�tcyc(W)�4T�tda―tD―T4.用下列RAM芯片构成32kB存储器模块�各需多少芯片�16位地址总线中有多少位参与片 内寻址�多少位可用作片选控制信号�(1)1k×1(2)1k×4(3)4k×8(4)16k×4解�(1)1k×132K�8�256片�1K�1片内寻址�AA�共10位�片选控制信号�AA�共6位。091015(2)1k×432K�8�64片�1K�4片内寻址�AA�共10位�片选控制信号�AA�共6位。091015(3)4k×832K�8�8片�4K�8片内寻址�AA�共12位�片选控制信号�AA�共4位。0111215(4)16k×432K�8�4片�16K�4片内寻址�AA�共14位�片选控制信号�AA�共2位。01314155.若存储器模块的存储容量为256kB�则利用上题中给出的RAM芯片�求出构成256kB存储模块各需多少块芯片�20位地址总线中有多少位参与片内寻址�多少位可用作片选控制信号�解�(1)1k×1256K�8�2048片�1K�1片内寻址�AA�共10位�片选控制信号�AA�共10位。091019(2)1k×4256K�8�512片�1K�4片内寻址�AA�共10位�片选控制信号�AA�共10位。091019(3)4k×8 256K�8�64片�4K�8片内寻址�AA�共12位�片选控制信号�AA�共8位。0111219(4)16k×4256K�8�32片�16K�4片内寻址�AA�共14位�片选控制信号�AA�共6位。01314196.一台8位微机系统的地址总线为16位�其存储器中RAM的容量为32kB�首地址为4000H�且地址是连接的。问可用的最高地址是多少�15解�32K=2=8000H�所以�最高地址为�4000H+8000H-1=BFFFH则�可用的最高地址为0BFFFH.7.某微机系统中内存的首地址为4000H�末地址为7FFFH�求其内存容量。14解�7FFFH-4000H+1=4000H=2=16KB内存容量为16KB。8.利用全地址译码将6264芯片接在8088的系统总线上�其所占地址范围为00000H~03FFFH�试画连接图。写入某数据并读出与之比较�若有错�则在DL中写入01H�若每个单元均对�则在DL写入EEH�试编写此检测程序。解�因为6264的片容量为8KB。RAM存储区域的总容量为03FFFH-00000H+1=4000H=16KB�故需要2片6264芯片。连接图如图6.1所示。 6264A0A12A0D0D0D7AD127MEMROEMEMWWE�5VCS2CS174LS138A13AY06264A14BY1A15CY2A0D0YA316YA12DA4717AG2AY518A19G2BY6MEMWGY17MEMROE�5VWECS2CS1图6.1与8088系统总线的连接图检测程序段�MOVAX,0000HMOVDS,AXMOVSI,0MOVCX,16*1024MOVAL,55HCMPL:MOV[SI],ALMOVBL,[SI]CMPBL,ALJNEERRORINCSILOOPCMPLMOVDL,0EEHJMPNEXTERROR:MOVDL,01HNEXT:„ 9.简述EPROM的编程过程�并说明EEPROM的编程过程。解�EPROM芯片的编程有两种方式�标准编程和快速编程。在标准编程方式下�每给出一个编程负脉冲就写入一个字节的数据。Vpp上加编程电压�地址线、数据线上给出要编程单元的地址及其数据�并使CE=0,OE=1。上述信号稳定后�在PGM端加上宽度为50ms±5ms的负脉冲�就可将数据逐一写入。写入一个单元后将OE变低�可以对刚写入的数据读出进行检验。快速编程使用100�s的编程脉冲依次写完所有要编程的单元�然后从头开始检验每个写入的字节。若写的不正确�则重写此单元。写完再检验�不正确可重写。EEPROM编程时不需要加高电压�也不需要专门的擦除过程。并口线EEPROM操作与SRAM相似�写入时间约5ms。串行EEPROM写操作按时序进行�分为字节写方式和页写方式。10�若要将4块6264芯片连接到8088最大方式系统A0000H~A7FFFH的地址空间中�现限定要采用74LS138作为地址译码器�试画出包括板内数据总线驱动的连接电路图。解�8088最大方式系统与存储器读写操作有关的信号线有�地址总线AA�数据总线�019DD�控制信号�MEMR,MEMW。07根据题目已知条件和74LS138译码器的功能�设计的板内数据总线驱动电路如图6.2�a�所示�板内存储器电路的连接电路图如图6.2�b�所示。74LS245ABD0~D700XD0~XD7~~AB77MEMRDIREMEMW74LS138的Y074LS138的Y174LS138的Y274LS138的Y3图6.2�a�板内数据总线驱动电路 图6.2�b�板内存储器电路的连接图11�若在某8088微型计算机系统中�要将一块2764芯片连接到E0000H~E7FFFH的空间中去�利用局部译码方式使它占有整个32kB的空间�试画出地址译码电路及2764芯片与总线的连接图。解�Intel2764的片容量为8KB�而题目给出的地址共32KB�说明有4个地址区重叠�即采用部分地址译码时�有2条高位地址线不参加译码�即A,A不参加译码�。1314地址译码电路及2764与总线的连接如图6.3所示。 2764A0~A12A0D0D0~D7~~AD172MEMR+5VOEVPPA15PGMCEA16A17A18A19图6.3地址译码电路及2764与总线的连接12�在8086CPU工作在最小方式组成的微机系统中�扩充设计16kB的SRAM电路�SRAM芯片选用Intel6264,内存地址范围为70000H~73FFFH�试画出此SRAM电路与8086系统总线的连接图。解�73FFFH-70000H+1=4000H=16KIntel6264的片容量为8KB�RAM存储区总容量为16KB�故需要2片6264.8086最小方式系统与存储器读写操作有关的信号线有�地址总线AA�数据总线�019DD�控制信号�M/IO,RD,WR,BHE。015此SRAM电路与8086系统总线的连接图如图6.4所示。 6264A0D0D~DA~A07113AD712RDOEWRWE+5VCS2A0CS16264A19A15GYA0D0D~DA2A081514G2BY1YMIO2ADG1271Y3YOEA418CYA517WEBY6A16AYCS27CSBHE1图6.4SRAM电路与8086系统总线的连接图213�EPROM28C16芯片各引脚的功能是什么�如果要将一片28C16与8088系统总线相连接�并能随时改写28C16中各单元的内容�试画出28C16和8088系统总线的连接图(地址空间为40000H~407FFH)。解�28C16的引脚功能��VCC�GND�电源和地�A~A�11位地址线�可寻址2KB地址空间100�D~D�8位数据线70�WE�写允许�低电平有效。�OE�输出允许�低电平有效。�CE�片选信号�低电平有效。根据所学知识�28C16与8088系统的连接图如图6.5所示。 D~D08A~A010AD00A19ADA1117ADA2216AAD1533A14AD44A13AD5A512ADA6611AA28C16D7187A8MEMRA9MEMWA10CSOEWE图6.528C16与8088系统的连接图 7章习题1.简述I/O接口的基本功能。答��1�地址选择�2�控制功能�3�状态指示�4�速度匹配�5�转换信息格式�6�电平转换�7�可编程性2.简述I/O接口与I/O端口的区别。答�I/O接口是指I/O设备与系统总线之间的连接部件。I/O端口是指I/O接口内部可由CPU进行读写操作的各种寄存器�根据存放信息的不同�这些寄存器分别称为数据端口、控制端口和状态端口。3.简述I/O端口的编址方式及优缺点。答�I/O端口编址的方式可以分为独立编址和统一编址两种方式。独立编址方式是指I/O端口与存储器有相互独立的地址空间。统一编址方式是指I/O端口与存储器共享一个地址空间�所有的存储单元只占用其中的一部分地址�而I/O端口则占用另外一部分地址。优缺点�独立编址方式的优点之一是存储器的容量可以达到与地址总线所决定的地址空间相同�优点之二是访问I/O端口时的地址位数可以较少�提高总线的利用率。但是缺点是必须设置专门的I/O指令�增加了指令系统和有关硬件的复杂性。与独立编址方式相比�统一编址方式的优点是无需专门的I/O指令�从而使编程较灵活�但是I/O端口占用了存储器的一部分地址空间�因而影响到系统中的存储器的容量�并且访问存储器和访问I/O端口必须使用相同位数的地址�使指令地址码加长�总线中传送信息量增加。4.简述程序查询、中断和DMA三种方式的优缺点。答�程序查询方式的优点在于可以防止数据的丢失�实现起来较为简单�缺点是它占用了微处理器的大量时间�实时性较差。中断方式具有较好的实时性�但在一定程度上增加成本和复杂性。DMA方式的突出优点是传送过程无须处理器的控制�数据也无须经过微处理器�而是直接在I/O设备与主存储器间进行�因此既节约了微处理器的时间�也使传送速率大大提高�缺点是输入/输出操作占用微处理器时间�而且很难达到较高的数据传输率。5.8086CPU有20条地址总线,可形成1MB的存储器地址空间,可寻址范围为00000H--FFFFFH;地址总线中的16条线可用于I/O寻址,形成64KB的输入输出地址空间,地址范围为0000H--FFFFH;PC机中用了10条地址线进行I/O操作,其地址空间为1KB,可寻址范围为000H—3FFH。6.对于微机而言�任何新增的外部设备�最终总是要通过I/O接口与主机相接。 7.在主机板外开发一些新的外设接口逻辑�这些接口逻辑的一侧应与I/O设备相接�另一侧与系统总线相接。8.需要靠在程序中排入I/O指令完成的数据输入输出方式有BC。�A�DMA�B�程序查询方式�C�中断方式9.8086CPU用IN指令从端口读入数据�用OUT指令向端口写入数据。10.在8088CPU组成的计算机系统中有一接口模块�片内占用16个端口地址300~30FH�设计产生片选信号的译码电路。解�由于片内有16个端口�非别占用300~30FH地址。因此�该接口模块的片选信号的译码电路设计时�A3~A0不参加译码。其译码电路如图7.1所示。A9A8IOR片选信号IOWA7A6A5A4图7.111.在IBMPC系统中�如果AEN信号未参加I/O端口地址译码�会出现什么问题�在没有DMA机构的其它微机系统中�是否存在同样的问题�答�在IBMPC系统中�如果AEN信号未参加I/O端口地址译码�则会出现DMA机构与I/O端口竞争总线的问题。在没有DMA机构的其他微机系统中�不会存在同样的问题。12.在8088CPU工作在最大方式组成的微机系统中�利用74LS244设计一个输入端口�分配给该端口的地址为04E5H�试画出连接图。解�连接图如图7.2所示。 图7.213.在上题的基础上�利用74LS374设计一个输出端口�分配给该端口的地址为E504H�试画出连接图。若上题中输入端口的bit3、bit4和bit7同时为1�将内存BUFFER开始的连续10个字节单元的数据由E504H端口输出�若不满足条件�则等待。试编写程序。解�连接图如图7.3所示。图7.3程序如下�MOVCX,10LEASI,BUFFERMOVDX,04E5HWAIT1�INAL,DXANDAL,98HCMPAL,98H JNZWAIT1MOVDX,0E504HL1�MOVAL,[SI]OUTDX,ALINCSILOOPL1HLT14�在8086最大系统中�分别利用2片74LS244和74LS273设计16位输入和输出接口�其起始端口地址为504H、506H�画出硬件连接图解�硬件连接图如图7.4所示。图7.4硬件连接图 9章习题1.下列地址哪些能够分配给8253/8254的计数器0�为什么��23H、54H、97H、51H、FCH、59H�解�因为已经约定采用A2,A1作为8253的内部地址线�而且计数器0的地址为00�所以在题中所给的地址中只有51H,59H的A2和A1同时为0�即�A2A1=00.2.如果计数器0设定为方式0�GATE0�1�CLK0�1MHz�时常数为N�1000�请画出OUT0的波形。如果计数器1设定为方式1�其它参数与计数器0相同�画出OUT1的波形。3.编程实现�将8253计数器0设置成方式4�并置时常数10000�然后处于等待状态�直到CE的内容≤1000后再向下执行。解�MOVDX,COUNTD;写入计数器0的方式控制字MOVAL,00111000BOUTDX,ALMOVDX,COUNTA;设置计数器0的常数MOVAX,10000OUTDX,ALXCHGAL,AHOUTDX,ALL1:MOVDX,COUNTD;写入计数器0的方式控制字 MOVAL,0HOUTDX,ALMOVDX,COUNTA�读入CEINAL,DXMOVAH,ALINAL,DXXCHGAL,AHCMPAX,1000�判别CE当前大小JAL14.利用8253可以实现确定时间的延迟�编程实现延时10秒的程序段�设可以使用的基准时钟为1MHz�。解�本题使用计数器0和计数器1�并且计数器0的输出OUT0作为计数器1的时钟输入CLK1.程序如下�MOVDX,COUNTD;写计数器0方式控制字MOVAL,00110100BOUTDX,ALMOVDX,COUNTAMOVAX,10000;写计数器0时常数�分频得到100Hz时钟频率OUTDX,ALXCHGAL,AHOUTDX,ALMOVDX,COUNTD�写计数器1方式控制字MOVAL,01110000BOUTDX,ALMOVDX�COUNTBMOVAX,999�分频得到0.1Hz时钟频率。�在方式0下�时常数为N时��OUT输出的低电平宽度为N+1).OUTDX,AL XCHGAL,AHOUTDX,ALL1:�延时MOVDX,COUNTD;当前CE的内容锁存到OLMOVAL,01000000BOUTDX,ALMOVDX,COUNTBINAL,DXMOVAH,ALINAL,DXXCHGAL,AHCMPAX,999JNAL1�延时结束�则继续执行�否则�跳到L1,继续延时….5.比较8254方式0与方式4、方式1与方式5的区别�方式0与方式4方式0OUT端计数过程中为低,计数值减为0时,输出变高方式4OUT端计数过程中为高�计数值减为0时输出宽度为1个CLK的负脉冲方式1与方式5方式1OUT端输出宽度为n个CLK的低电平�计数值减为0时�输出为高方式5OUT端计数过程中为高�计数值减为0时输出宽度为1个CLK的负脉冲6.在8088最小系统中�8253的端口地址为284H�287H。系统提供的时钟为1MHz�要求在OUT0输出周期为20微秒的方波�在OUT1输出周期为200微秒�其中每周期为负的时间是180微秒的信号。请编写8253的初始化程序。解�OUT0输出为20微妙方波�可用方式三直接产生�OUT1输出波形与书中例9.2类似�可用其中思想产生此信号。如果允许增加外部器件�也可在例9.1的基础上�将OUT端信号通过与非门取反�这样即可产生题目要求信号。本例利用例9.1思想解答 MOVDX,287H;写计数器0控制方式字MOVAL,00010110BOUTDX,ALMOVDX,284H�写计数器0时常数MOVAL,20OURDX,ALMOVDX,287�写计数器2控制方式字MOVAL,10010110BOUTDX,ALMOVDX,286H�写计数器2时常数MOVAL,200OUTDX,ALMOVDX,287HMOVAL,01010010B�写计数器1控制方式字OUTDX,ALMOVDX,285HMOVAL,9�写计数器1时常数OUTDX,AL 7.通过8253计数器0的方式0产生中断请求信号�现需要延迟产生中断的时刻�可采用�A�在OUT0变高之前重置初值�B�在OUT0变高之前在GATE0端加一负脉冲信号�C�降低加在CLK0端的信号频率�D�以上全是。解�DA:方式0下�在OUT0变高之前重置初值�将在下一个CLK的下降沿使时常数从CR读入CE并重新计数。B:在OUT0变高之前在GATE0端加一负脉冲信号可以延时一个时钟周期�达到延时的目的。C:降低加在CLK0端的信号频率�可以增大时钟周期�达到延长OUT0端低电平的时间。�注�A中�如果重置的初值为1�则不会达到延时的效果�8.已知8254计数器0的端口地址为40H�控制字寄存器的端口地址为43H�计数时钟频率为2MHz�利用这一通道设计当计数到0时发出中断请求信号�其程序段如下�则中断请求信号的周期是32.7675ms。MOVAL,00110010BOUT43H,ALMOVAL,0FFHOUT40H,ALOUT40H,AL9.若8254芯片可使用的8086端口地址为D0D0H�D0DFH�试画出系统设计连接图。设加到8254上的时钟信号为2MHz��1�利用计数器0�2分别产生下列三种信号�①周期为10us的对称方波②每1s产生一个负脉冲③10s后产生一个负脉冲每种情况下�说明8254如何连接并编写包括初始化在内的程序段。�2�希望利用8086通过一专用接口控制8253的GATE端�当CPU使GATE有效开始� 20us后在计数器0的OUT端产生一个正脉冲�试设计完成此要求的硬件和软件。解�(1)选用D0D0H~D0DFH中的偶地址DODO,DOD2,DOD4,DOD6为基本地址作为8254的端口地址�设8086工作在最小方式下。8254端口地址译码电路如下图��计数器0输入端加2MHz的时钟信号�GATE0加+5V电压�输出OUT0信号为周期为10µs的对称方波。初始化代码�MOVDX,0D0D6H;写计数器0工作方式MOVAL,00010110BOUTDX,ALMOVDX,0D0D0H�写计数器0时常数MOVAL,20OUTDX,AL�CLK0加2MHz的始终信号�GATE0,GATE1加+5V电压�OUT0输出加到CLK1做时钟信号�OUT1输出为每1s产生一个负脉冲。初始代码�MOVDX,0D0D6H�写计数器0的工作方式MOVAL,00010110B OUTDX,ALMOVDX,0D0D0H�写计数器0的时常数MOVAL,100OUTDX,ALMOVDX,0D0D6H�写计数器1的工作方式MOVAL,01110100BOUTDX,ALMOVDX,0D0D2H�写计数器1的时常数MOVAX,20000OUTDX,ALXCHGAL,AHOUTDX,AL�CLK0加2MHz的始终信号�GATE0,GATE1加+5V电压�OUT0输出加到CLK2做时钟信号�OUT2输出为10s后产生一个负脉冲。初始代码�MOVDX,0D0D6H�写计数器0的工作方式MOVAL,00110110BOUTDX,ALMOVDX,0D0D0H�写计数器0的时常数MOVAX,1000OUTDX,ALXCHGAL,AHOUTDX,ALMOVDX,0D0D6H�写计数器2的工作方式MOVAL,10111000BOUTDX,ALMOVDX,0D0D4H�写计数器2的时常数MOVAX,20000OUTDX,ALXCHGAL,AH OUTDX,AL1)选用地址D0D0,DOD2,DOD4,DOD6为8253的端口地址�D0D8为GATE端口地址�该端口采用74LS373�8253用方式4�在OUT输出端加非门实现脉冲功能。接口电路如图�初始代码为�MOVDX,0D0D8H;GATE初始化MOVAL,0OUTDX,ALMOVDX,0D0D6H;写计数器0工作方式MOVAL,00011000BOUTDX,ALMOVDX,0D0D0H;写计数器0时常数MOVAL,40OUTDX,ALMOVDX,0D0D8HMOVAL,1OUTDX,AL;使GATE变高有效 10.若加到8254上的时钟频率为0.5MHz�则一个计数器的最长定时时间是多少?若要求10分钟产生一次定时中断,试提出解决方案。解�一个计数器的最长定时时间应该是置入时常数0时�此时定时时间为�65536/0.5*10^6s=131ms采用方式0即�计数达到终值时中断来10分钟产生一次定时中断�此时时常数CR为�10*60*0.5*10^6=3*10^9.由于一个计数器最多分频65536�所以至少得使用2个计数器。我们采用计数器0和计数器1.计数器0的时常数CR0为60000�计数器1的时常数CR1为50000.连接方式为�把0.5MHz的时钟频率接到计数器0的CLK0�然后把计数器0的OUT0接到计数器1的CLK1。这样计数器1的OUT1端输出的就是10分钟产生一次的定时中断。11.织布机控制系统如图9.26所示�已知织布机每织1米发出一个正脉冲�每织100米要求接收到一脉冲�去触发剪裁设备把布剪开。�1�设8253的端口地址为80H�83H�编写对8253初始化程序。�2�假定系统提供的信号频率为1MHz�希望利用8253的其余通道产生0.1秒的周期信号�编写初始化程序。DDCLK0DD7~07~08088织RDOUT0RD布CPUWRWR机Intel系8253最小A1+5V统A1GATE0方式A0A0系统=1总线IO/MA„9„译码CS电路A2解��1�MOVDX,83HMOVAL,00010100B OUTDX,ALMOVDX,80HMOVAL,100OUTDX,AL�2�将计数器1的输出OUT1信号作为计数器2的时钟输入CLK2�计数器1的时钟输入为系统提供1MHZ的信号MOVDX,83HMOVAL,01110100BOUTDX,ALMOVDX,81HMOVAX,1000OUTDX,ALXCHGAL,AHMOVDX,ALMOVDX,83HMOVAL,10010110BOUTDX,ALMOVDX,82HMOVAL,100OUTDX,AL图9.26织布机控制系统12.在IBMPC系统中根据下列不同条件设计接口逻辑�利用8253完成对外部脉冲信号重复频率的测量。�1�被测脉冲信号的重复频率在10�1000Hz范围内。�2�被测脉冲信号的重复频率在0.5�1.5Hz范围内。�3�被测脉冲信号重复频率在10�100Hz范围内。�4�被测是间歇脉冲信号,每次有信号时有100个脉冲,重复频率为0.8�1.2MHz�间歇频率大约每秒15次,要求测有信号时的脉冲重复频率。解�用两个计数器�计数器0的CLK接待测信号�GATE接半周期为10s的高电平信号�OUT接8259�同时取反接计数器1的GATE端。计数器1的CLK接系统时钟�半周期为T0。在这样的逻辑电路下�计数器0的功能是记录待测信号的脉冲数N0�计数器1的功能是记录在相同时间里系统时钟信号的脉冲数N1。根据T=N1*T0/N0可计算出待测信号的周期。S�t�是待测信号�S’(t�为给定的周期大于10s的高电平信号。 8259CLKS�t�D0~D70IR0S’�t�GATE0OUT0RD1MHzCLK1WRIntelGATE18253A1OUT1A0CLK2CSGATE2OUT2端口声明�COUNTA为计数器0的地址�COUNTB为计数器2的地址�COUNTD为控制器地址�COUNT为373地址程序如下�MOVDX,COUNTD�计数器1初始化MOVAL,01110000BOUTDX,ALMOVDX,COUNTBOUTDX,ALMOVDX,COUNTBMOVAL,OOUTDX,ALMOVDX,COUNTD�计数器0初始化MOVAL,00010000BOUTDX,ALMOVDX,COUNTAMOVAL,0 OUTDX,ALOUTDX,ALSTI读两计数器的计数�并进行计算的中断服务子程序�PUSHAXPUSHBXPUSHCXPUSHDXMOVDX,COUNTDMOVAL,00000000BOUTDX,ALMOVDX,COUNTAINAL,DXXCHGAL,AHINAL,DXXCHGAL,AHNEGAXINCAXMOVBX,AXMOVDX,COUNTDMOVAL,00010000BOUTDX,ALMOVDX,COUNTBINAL,DXXCHGAL,AHINAL,DXXCHGAL,AHNEGAXINCAXMOVCX,T0 MULCXDIVBXMOVSFR,AXPOPDXPOPCXPOPBXPOPAXIRETSFR中保存结果即为待测信号的周期。对于�1�题�10*10不小于100�10*1000不大于65535�可以用计数法。同理�3�也可用此方法。对于�2�题�可用周期法。逻辑电路图如下�1MHzD0~D7CLK0S�t�GATE0OUT0RDWRCLK1IntelGATE182598253A1OUT1IR0A0CLK2CSGATE2OUT2程序如下�MOVDX,COUNTDMOVAL,00110100BOUTDX,ALMOVDX,COUNTA MOVAL,0OUTDX,ALOUTDX,ALSTIPUSHAXPUSHBXPUSHDXMOVDX,COUNTDMOVAL,00000000BOUTDX,ALMOVDX,COUNTAINAL,DXXCHGAL,AHINAL,DXXCHGAL,AHNEGAXINCAXMOVBX,AXMOVDX,000FHMOVAX,4240HDIVBXMOVSFR,AXPOPDXPOPBXPOPAXIRET(4)如图设计接口�计数器1用来记录在50个脉冲所用时间�50个信号脉冲最多用1/0.8*50(约为63us)由于计数器1用1MHzCLK�故其计数个数N即为Nus� 所以当N>63时�则有低电平间隔计入�须重新计数。当N>63时�则计算得待测频率。8259IR0CLKS�t�D0~D70GATE0OUT0RDD0D01MHzWRCLK1IntelGATE1D774LS373D78253A1OUT1GOEA0CLK2CSGATE2译码OUT2程序如下�MOVDX,COUNTDMOVAL,00HOUTDX,ALMOVDX,COUNTDMOVAL,00010000BOUTDX,ALMOVDX,COUNTAMOVAL,50OUTDX,ALMOVDX,COUNTDMOVAL,01110000BOUTDX,ALMOVCOUNTB MOVAL,0OUTDX,ALOUTDX,ALL2:MOVDX,COUNT�给GATE0和GATE1高电平�开始计数MOVAL,81HOUTDX,ALL1:NOPMOVDX,COUNTDMOVAL,00000000BOUTDX,ALMOVDX,COUNTAINAL,DXMOVDX,COUNTAINAL,DXANDAL,AL�判断是否计完50个脉冲�若未计完继续等待JNZL1MOVDX,COUNTMOVAL,00H�若计完则暂停计数OUTDX,ALMOVDX,COUNTD�读计数器1结果MOVAL,01000000BOUTDX,ALMOVDX,COUNTBINAL,DXXCHGAL,AHINAL,DXXCHGAL,AHNEGAXINCAXCMPAX,70H�当AL大于70�则有间歇计入�重新测试 JAL2MOVBL,ALMOVAL,50�计算频率DIVBLMOVFREC,AL10章习题1.试分析8255A方式0、方式1和方式2的主要区别�并分别说明它们适合于什么应用场合。答�方式0是基本的输入/输出�端口A、B、C都可以作为输入输出端口。适用于CPU与非智能I/O设备的数据传输�方式1是有联络信号的输入/输出�端口A、B都可以设定成该方式�此时三个端口的信号线分成了A、B两组�PC~PC用作A组的联络信号�PC~PC用作B组的7430联络信号。适用于高速CPU与低速I/O设备的数据传输�方式2是双向传输�只有A组端口可以设定成该方式�PC~PC用作输出的联67络信号�PC~PC用作输入的联络信号�PC用作中断请求信号。适用于双机之间453数据的并行传送。2.8255A的A组设置成方式1输入,与CPU之间采用中断方式联络,则产生中断请求信号INTRA的条件是STBA=1,IBFA=1,INTEA=1。3.如果8255A的端口地址为300H�303H�A组和B组均为方式0�端口A为输出�端口B为输入�PC3�PC0为输入�PC7�PC4为输出�写出8255A的初始化程序段�编程实现将从端口C低4位读入的值从高4位送出。解�MOVDX,303HMOVAL,10000011BOUTDX,ALMOVDX,302HINAL,DXMOVCL,4 SHLAL,CLOUTDX,AL4.在实际应用中经常需要检测设备的状态�并进行指示。在8086最小方式系统下�有一片8255A�其分配的端口地址为8F00H�8F07H中的奇地址�外部设备产生的状态有16个�K15�K0��要求采用4个发光二极管来指示开关量中“1”的个数。�1�画出8255A的连接图��2�编写程序段实现连续检测并显示。解��1�80868255D~DD8~D1507PA0RDRDPA.1...WRWR..APA716位开关量A12(K~K)150A1A0PB0M/IOPB.1...BHE..APB157A11VCCCSA10PCA39APC82A0PC1A14PCA013A12A7A6A5A4A3(2)MOVDX,8F07HMOVAL,10010010B;端口A、B方式0输入�端口C方式0输出OUTDX,ALNEXT: MOVDX,8F03H;从端口B读取高8位开关量INAL,DXXCHGAL,AHMOVDX,8F01H;从端口A读取低8位开关量INAL,DXMOVBX,AXXORAL,ALMOVCX,16CLCL2:SHLBX,1JNCL1INCALL1:LOOPL2MOVDX,8F05H;从端口C送出OUTDX,ALJMPNEXT;进行下一次检测5.利用IBMPC系统机的总线槽�开发由一片8255A构成的子系统�8255A端口地址为260H�263H�编程实现产生如图10.20所示的8个信号(各个信号的节拍不必严格相等)。Y0Y1„Y7图10.20要求产生的信号波形解�8355A与IBMPC机总线的连接框图如下� 可将8255A的端口A作为要产生的信号的输出端口�设定为方式0输出�端口B和端口C不做使用�均设定为方式0输出。程序段如下�MOVDX,263H;设定8255A的工作方式MOVAL,10000000BOUTDX,ALMOVDX,260H;产生指定信号XORAL,ALOUTDX,ALREP:MOVAL,80HMOVCX,7REP1:OUTDX,ALSARAL,1LOOPREP1MOVCX,8REP2:SHLAL,1OUTDX,ALLOOPREP2JMPREP6.在实际应用中�经常会遇到要求输入多个数据量�这时需要用到多路开关�如图10.21 表示八选一的逻辑框图及其真值表。现有8组16位开关量数据�无符号数��要求八选一s2s1s0y000x0x0通过一片8255A�端口地址为260H�263H�分x1y001x1x2010x2x3011x3时输入到CPU�8088最小方式系统�中�并找x4100x4x5s0101x5x6s1出它们中的最大值�并通过4个发光二极管指x7s2110x6111x7示其序号�灯亮表示“1”�。画出8255A的连图10.21八选一逻辑电路接图�并编程实现。解�由于开关量是16为数据�故可以将8255A的PA端与PB端设定为方式0�分别读取开关量的低八位和高八位�以PC低三位端口的控制八选一电路的输出依次从X0到X7�使用PC端口的高八位输出最大开关量的序号�该序号为1~8�,控制发光二极管的亮灭以码指示序号。连接图如下�程序段如下�MOVDX,263HMOVAL,10011010B;设定工作方式�PA,PB均工作于方式0�PA、PB为输入�PC为输出OUTDX,ALMOVCX,8XORBX,BXMOVSI,0;SI表示输入开关量的序号ST1: MOVDX,262HOUTDX,SIMOVDX,260H;将开关量数据的低八位写入ALINAL,DXMOVDX,261H;将开关量数据的高八位写入AHINAH,DXCMPBX,AXJANEXTMOVBX,AX;将当前最大值保存在BX中INCSIPUSHSI;将当前最大值的序号压栈NEXT:INCSILOOPST1POPSI;最大值的序号出栈XORAX,AXMOVAX,SIMOVCL,4ROLAL,CL;将最大值的序号�4位�移至AL的高四位MOVDX,262HOUTDX,AL;PC的高四位输出最大值序号 '