欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    新版汇编语言程序设计课后答案.doc

    • 资源ID:17618539       资源大小:185.50KB        全文页数:18页
    • 资源格式: DOC        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    新版汇编语言程序设计课后答案.doc

    【精品文档】如有侵权,请联系网站删除,仅供学习与交流新版汇编语言程序设计课后答案.精品文档.                                                                     第2章(03)2.12;指令                 注释              执行结果    CF OF SF ZF PF mov si,ax            si=ax              si=0008h      -   -   -   -   - shl si,1             si=2*ax            si=0010h      0   0   0   0   0 add si,ax            si=3*ax            si=0018h      0   0   0   0   1 mov dx,bx            dx=bx              dx=0010h     -   -   -   -   - mov cl,03h           cl=03h                          -   -   -   -   - shl dx,cl            dx=8*bx            dx=0080h      0   u   0   0   0 sub dx,bx            dx=7*bx            dx=0070h      0   0   0   0   0 add dx,si            dx=7*bx+3*ax       dx=0088h      0   0   0   0   1 注意: 1. 左移N次相当于乘于2的N次方,右左移N次相当于除乘于2的N次方。 2. 移位指令根据是否移入“1”到CF,设置CF,根据移位后的结果影响SF,ZF,PF。根据最高符号位是否改变设置OF,如改变 OF=1. 3. u 表示无定义, - 表示无影响。2.13; (1) ;不考虑进位mov bl,al mov cl,3 shl al,cl add al,bl     ;shl bl,1 add al,bl ;考虑进位xor ah,ah mov bx,ax mov cl,3 shl ax,cl add ax,bx     ;shl bx,1 add ax,bx (2) 数字09的ASCII码是:30h39h 非压缩BCD码的09是:00h09h 方法一: and al,0fh     ;实现ASCII到非压缩BCD码的转换 or al,30h     ;实现非压缩BCD码到ASCII的转换 方法二: xor al,30h    ;求反D5D4位,其他不变 ;即高4位为3,则变为0;高4位为0,则变为3 mov cl,4 again: shr dx,1     ;实现逻辑右移 ;采用“sar dx,1”,则实现算术右移      rcr ax,1      dec cl      jnz again 2.14; (1)用sar编写      mov al,0f7h      ;-9送al      sar al,1         ;结果:al=0fbh  即-5 (2)用idiv编写       mov al,0f7h    ;-9送al       cbw             ;字节符号扩展位字       mov bl,2        ;注意除数不可为立即数       idiv bl        ;结果:商为al=fch   (-4)                     ; 余数为ah=ffh (-1)      结论:符号数的除法 用idiv 准确 2.19;短转移:指段内128127之间的转移,位移量用一个字节表示 近转移:指段内±32K之间的转移,位移量用一个字表示 远转移:指段间1MB范围的转移 段内转移:指在同一个代码段内的转移,可以是短转移或者近转移 段间转移:指转移到另外一个代码段,就是远转移 8086/8088CPU的JMP、CALL和INT n指令可以实现段间转移                                                第2章(04)2.20; 8086的条件转移的转移范围:在当前指令地址的 +127- -128之内。 如条件转移的转移范围超出此范围,可在此范围内安排一条无条件转移,再转移到范围外的目标地址。2.21; (1)JMP Bx        ;转移的有效地址EA=BX=1256h (2)JMP tABLEBx ;转移的有效地址EA=ds:20a1h+1256h=232f7=3280h (3)JMP Bxsi  ;转移的有效地址EA=ds:1256h+528fh=264e5h=2450h2.22; (1) xor ax,1e1eh         je equal     ;AX1e1eh(异或后为0) (2)test al,10000001b        jnz there     ;AL的D0或D7至少有一位为1 (3) cmp cx,64h         jb there     ;CX(无符号数) 64h 2.23;mov cx,0      不循环,因为一进入循环就判 cx=0? 如cx=0 就退出循环 delay:loop delay 2.24; (1)若DX > DI,转到above执行         cmp dx,di         ja above    ;jnbe above (2)若AX > SI,转到greater执行         cmp ax,si         jg greater    ;jnle greater (3)若CX = 0,转到zero执行         cmp cx,0       jcxz zero         jz zero     (4)若AXSI产生溢出,转到overflow执行;         cmp ax,di         jo overflow (5)若SIAX,转到less_eq执行;         cmp si,ax             cmp ax,si         jle less_eq             jge less_eq (6)若DIDX,转到below_eq执行。         cmp di,dx             cmp dx,di         jbe below_eq         jae below_eq2.25; 答:将首地址为array得20个字的数组求和,并将结果存入 total 单元中。                                                 第2章(05)2.26; (1)       mov si,0       mov dl,stringsi   ;第1个字符送dl寄存器       mov si,5       mov dh,stringsi   ;第6个字符送dh寄存器 (2)       xor si,si                    ;si清零      mov al,buffersi   ;第一字节      inc si      mov ah,buffersi   ;第二字节      mov cl,4      shl ah,cl                  ;BCD码移到高半字节      or al,ah                     ;组合成压缩BCD码      mov dl,al                   ;存入dl寄.      inc si      mov al,buffersi   ;第三字节      inc si      mov ah,buffersi   ;第四字节      mov cl,4      shl ah,cl           ;BCD码移到高半字节      or al,ah            ;组合成压缩BCD码      mov dh,al           ;存入dh寄. (3)       test dx,0f000h       jz zero       mov ax,-1       jmp done       zero:    mov ax,0       done:    ret (4)       lea bx,buffer1        lea dx,buffer2       mov cx,8               ;8个字节       xor si,si              ;si=0        clc                    ;CF=0 (5)       mov ax,0b800h       mov ds,ax       ;段地址       xor si,si       ;地址偏移量si=0       xor dx,dx       ;和的高字dx=0       mov cx,99       ;加的次数       mov ax,si   ;第一个数 again:    inc si           ;指向下一个字单元       inc si       add ax,si     ;加下一个数       jnc    noc         ;无进位转       inc dx           ;有进位dx=dx+1 noc:    dec cx           ;次数-1       jnz cx,again    ;非0继续加        ret (6)       mov si,offset string       mov cx,8000h                ;32k=215=8000h again: cmp si,$       jnz next       mov si,20h               ;if si=$ si<-    next:    inc si       loop again (7)       xor si,si               ;si<-0       mov cx,100             ;循环次数 again: dec arraysi       dec cx       jnz    again (8)        xor si,si          ;si<-0        coun:    cmp stringsi,$        je    done        inc si        jmp coun        done: ret                                 2.27; (1)使CF0 :        clc   ;       and ax,ax   ;or ax,ax (2)使AX0 :       xor ax,ax  ;     and ax,0  ;mov ax,0 (3)同时使AX0和CF0: and ax,0 ;xor ax,ax ;sub ax,ax2.29; 压缩BCD码加法:AXAXBX 出口参数:AXBCD码和2.24; okmsg      db OK, $errmsg      db Error ! Overflow !, $                 mov ax,X       sub ax,Y       jo overflow       mov dx,offset okmsg       jmp next overflow: mov dx,errmsg next:       mov ah,9       int 21h 错误:       mov ax,X       sub ax,Y       jo overflow       mov dx,offset okmsg               okmsg      db OK, $           mov dx,errmsg      ;错误1:数据定义在代码中       mov ah,9       int 21h overflow:    errmsg db Error ! Overflow !, $           mov dx,errmsg            ; 错误2:缺少JMP指令       mov ah,9       int 21h 2.37; ;xt237.asm.model small.stack.dataarray db 255db 0array1 db 255 dup('$')array2 db 0dh,0ah,'$' .code.startupmov ah,0ah    ; 键盘输入字符串mov dx,offset arrayint 21hmov dx,offset array2 ; 回车换行mov ah,09hint 21hmov bx,offset array1again: mov al,bxcmp al,'$'jz donecmp al,'a'    ; 小于a和大于z的字符不是小写字母jb nextcmp al,'z'ja nextsub al,20h    ; 在a和z之间的字符才是小写字母,转换为大写mov bx,al    ; 保存到原位置next: inc bxjmp againdone: mov dx,offset array1mov ah,09hint 21h.exit 0end                                                                第三章(01) 3.1; 硬指令:每个硬指令就是一个处理器指令,在CPU执行时产生相应功能; 伪指令:伪指令并不产生处理器指令,它通常用于辅助汇编程序对源程序进行汇编。3.2;3.5;   编辑     文本编辑程序      汇编语言源程序.asm   汇编     汇编程序          目标模块文件.obj   连接     连接程序          可执行文件.exe或.com   调试     调试程序          应用程序3.6; ;xt236.asm  简化段定义格式          .model small ;定义程序的存储模式(小模式)          .stack      ;定义堆栈段(默认1024个字节)          .data       ;定义数据段 str1    ab Input Number:09 : ,0dh,0ah,$   str2    ab Error!,0dh,0ah,$           .cade       ;定义代码段           .startup    ;说明程序的起始点,建立ds,ss的内容。            mov ah,09h        ;显示str1字符串           mov dx,offset str1           int 21h gtekey: mov ah,1           ;调用BIOS判断按键功能           int 16h           jz    getkey          ;如 zf = 0,无键按下,等待           cmp    al,0       ;有键按下,键值与0比较           jb error          ;如 < 0,出错处理           cmp al, 9       ;有键按下,键值与 9比较           ja error          ;如 9,出错处理           mov ah,02h      ;调用DOS显示字符功能,显示该数字           mov dl,al           int 21h          .exit 0              ;终止程序执行,返回DOS error: mov ah,09h    ; 出错,调用DOS 功能显示str2字符串           mov dx,offset str2           int 21h           jmp getkey        ;等待按键           end        ; 汇编结束3.7; ;xt307.asmstack    segment           dw 512 dup(?) stack    endsdata     segmentarray db 255db 0array1 db 255 dup('$')array2 db 0dh,0ah,'$' data endscode segment 'code'assume cs:code, ds:data, ss:stackstart: mov ax,data          mov ds,ax mov ah,0ah    ; 键盘输入字符串mov dx,offset arrayint 21hmov dx,offset array2 ; 回车换行mov ah,09hint 21hmov bx,offset array1again: mov al,bxcmp al,'$'jz donecmp al,'a'    ; 小于a和大于z的字符不是小写字母jb nextcmp al,'z'ja nextsub al,20h    ; 在a和z之间的字符才是小写字母,转换为大写mov bx,al    ; 保存到原位置next: inc bxjmp againdone: mov dx,offset array1mov ah,09hint 21hmov ax,4c00hint 21hcode endsend start3.9; (1) mov byte ptr bx,1000  ;1000超出了一个字节范围 (2) mov bx,offset mywordsi;寄存器的值只有程序执行时才能确定,       ;而offset是汇编过程计算偏移地址,故无法确定       ;可以改为lea bx,mywordsi (3) cmp mybyte1,mybyte2    ;两个都是存储单元,指令不允许 (4) mov al,mybyte1+mybyte2 ;变量值只有执行时才确定,汇编过程不能计算 (5) sub al,myword          ;字节量AL与字量myword,类型不匹配 (6) jnz myword             ;Jcc指令只有相对寻址方式,不支持间接寻址方式3.10; 前者为“与”操作硬指令助记符,可汇编成机器代码。 后者为逻辑运算符,在汇编时进行“与”运算,产生具体数值。3.11; 注:对于逻辑运算,有关操作数可化为二进制数。 (1)mov al,23h AND 45h OR 67h          ; 67h (2)mov ax,1234h/16 + 1Oh              ; 133h (3)mov ax,NOT(65535 XOR 1234h)        ; 1234h (4)mov al, LOW 1234h OR HIGH 5678h     ; 76h (5)mov ax,23h SHL 4                   ; 0234h (6)mov ax, 1234h SHR 6                 ; 0048h (7)mov al,a AND (NOT(a-A) ; 41h (8)mov al,H OR 00100000b           ; 68h (9)mov ax,(76543 LT 32768) XOR 7654h   ; 7654h3.12; 假设block开始的数据块有32个字节数据:16个正数+100 (64h),16个负数 -48 (0doh) 分别连续分布: block      db 16 dup(100),16 dup(-48) ;也可以是任意字节数据,随意分布。 dplus      db 32 dup(?)                    ;为正数预留存储空间 dminus     db 32 dup(?)                    ;为负数预留存储空间 count      equ 32                           ;字节数                                            第三章(02) 3.15; mydataseg      segment my1b      db Personal Computer my2b      db 20 my3b      db 14h      ;20h my4b      db 00010100b my5w      dw 20 dup(?) my6c      equ 100      ;my6c = 100 my7c      equ <Personal Computer> mydataseg      ends3.18; 段地址:表示标号所在代码段的段地址; 偏移地址:表示标号所在代码段的段内偏移地址; 类型:引用该标号时,表示它所在同一个段near类型,还是另外一个段far类型。3.19; mydata    segment        ORG lO0h VARW DW l234H,5678H VARB DB 3,4        AGLIN 4 VARD DD 12345678H         EVEN BUFF DB 10 DUP(?) MESS DB    HELLO     MOV AX, OFFSET VARB + OFFSET MESS  ;AX = 4+16H = 1AH     MOV AX, TYFE TYPE BUFF+TYPE MESS+TYPE VARD;AX = 1+1+4 = 06H     MOV AX,SIZE VARW+SIZE BUFF+SIZE MESS;AX = 4+10+5 = 19 = 13H     MOV AX,LENGTH VARW + LENGTH VARD    ;AX = 2+1 = 03H     MOV AX,LENGTH BUFF + SIZE VARW      ;AX = 10+4 =14 = 0EH     MOV AX,TYPE BIGIN                   ;AX = FF02H (近)     MOV AX,OFFSET BEGIN                 ;AX = 1BH  3.22; 段定义伪指令  段名    定位    组合    类别    组名 .CODE         _TEXT      WORD    PUBLIC    CODE     .DATA         _DATA      WORD    PUBLIC    DATA    DGROUP .STACK        STACK    PARA    STACK     STACK DGROUP 3.25; .model small      .stack      .data num    equ 5 datalist dw -1,0,2,5,4,?      .code      .startup       mov bx,offset datalist       mov cx,num       xor ax,ax again: add ax,bx       inc bx       inc bx       loop again       mov bx,ax      .exit 0       end3.26; stack      segment para stack     dw    512 dup(?) stack      ends data      segment dword array      db 100 dup(?) data      ends code      segment code assume cs:code,ds:data,es:data,ss:stack org 100h start: mov ax,data       mov ds,ax       mov es,ax           mov di,offset array       mov al,64h       mov cx,100       cld       rep stosb       mov ax,4c00h       int 21h code      ends       end start3.27;解答;xt327.asm          .model    small      .stack    256         ;定义堆栈段大小为256个字节      .data anum    dd    11223344h       ;定义两个双字的数(随意) bnum    dd    77553311h sum     dd    ?               ;定义结果,执行后为:88776655h      .code      .startup       xor    si, si         ;相对于变量的位移量清零       mov    cx, 2          ;分高低字分别相加,共两次       clc                 ;清零cf again:mov ax, anumsi    ;取第一个数的一个字(先低字后高字)       adc ax, bnumsi    ;取第二个数的一个字(先低字后高字)       mov sumsi, ax     ;存和的一个字(先低字后高字)       inc si              ;修改位移量指向下一个字(加2)       inc si       loop    again         ;cx=cx-1 ,if cx<>0 ,jump again      .exit 0       end 3.28;    .startup        xor     si, si             ;位移量清零        mov al, bdatasi        ;取第一个数        mov cx, num-1            ;累加次数 again: inc    si                  ;指向下一个数        adc al,    bdatasi       ;累加        loop    again              ;如未完,继续累加        mov    sum, al             ;完了,存结果       .exit 0        end第四章4.3; 思路:设这四组从低位到高位分别放在AL、BL、CL和DL寄存器中。这里仅列出代码段:          mov bl, al        ;将al中的两组分开          and al, 0fh       ;屏蔽高四位后送al          mov cl, 4         ;原al中的数据逻辑右移4次送bl          shr bl, cl          mov dl, ah        ;将ah中的两组分开          and dl, 0f0h      ;屏蔽低高四位后送dl          mov cl, 4         ;原ah中的数据逻辑右移4次送dl          shr dl, cl          mov cl, ah        ;屏蔽高四位后送cl          and cl, 0fh4.4; getkey: mov ah, 1        ;从键盘输入,出口:al存键值           int 21h           cmp    al, a     ;判键值是小写字母?           jb    getkay           cmp    al, z           ja    getkay           sub al,20h        ;是小写字母转换为大写字母           mov ah, 09h       ;显示           int 21h4.8; (1) 将jmp tablebx指令改为:mov dx, tablebx  (2) 去掉源程序中:.exit 0-end之间的语句4.17; .model small       .stack 256       .data stri1 db please input number:1-9,odh,oah,$        .code       .startup again: mov    dx,offset stri1   ;显示stri1,提示输入        mov ah,09h        int 21h        mov ah,01h             ;调用输入一个字符        int    21h               ;输入一个字符存在al中        cmp al, 1            ;判该字符,如不在1-9        jb    again              ;重新输入        cmp al, 9        ja    again        and al,0fh             ;在1-9,屏蔽高4位        mov cx, al             ;振铃次数送cx       .repeat        mov dl, 07h            ;调用一次振铃        mov ah, 02h        int 21h        mov dx ,0ffffh         ;延时 abc: dec dx        jnz abc       .untilcxz              ;cx=cx-1,cx=0 退出       .exit 0        end4.22;crazy     PROC    ;crazy      PROC           push ax    ;               xor ax,ax    ;      xor ax,ax           xor dx,dx    ;      xor dx,dx again:    add ax,bx    ;again:      add ax,bx           adc dx,0    ;      adc dx,0           inc bx    ;      inc bx           inc bx    ;      inc bx           loop again    ;      loop again           ret    ;      ret           ENDP crazy    ; crazy      ENDP425;子程序中又调用子程序就形成子程序嵌套。 子程序中直接或间接调用该子程序本身就形成子程序递归。426;      .model small        .stack 256         .data stdng    db HeLLO eveRyboDy ! , 0         .code        .startup         mov bx, offset atring again: mov al, bx          call chan             ;调用过程         mov bx , al next: inc bx         jmp again  done: .exit 0  chan    proc                  ;大写转换为小写字母的过程         or al, al          jz done          cmp al

    注意事项

    本文(新版汇编语言程序设计课后答案.doc)为本站会员(豆****)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开