汇编语言程序设计第四版第4章课后答案.docx

上传人:b****0 文档编号:18336556 上传时间:2023-08-15 格式:DOCX 页数:31 大小:23.25KB
下载 相关 举报
汇编语言程序设计第四版第4章课后答案.docx_第1页
第1页 / 共31页
汇编语言程序设计第四版第4章课后答案.docx_第2页
第2页 / 共31页
汇编语言程序设计第四版第4章课后答案.docx_第3页
第3页 / 共31页
汇编语言程序设计第四版第4章课后答案.docx_第4页
第4页 / 共31页
汇编语言程序设计第四版第4章课后答案.docx_第5页
第5页 / 共31页
汇编语言程序设计第四版第4章课后答案.docx_第6页
第6页 / 共31页
汇编语言程序设计第四版第4章课后答案.docx_第7页
第7页 / 共31页
汇编语言程序设计第四版第4章课后答案.docx_第8页
第8页 / 共31页
汇编语言程序设计第四版第4章课后答案.docx_第9页
第9页 / 共31页
汇编语言程序设计第四版第4章课后答案.docx_第10页
第10页 / 共31页
汇编语言程序设计第四版第4章课后答案.docx_第11页
第11页 / 共31页
汇编语言程序设计第四版第4章课后答案.docx_第12页
第12页 / 共31页
汇编语言程序设计第四版第4章课后答案.docx_第13页
第13页 / 共31页
汇编语言程序设计第四版第4章课后答案.docx_第14页
第14页 / 共31页
汇编语言程序设计第四版第4章课后答案.docx_第15页
第15页 / 共31页
汇编语言程序设计第四版第4章课后答案.docx_第16页
第16页 / 共31页
汇编语言程序设计第四版第4章课后答案.docx_第17页
第17页 / 共31页
汇编语言程序设计第四版第4章课后答案.docx_第18页
第18页 / 共31页
汇编语言程序设计第四版第4章课后答案.docx_第19页
第19页 / 共31页
汇编语言程序设计第四版第4章课后答案.docx_第20页
第20页 / 共31页
亲,该文档总共31页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

汇编语言程序设计第四版第4章课后答案.docx

《汇编语言程序设计第四版第4章课后答案.docx》由会员分享,可在线阅读,更多相关《汇编语言程序设计第四版第4章课后答案.docx(31页珍藏版)》请在冰点文库上搜索。

汇编语言程序设计第四版第4章课后答案.docx

汇编语言程序设计第四版第4章课后答案

汇编语言程序设计第四版

【课后习题答案】--囮裑為檤

第4章基本汇编语言程序设计

 

〔习题4.1〕例题4.2如果要求算术右移8位,如何修改程序。

〔解答〕

思路:

首先由最高位字节向次低位字节传送……次低位字节向最低位字节传送(共7次);再判最高位字节符号位,如为0,送00h到最高位字节;如为1,送ffh到最高位字节。

传送可参考例题4.2,不过应从第一号字节送第零号字节,……最高位字节向次低位字节传送;也可以用循环来完成:

          .modelsmall

          .stack256

          .data

 qvar    dq 54321h

          .code

          .startup

          movcx,7

          movsi,1

 again:

  moval,byteptrqvar[si]

         movbyteptrqvar[si-1],al

          incsi

          loopagain

          testal,80h

          jzezz

          movbl,0ffh

          jmp done

   ezz:

  movbl,0

  done:

  movbyteptrqvar[7],bl

          .exit0

          end

〔习题4.2〕例题4.2如果要求算术左移7位,如何用移位指令实现。

〔解答〕

思路:

可设计外循环体为8个字节左移一次,方法是:

最低位字节算术左移一次,      次低位字节至最高位字节依次带CF位循环左移一次(内循环共8次),外循环体控制执行7次即可。

       .modelsmall

       .stack256

       .data

qvar    dq 54321h

       .code

       .startup

       movdx,7                           ;外循环次数

       movax,byteptrqvar[0]      ;最低位字节送ax

lpp:

    shlax,1                             ;最低位字节左移一次,其d7移入CF位

       mov si,1

       movcx,7                              ;内循环次数

again:

  rclbyteptrqvar[si],1          ;高位字节依次左移P50

       inc si

       loop again

       decdx

       jnz lpp

       .exit0

       .end

〔习题4.3〕将AX寄存器中的16位数连续4位分成一组,共4组,然后把这4组数分别放在AL、BL、CL和DL寄存器中。

〔解答〕

思路:

设这四组从低位到高位分别放在AL、BL、CL和DL寄存器中。

仅列出代码段:

              movbl,al         ;将al中的两组分开

              andal,0fh        ;屏蔽高四位后送al

              movcl,4          ;原al中的数据逻辑右移4次送bl

              shrbl,cl

              movdl,ah         ;将ah中的两组分开

              anddl,0f0h       ;屏蔽低高四位后送dl

              movcl,4          ;原ah中的数据逻辑右移4次送dl

              shrdl,cl

              movcl,ah         ;屏蔽高四位后送cl

              andcl,0fh

〔习题4.4〕编写一个程序,把从键盘输入的一个小写字母用大写字母显示出来。

〔解答〕

getkey:

    movah,1           ;从键盘输入,出口:

al存键值

          int21h

          cmp al,'a'         ;判键值是小写字母?

            jb getkay

            cmp al,'z'

            ja getkay

            subal,20h          ;是小写字母转换为大写字母

            movdl,al

            movah,02h         ;显示

            int21h

〔习题4.5〕已知用于LED数码管显示的代码表为:

LEDtable  DB0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h

               DB80h,90h,88h,83h,0c6h,0c1h,86h,8eh

它依次表示0~9、A~F这16个数码的显示代码。

现编写一个程序实现将lednum中的一个数字(0~9、A~F)转换成对应的LED显示代码。

〔解答〕

          .modelsmall

          .stack256

          .data

LEDtable  DB0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h

            DB80h,90h,88h,83h,0c6h,0clh、86h,8eh

 lednum    DB?

 

          .code

          .startup

          movbx,offsetLEDtable 

          moval,lednum

          xlat                     ;al中存有对应的LED显示代码

          .exit0

          end

〔习题4.6〕编制一个程序,把变量bufX和bufY中较大者存入bufZ;若两者相等,则把其中之一存入bufZ中。

假设变量存放的是8位无符号数。

〔解答〕

          .modelsmall

          .stack256

          .data

bufx      db?

bufY      db?

bufz      db?

          .code

          .startup

          moval,bufX

          movbl,bufY

          cmpal,bl

          janext

          movbufZ,bl

          jmpdone

     next:

movbufZ,al

done:

    .exit0

          end

〔习题4.7〕设变量bufX为有符号16位数,请将它的符号状态保存在signX,即:

如果X大于等于0,保存0;如果X小于0,保存-1(ffh)。

编写该程序。

〔解答〕

          .modelsmall

          .stack

          .data

bufX      dw-7

signX     db?

          .code

          .startup

          cmpbufX,0           ;testbufX,80h

          jlnext              ;jnznext

          movsignX,0

          jmpdone

next:

     movsignX,-1

done:

     .exit0

          end

〔习题4.8〕bufX、bufY和bufZ是3个有符号16进制数,编写一个比较相等关系的程序:

(1)如果这3个数都不相等,则显示0;

(2)如果这3个数中有两个数相等,则显示1;

(3)如果这3个数都相等,则显示2。

〔解答〕

 .modelsmall

          .stack256

          .data

bufx      dw?

bufY      dw?

 

bufz      dw?

 

          .code

          .startup

          movax, bufX 

          movbx, bufY

          movcx, bufZ

          movdl,'0'

          cmpax,bx

          jnznext1

          incdl

next1:

    cmpax,cx

          jnznext2

          incdl

next2:

    cmpbx,cx

          jnznext3

          incdl

next3:

    cmpdl,’3’

          jbnext4

          movdl,’2’

next4:

    movah,02h       ;显示

          int21h

          .exit0

          end

 

〔习题4.9〕例题4.8内外循环次数共是多少?

如果要求按从大到小排序,程序如何修改?

〔解答〕

外循环次数是:

count-1次(19次)

内循环次数是:

(count-1)!

次 (19!

次)

内外循环次数共是count-1+(count-1)!

次,即19+19!

〔习题4.10〕串操作指令常要利用循环结构,现在不用串操作指令实现字符串string1内容传送到字符串string2,字符长度为count。

〔解答〕

 .model small

            .stack256

            .data

  string1  db 'goodmorning!

'

  len    = $-string1

  string2  db lendup(?

            .code

            .startup

            movcx,len             ;字符数

            movsi,offsetstring1  ;源指针

            movdi,offsetstring2  ;目标指针

again:

     moval,[si]              ;送一个字符

            mov[di],al

            incsi                     ;修改指针

            incdi                     ;修改指针

           loopagain                 ;cx=cx-1,cx=0时退出循环

            .exit0

            end          

〔习题4.11〕不用串操作指令求主存0040h:

0开始的一个64KB物理段中共有多少个空格?

〔解答〕

这里仅列出主程序段:

            movax,0040h     ;送段地址

            movds,ax   

            xorsi,si       ;偏移量地址

            xorcx,cx        ;计数(循环次数)

            xordx,dx       ;空格计数器清零

again:

     cmp[si],20h   ;与空格的ASCII码比较

            jne  next       ;不是空格,转

            incdx           ;是空格,空格数加1

next:

     incsi           ;修改地址指针

          loopagain      ;cx=cx-1,如cx=0退出循环

            .exit0

            end

〔习题4.12〕编程实现把键入的一个字符,用二进制形式(0/1)显示出它的ASCII代码值。

〔解答〕

.modelsmall

            .stack256

            .data

    stri1  db'pleaseinput',0dh,0ah,'$'  

            .code

            .startup

            mov dx,offsetstri1  

            movah,09h

            int21h

            movah,01h           

            int21h               

            movcx,8             

     again:

  xordl,dl

            shlal,1           

                 adcdl,'0' 

            movah,02h

            int21h

          loopagain  

         .exit0

           end

〔习题4.13〕编写程序,要求从键盘接收一个数bellN(0~9),然后响铃bellN次。

〔解答〕

.modelsmall

            .stack

            .data

    stri1  db'pleaseinputnumber:

1--9',0dh,0ah,'$'

            .code

            .startup

  again:

   mov dx,offsetstri1  ;显示stri1,提示输入

            movah,09h

            int21h

            movah,01h            ;调用输入一个字符

            int 21h               ;输入一个字符存在al中

            cmpal,'1'           ;判该字符,如不在‘1’--‘9’

            jb again              ;重新输入

            cmpal,'9'

            ja again

            andal,0fh            ;在‘1’--‘9’,屏蔽高4位

            movcl,al            ;振铃次数送cx

           xorch,ch

  abc:

     movdl,07h           ;调用一次振铃

            movah,02h

            int21h

           loopabc

            .exit0

            end

〔习题4.14〕编写程序,将一个包含有20个有符号数据的数组arrayM分成两个数组:

正数数组arrayP和负数数组arrayN,并分别把这两个数组中的数据个数显示出来。

〔解答〕

           .modelsmall

          includeio.inc

         .stack

         .data

 arrayM  db 1,2,3,4,5,6,0,-3,-5,-6,0,7,6,90,-18,-23,34,7,9,8  ;源数组

 arrayP  db 20dup(?

)         ;正数数组

 arrayN  db 20dup(?

)         ;负数数组

 dispP   db'PlusNumber:

','$'

dispN   db0dh,0ah,'NegsNumber:

','$'

         .code

         .startup

         movcx,20             ;源数组元素数

         xorbx,bx             ;设bh为正数个数,bl为负数个数,均清零

         xorsi,si             ;源数组地址位移量

      again:

                   ;循环20次

         movax,arrayM[si]     ;取一个元素

         cmpax,0               ;判正数

        jlNeg

             incbh             ;是,正数个数加1

        jmpnext

 Neg:

        incbl            ;否,负数个数加1

 next:

       incsi            ;修改位移量

        loopagain              ;循环次数减1

         movah,09h            ;调用显示字符串功能

         movdx,offsetdispP   ;显示个数

         int 21h

          moval,bh

          calldispuib         ;调用I/O子程序库中的子程序

         movah,09h            ;调用显示字符串功能

         movdx,offsetdispN   ;显示个数

         int 21h

          moval,bl

          calldispuib         ;调用I/O子程序库中的子程序

        .exit0

         end

〔习题4.15〕编写计算100个正整数之和的程序。

如果和不超过16位字的范围(65535),则保存其和到wordsum,如超过则显示‘overflow’。

〔解答〕

          .modelsmall

          .stack

          .data

num       equ100

wlist     dwnumdup(?

wordsum   dw?

error     db'overflow.$'

          .code

          .startup

          movbx,offsetwlist

          movcx,num

          xorax,ax

again:

    addax,[bx]

          jcnext

          incbx

          incbx

          loopagain

          mov[bx],ax

          jmpdone

next:

     movdx,offseterror

          movah,9

          int21h

done:

     .exit0

          end

〔习题4.16〕编程判断主存0070h:

0开始的1KB中有无字符串‘DEBUG’。

这是一个字符串包含的问题,可以采用逐个向后比较的简单算法。

〔解答〕

          .modelsmall

              .stack

              .data

 disp1    db'Thereis DEBUGintheaera!

',0dh,0ah,‘$'

 disp2    db'Thereisno DEBUGintheaera!

',0dh,0ah,‘$'

             .code

             .startup 

             movax,0070h      ;送段地址

             movds,ax

             xorsi,si         ;地址指针清零

          movcx,1024

                cmp[si],'D'    ;与‘D'比较

                jnenext         ;不是,转

                incsi           ;是,地址增1

                cmp[si],'E'    ;同上

                jnenext

                incsi

                cmp[si],'B'

                jnenext

                incsi

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

当前位置:首页 > 总结汇报

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2