汇编语言程序设计钱晓捷课后答案.docx

上传人:b****7 文档编号:25484580 上传时间:2023-06-09 格式:DOCX 页数:56 大小:38.20KB
下载 相关 举报
汇编语言程序设计钱晓捷课后答案.docx_第1页
第1页 / 共56页
汇编语言程序设计钱晓捷课后答案.docx_第2页
第2页 / 共56页
汇编语言程序设计钱晓捷课后答案.docx_第3页
第3页 / 共56页
汇编语言程序设计钱晓捷课后答案.docx_第4页
第4页 / 共56页
汇编语言程序设计钱晓捷课后答案.docx_第5页
第5页 / 共56页
点击查看更多>>
下载资源
资源描述

汇编语言程序设计钱晓捷课后答案.docx

《汇编语言程序设计钱晓捷课后答案.docx》由会员分享,可在线阅读,更多相关《汇编语言程序设计钱晓捷课后答案.docx(56页珍藏版)》请在冰豆网上搜索。

汇编语言程序设计钱晓捷课后答案.docx

汇编语言程序设计钱晓捷课后答案

汇编语言程序设计(第二版) 钱晓捷 习题答案

第二章(01)

2.1

(1)AX=1200h

(2)AX=0100h

(3)AX=4C2Ah

(4)AX=3412h

(5)AX=4C2Ah

(6)AX=7856h

(7)AX=65B7h

2.2

(1)    两操作数类型不匹配

(2)       IP指令指针禁止用户访问

(3)    立即数不允许传给段寄存器

(4)    段寄存器之间不允许传送

(5)    两操作数类型不匹配

(6)    目的操作数应为[BP]

(7)    源操作数应为[BX+DI]   

(8)    立即数不能作目的操作数

2.3

leabx,table     ;获取table的首地址,BX=200H

moval,8         ;传送欲转换的数字,AL=8

xlat             ;转换为格雷码,AL=12H

2.4

堆栈是一种按“先进后出”原则存取数据的存储区域。

堆栈的两种基本操作是压栈和出栈,对应的指令是PUSH和POP。

2.5

movax,8057h

pushax

movax,0f79h

pushax

popbx            ;bx=0f79h

pop[bx]         ;DS:

[0f79h]=8057h

2.6

AL=89h      CF      ZF      SF      OF      PF

AL=12h       1       0       0       1       1

AL=0afh      0       0       1       0       1

AL=0afh      1       0       1       0       1

AL=00h       0       1       0       0       1

AL=0ffh      0       0       1       0       1AL=00h       0       1       0       0       1      

 2.7W=X+Y+24-Z

2.8

(1)ADDDX,BX

(2)ADDAL,[BX+SI]

(3)ADD[BX+0B2H],CX

(4)ADDWORDPTR[0520H],3412H

(5)ADDAL,0A0H

2.9;为了避免与操作数地址混淆,将题中X,Y,Z,V字操作数改为A,B,C,D

      movax,X       ;ax=A   

      imulY         ;dx,ax=A*B     (将操作数看作符号数,以下同)

      movcx,ax   

      movbx,dx      ;bx,ax     <--     dx,ax=A*B  

      movax,Z       ;ax=C  

      cwd            ;dx,ax=C   (扩展符号后为双字)

      addcx,ax  

      adcbx,dx      ;bx,cx<--bx,cx+dx,ax=A*B+C

      subcx,540  

      sbbbx,0       ;bx,cx<--A*B+C-540   

      movax,V      ;ax=D  

      cwd            ;dx,ax=D   (扩展符号后为双字)  

      subax,cx  

      sbbdx,bx     ;dx,ax=dx,ax-bx,cx=D-(A*B+C-540)

      idivX;运算结果:

[D-(A*B+C-540h)]/A;ax存商,dx存余数

2.10;

(1)xchg的操作数不能是立即数

(2不能对CS直接赋值

(3)两个操作数不能都是存储单元

(4)堆栈的操作数不能是字节量

(5)adc的操作数不能是段寄存器

(6)没有确定是字节还是字操作

(7)in不支持超过FFH的直接寻址

(8)out只能以AL/AX为源操作数

   第二章(02)

  

2.11;

指令

AX的值

CF

OF

SF

ZF

PF

Mov    ax,1407h

1470h

-

-

-

-

-

And    ax,ax

1470h

0

0

0

0

0

Or     ax,ax

1470h

0

0

0

0

0

Xor    ax,ax

0

0

0

0

1

1

Not     ax

0ffffh

-

-

-

-

-

Test    ax,0f0f0h

0ffffh

0

0

1

0

1

注意:

1.mov,not指令不影响标志位

         2.其他逻辑指令使CF=OF=0,根据结果影响其他标志位。

                                                                     第2章(03)

2.12;

指令                 注释              执行结果   CFOFSFZFPF

movsi,ax           si=ax             si=0008h     -  -  -  -  -

shlsi,1            si=2*ax           si=0010h     0  0  0  0  0

addsi,ax           si=3*ax           si=0018h     0  0  0  0  1

movdx,bx           dx=bx             dx=0010h    -  -  -  -  -

movcl,03h          cl=03h                         -  -  -  -  -

shldx,cl           dx=8*bx           dx=0080h     0  u  0  0  0

subdx,bx           dx=7*bx           dx=0070h     0  0  0  0  0

adddx,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)

;不考虑进位movbl,al

movcl,3

shlal,cl

addal,bl    ;shlbl,1

addal,bl

;考虑进位xorah,ah

movbx,ax

movcl,3

shlax,cl

addax,bx    ;shlbx,1

addax,bx

(2)

数字0~9的ASCII码是:

30h~39h

非压缩BCD码的0~9是:

00h~09h

方法一:

andal,0fh    ;实现ASCII到非压缩BCD码的转换

oral,30h    ;实现非压缩BCD码到ASCII的转换

方法二:

xoral,30h    ;求反D5D4位,其他不变

;即高4位为3,则变为0;高4位为0,则变为3

movcl,4

again:

shrdx,1    ;实现逻辑右移

;采用“sardx,1”,则实现算术右移

    rcrax,1

    deccl

    jnzagain

2.14;

(1)用sar编写

2.20;8086的条件转移的转移范围:

在当前指令地址的+127-----128之内。

如条件转移的转移范围超出此范围,可在此范围内安排一条无条件转移,再转移到范围外的目标地址。

2.21;

(1)JMPBx        ;转移的有效地址EA=BX=1256h

(2)JMPtABLE[Bx];转移的有效地址EA=[ds:

20a1h+1256h]=[232f7]=3280h

(3)JMP[Bx][si]  ;转移的有效地址EA=[ds:

1256h+528fh]=264e5h=2450h

2.22;

(1)xorax,1e1eh

       jeequal

    ;AX=1e1eh(异或后为0)

(2)testal,10000001b

      jnzthere

    ;AL的D0或D7至少有一位为1

(3)cmpcx,64h

       jbthere

    ;CX(无符号数)<64h

2.23;

movcx,0      不循环,因为一进入循环就判cx=0?

如cx=0就退出循环

delay:

loopdelay

2.24;

(1)若DX>DI,转到above执行

       cmpdx,di

       jaabove    ;=jnbeabove

(2)若AX>SI,转到greater执行

       cmpax,si

       jggreater    ;=jnlegreater

(3)若CX=0,转到zero执行

       cmpcx,0      jcxzzero

       jzzero     

(4)若AX-SI产生溢出,转到overflow执行;

       cmpax,di

       jooverflow

(5)若SI≤AX,转到less_eq执行;

       cmpsi,ax     

       cmpax,si

       jleless_eq     

       jgeless_eq

(6)若DI≤DX,转到below_eq执行。

       cmpdi,dx     

       cmpdx,di

       jbebelow_eq

       jaebelow_eq

2.25;答:

将首地址为array得20个字的数组求和,并将结果存入total单元中。

2.26;

(1)

     movsi,0

     movdl,string[si]   ;第1个字符送dl寄存器

     movsi,5

     movdh,string[si]   ;第6个字符送dh寄存器

(2)  

    xorsi,si                    ;si清零

    moval,buffer[si]   ;第一字节

    incsi

    movah,buffer[si]   ;第二字节

    movcl,4

    shlah,cl                  ;BCD码移到高半字节

    oral,ah                     ;组合成压缩BCD码

    movdl,al                   ;存入dl寄..

    incsi

    moval,buffer[si]   ;第三字节

    incsi

    movah,buffer[si]   ;第四字节

    movcl,4

    shlah,cl           ;BCD码移到高半字节

    oral,ah            ;组合成压缩BCD码

    movdh,al           ;存入dh寄..

(3)

     testdx,0f000h

     jzzero

     movax,-1

     jmpdone

     zero:

   movax,0

     done:

   ret

(4)

     leabx,buffer1  

     leadx,buffer2

     movcx,8               ;8个字节

     xorsi,si              ;si=0  

     clc                    ;CF=0

(5)

     movax,0b800h

     movds,ax       ;段地址

     xorsi,si       ;地址偏移量si=0

     xordx,dx       ;和的高字dx=0

     movcx,99       ;加的次数

     movax,[si]   ;第一个数

again:

   incsi           ;指向下一个字单元

     incsi

     addax,[si]     ;加下一个数

     jnc   noc         ;无进位转

     incdx           ;有进位dx=dx+1

noc:

   deccx           ;次数-1

     jnzcx,again    ;非0继续加  

     ret

(6)

     movsi,offsetstring

     movcx,8000h                ;32k=2^15=8000h

again:

cmp[si],’$’

     jnznext

     mov[si],20h               ;if[si]=’$’[si]<--’’   

next:

   incsi

     loopagain

(7)

     xorsi,si               ;si<--0

     movcx,100             ;循环次数

again:

decarray[si]

     deccx

     jnz   again

(8)

      xorsi,si         ;si<--0

      coun:

   cmpstring[si],’$’

      je   done

      incsi

      jmpcoun

      done:

ret                                 

2..27;

(1)使CF=0:

       clc   ;      andax,ax   ;orax,ax

(2)使AX=0:

      xorax,ax  ;    andax,0  ;movax,0

(3)同时使AX=0和CF=0:

andax,0;xorax,ax;subax,ax

2.29;压缩BCD码加法:

AX←AX+BX

出口参数:

AX=BCD码和

2.34;okmsg     db‘OK’,‘$’errmsg     db‘Error!

Overflow!

’,‘$’     …     

     movax,X

     subax,Y

     jooverflow

     movdx,offsetokmsg

     jmpnext

overflow:

movdx,errmsg

next:

      movah,9

     int21h

错误:

     movax,X

     subax,Y

     jooverflow

     movdx,offsetokmsg         

     okmsg     db‘OK’,‘$’     

     movdx,errmsg     ;错误1:

数据定义在代码中

     movah,9

     int21h

overflow:

   errmsgdb‘Error!

Overflow!

’,‘$’     

     movdx,errmsg           ;错误2:

缺少JMP指令

     movah,9

     int21h

2.37;;xt237.asm

.modelsmall

.stack

.data

arraydb255

db0

array1db255dup('$')

array2db0dh,0ah,'$'

.code

.startup

movah,0ah   ;键盘输入字符串

movdx,offsetarray

int21h

movdx,offsetarray2;回车换行

movah,09h

int21h

movbx,offsetarray1

again:

moval,[bx]

cmpal,'$'

jzdone

cmpal,'a'   ;小于a和大于z的字符不是小写字母

jbnext

cmpal,'z'

janext

subal,20h   ;在a和z之间的字符才是小写字母,转换为大写

mov[bx],al   ;保存到原位置

next:

incbx

jmpagain

done:

movdx,offsetarray1

movah,09h

int21h

.exit0

end

第三章(01)

3.1;硬指令:

每个硬指令就是一个处理器指令,在CPU执行时产生相应功能;

伪指令:

伪指令并不产生处理器指令,它通常用于辅助汇编程序对源程序进行汇编。

3.2;

3.5;⒈  编辑     文本编辑程序      汇编语言源程序.asm

⒉  汇编     汇编程序          目标模块文件.obj

⒊  连接     连接程序          可执行文件.exe或.com

⒋  调试     调试程序          应用程序

3.6;;xt236.asm  简化段定义格式

        .modelsmall;定义程序的存储模式(小模式)

        .stack      ;定义堆栈段(默认1024个字节)

        .data       ;定义数据段

str1   ab’InputNumber:

0~9:

’,0dh,0ah,’$’   

str2   ab’Error!

’,0dh,0ah,’$’  

        .cade       ;定义代码段  

        .startup    ;说明程序的起始点,建立ds,ss的内容。

  

         movah,09h        ;显示str1字符串

         movdx,offsetstr1

         int21h

gtekey:

movah,1           ;调用BIOS判断按键功能

         int16h

         jz   getkey          ;如zf=0,无键按下,等待

         cmp   al,‘0’       ;有键按下,键值与‘0’比较

         jberror          ;如<‘0’,出错处理

         cmpal,‘9’      ;有键按下,键值与‘9’比较

         jaerror          ;如〉‘9’,出错处理

         movah,02h      ;调用DOS显示字符功能,显示该数字

         movdl,al

         int21h

        .exit0              ;终止程序执行,返回DOS

error:

movah,09h    ;出错,调用DOS功能显示str2字符串

         movdx,offsetstr2

         int21h

         jmpgetkey        ;等待按键

         end        ;汇编结束

3.7;;xt307.asm

stack   segment

         dw512dup(?

stack   ends

data    segment

arraydb255

db0

array1db255dup('$')

array2db0dh,0ah,'$'

dataends

codesegment'code'

assumecs:

code,ds:

data,ss:

stack

start:

movax,data

         movds,ax

movah,0ah   ;键盘输入字符串

movdx,offsetarray

int21h

movdx,offsetarray2;回车换行

movah,09h

int21h

movbx,offsetarray1

again:

moval,[bx]

cmpal,'$'

jzdone

cmpal,'a'   ;小于a和大于z的字符不是小写字母

jbnext

cmpal,'z'

janext

subal,20h   ;在a和z之间的字符才是小写字母,转换为大写

mov[bx],al   ;保存到原位置

next:

incbx

jmpagain

done:

movdx,offsetarray1

movah,09h

int21h

movax,4c00h

int21h

codeends

endstart

3.9;

(1)

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

当前位置:首页 > 小学教育 > 学科竞赛

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1