汇编语言程序设计钱晓捷课后答案Word格式文档下载.docx

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

汇编语言程序设计钱晓捷课后答案Word格式文档下载.docx

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

汇编语言程序设计钱晓捷课后答案Word格式文档下载.docx

1

AL=0afh 

AL=00h 

AL=0ffh 

1AL=00h 

W=X+Y+24-Z

(1)ADDDX,BX

(2)ADDAL,[BX+SI]

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

(4)ADDWORDPTR[0520H],3412H

(5)ADDAL,0A0H

为了避免与操作数地址混淆,将题中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 

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存余数

;

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

(2不能对CS直接赋值

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

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

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

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

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

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

第二章(02)

指令

AX的值

CF

OF

SF

ZF

PF

Mov 

ax,1407h

1470h

-

And 

ax,ax

Or 

Xor 

1

Not 

ax

0ffffh

Test 

ax,0f0f0h

注意:

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

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

第2章(03)

指令 

注释 

执行结果 

CFOFSFZFPF

movsi,ax 

si=ax 

si=0008h 

-

shlsi,1 

si=2*ax 

si=0010h 

0

addsi,ax 

si=3*ax 

si=0018h 

movdx,bx 

dx=bx 

dx=0010h 

movcl,03h 

cl=03h 

shldx,cl 

dx=8*bx 

dx=0080h 

subdx,bx 

dx=7*bx 

dx=0070h 

adddx,si 

dx=7*bx+3*ax 

dx=0088h 

注意:

1.左移N次相当于乘于2的N次方,右左移N次相当于除乘于2的N次方。

2.移位指令根据是否移入“1”到CF,设置CF,根据移位后的结果影响SF,ZF,PF。

根据最高符号位是否改变设置OF,如改变OF=1.

3.‘u’表示无定义,‘-’表示无影响。

(1)

不考虑进位movbl,al

movcl,3

shlal,cl

addal,bl 

shlbl,1

addal,bl

考虑进位xorah,ah

movbx,ax

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

(1)用sar编写

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

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

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

(1)JMPBx 

转移的有效地址EA=BX=1256h

(2)JMPtABLE[Bx];

转移的有效地址EA=[ds:

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

(3)JMP[Bx][si] 

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

(1)xorax,1e1eh

jeequal

AX=1e1eh(异或后为0)

(2)testal,b

jnzthere

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

(3)cmpcx,64h

jbthere

CX(无符号数)<64h

movcx,0 

不循环,因为一进入循环就判cx=0如cx=0就退出循环

delay:

loopdelay

(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 

jleless_eq 

jgeless_eq

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

cmpdi,dx 

jbebelow_eq

jaebelow_eq

答:

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

movsi,0

movdl,string[si] 

第1个字符送dl寄存器

movsi,5

movdh,string[si] 

第6个字符送dh寄存器

xorsi,si 

si清零

moval,buffer[si] 

第一字节

incsi

movah,buffer[si] 

第二字节

movcl,4

shlah,cl 

BCD码移到高半字节

oral,ah 

组合成压缩BCD码

movdl,al 

存入dl寄..

第三字节

第四字节

movdh,al 

存入dh寄..

(3)

testdx,0f000h

jzzero

movax,-1

jmpdone

zero:

movax,0

done:

ret

(4)

leabx,buffer1 

leadx,buffer2

movcx,8 

8个字节

si=0 

clc 

CF=0

(5)

movax,0b800h

movds,ax 

段地址

地址偏移量si=0

xordx,dx 

和的高字dx=0

movcx,99 

加的次数

movax,[si] 

第一个数

incsi 

指向下一个字单元

addax,[si] 

加下一个数

jnc 

noc 

无进位转

incdx 

有进位dx=dx+1

noc:

deccx 

次数-1

jnzcx,again 

非0继续加 

(6)

movsi,offsetstring

movcx,8000h 

32k=2^15=8000h

cmp[si],’$’

jnznext

mov[si],20h 

if[si]=’$’[si]<

--’’ 

next:

loopagain

(7)

si<

--0

movcx,100 

循环次数

decarray[si]

deccx

jnz 

again

(8)

coun:

cmpstring[si],’$’

je 

done

jmpcoun

ret 

2..27;

(1)使CF=0:

andax,ax 

orax,ax

(2)使AX=0:

xorax,ax 

andax,0 

movax,0

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

andax,0;

xorax,ax;

subax,ax

压缩BCD码加法:

AX←AX+BX

出口参数:

AX=BCD码和

okmsg 

db‘OK’,‘$’errmsg 

db‘Error!

Overflow!

’,‘$’ 

… 

movax,X

subax,Y

movdx,offsetokmsg

jmpnext

overflow:

movdx,errmsg

movah,9

int21h

错误:

movdx,offsetokmsg 

db‘OK’,‘$’ 

movdx,errmsg 

错误1:

数据定义在代码中

errmsgdb‘Error!

错误2:

缺少JMP指令

.modelsmall

.stack

.data

arraydb255

db0

array1db255dup('

$'

array2db0dh,0ah,'

.code

.startup

movah,0ah 

键盘输入字符串

movdx,offsetarray

int21h

movdx,offsetarray2;

回车换行

movah,09h

movbx,offsetarray1

moval,[bx]

cmpal,'

jzdone

a'

小于a和大于z的字符不是小写字母

jbnext

z'

janext

subal,20h 

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

mov[bx],al 

保存到原位置

incbx

jmpagain

done:

movdx,offsetarray1

.exit0

end

第三章(01)

硬指令:

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

伪指令:

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

⒈ 

编辑 

文本编辑程序 

汇编语言源程序.asm

⒉ 

汇编 

汇编程序 

目标模块文件.obj

⒊ 

连接 

连接程序 

可执行文件.exe或

⒋ 

调试 

调试程序 

应用程序

简化段定义格式

.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

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

.exit0 

终止程序执行,返回DOS

error:

出错,调用DOS功能显示str2字符串

movdx,offsetstr2

jmpgetkey 

等待按键

end 

汇编结束

stack 

segment

dw512dup()

ends

data 

segment

dataends

codesegment'

code'

assumecs:

code,ds:

data,ss:

stack

start:

movax,data

movds,ax

movax,4c00h

codeends

endstart

(1)movbyteptr[bx],1000 

1000超出了一个字节范围

(2)movbx,offsetmyword[si];

寄存器的值只有程序执行时才能确定,

而offset是汇编过程计算偏移地址,故无法确定

可以改为leabx,myword[si]

(3)

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

当前位置:首页 > 高中教育 > 初中教育

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

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