汇编语言程序设计(第二版) 钱晓捷 课后答案_第1页
汇编语言程序设计(第二版) 钱晓捷 课后答案_第2页
汇编语言程序设计(第二版) 钱晓捷 课后答案_第3页
汇编语言程序设计(第二版) 钱晓捷 课后答案_第4页
汇编语言程序设计(第二版) 钱晓捷 课后答案_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

-.z.汇编语言程序设计(第二版)钱晓捷习题答案第二章〔01〕2.1〔1〕A*=1200h

〔2〕A*=0100h

〔3〕A*=4C2Ah

〔4〕A*=3412h

〔5〕A*=4C2Ah

〔6〕A*=7856h

〔7〕A*=65B7h2.2(1)

两操作数类型不匹配

(2)

IP指令指针制止用户访问

(3)

立即数不允许传给段存放器

(4)

段存放器之间不允许传送

(5)

两操作数类型不匹配

(6)

目的操作数应为[BP]

(7)

源操作数应为[B*+DI]

(8)

立即数不能作目的操作数2.3leab*,table

;获取table的首地址,B*=200H

moval,8

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

*lat

;转换为格雷码,AL=12H2.4mova*,8057h

pusha*

mova*,0f79h

pusha*

popb*

;b*=0f79h

pop[b*]

;DS:[0f79h]=8057h2.6AL=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.5堆栈是一种按"先进后出〞原则存取数据的存储区域。堆栈的两种根本操作是压栈和出栈,对应的指令是PUSH和POP。

2.7W=*+Y+24-Z2.8〔1〕ADDD*,B*

〔2〕ADDAL,[B*+SI]

〔3〕ADD[B*+0B2H],C*

〔4〕ADDWORDPTR[0520H],3412H

〔5〕ADDAL,0A0H2.9;为了防止与操作数地址混淆,将题中*,Y,Z,V字操作数改为A,B,C,D

mova*,*

;a*=A

imulY

;d*,a*=A*B

(将操作数看作符号数,以下同〕

movc*,a*

movb*,d*

;b*,a*

<--

d*,a*=A*B

mova*,Z

;a*=C

cwd

;d*,a*=C

〔扩展符号后为双字〕

addc*,a*

adcb*,d*

;b*,c*<--b*,c*+d*,a*=A*B+C

subc*,540

sbbb*,0

;b*,c*<--A*B+C-540

mova*,V

;a*=D

cwd

;d*,a*=D

〔扩展符号后为双字〕

suba*,c*

sbbd*,b*

;d*,a*=d*,a*-b*,c*=D-(A*B+C-540)

idiv*;运算结果:[D-(A*B+C-540h)]/A;a*存商,d*存余数2.10;〔1〕*chg的操作数不能是立即数〔2不能对CS直接赋值〔3〕两个操作数不能都是存储单元〔4〕堆栈的操作数不能是字节量〔5〕adc的操作数不能是段存放器〔6〕没有确定是字节还是字操作〔7〕in不支持超过FFH的直接寻址〔8〕out只能以AL/A*为源操作数

第二章(02)

2.11;指令A*的值CFOFSFZFPFMov

a*,1407h1470h-----And

a*,a*1470h00000Or

a*,a*1470h00000*or

a*,a*000011Not

a*0ffffh-----Test

a*,0f0f0ffffh00101注意:1.mov,not指令不影响标志位2.其他逻辑指令使CF=OF=0,根据结果影响其他标志位。

第2章〔03〕2.12;指令

注释

执行结果

CFOFSFZFPFmovsi,a*

si=a*

si=0008h

-

-

-

-

-shlsi,1

si=2*a*

si=0010h

0

0

0

0

0addsi,a*

si=3*a*

si=0018h

0

0

0

0

1movd*,b*

d*=b*

d*=0010h

-

-

-

-

-movcl,03h

cl=03h

-

-

-

-

-shld*,cl

d*=8*b*

d*=0080h

0

u

0

0

0subd*,b*

d*=7*b*

d*=0070h

0

0

0

0

0addd*,si

d*=7*b*+3*a*

d*=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

;考虑进位*orah,ah

movb*,a*

movcl,3

shla*,cl

adda*,b*

;shlb*,1

adda*,b*

(2)

数字0~9的ASCII码是:30h~39h

非压缩BCD码的0~9是:00h~09h

方法一:

andal,0fh

;实现ASCII到非压缩BCD码的转换

oral,30h

;实现非压缩BCD码到ASCII的转换

方法二:

*oral,30h

;求反D5D4位,其他不变

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

movcl,4

again:shrd*,1

;实现逻辑右移

;采用"sard*,1”,则实现算术右移

rcra*,1

deccl

jnzagain2.14;〔1〕用sar编写2.20;8086的条件转移的转移范围:在当前指令地址的+127-----128之内。如条件转移的转移范围超出此范围,可在此范围内安排一条无条件转移,再转移到范围外的目标地址。2.21;(1)JMPB*

;转移的有效地址EA=B*=1256h

(2)JMPtABLE[B*];转移的有效地址EA=[ds:20a1h+1256h]=[232f7]=3280h

(3)JMP[B*][si]

;转移的有效地址EA=[ds:1256h+528fh]=264e5h=2450h2.22;〔1〕*ora*,1e1eh

jeequal

;A*=1e1eh〔异或后为0〕

〔2〕testal,10000001b

jnzthere

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

〔3〕cmpc*,64h

there

;C*〔无符号数〕<64h2.23;movc*,0

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

delay:loopdelay2.24;〔1〕假设D*>DI,转到above执行

cmpd*,di

jaabove

;=jnbeabove

〔2〕假设A*>SI,转到greater执行

cmpa*,si

jggreater

;=jnlegreater

〔3〕假设C*=0,转到zero执行

cmpc*,0

jc*zzero

jzzero

〔4〕假设A*-SI产生溢出,转到overflow执行;

cmpa*,di

jooverflow

〔5〕假设SI≤A*,转到less_eq执行;

cmpsi,a*

cmpa*,si

jleless_eq

jgeless_eq

〔6〕假设DI≤D*,转到below_eq执行。

cmpdi,d*

cmpd*,di

ebelow_eq

jaebelow_eq2.25;答:将首地址为array得20个字的数组求和,并将结果存入total单元中。2.26;(1)

movsi,0

movdl,string[si]

;第1个字符送dl存放器

movsi,5

movdh,string[si]

;第6个字符送dh存放器

(2)

*orsi,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)

testd*,0f000h

jzzero

mova*,-1

jmpdone

zero:

mova*,0

done:

ret

(4)

leab*,buffer1

lead*,buffer2

movc*,8

;8个字节

*orsi,si

;si=0

clc

;CF=0

(5)

mova*,0b800h

movds,a*

;段地址

*orsi,si

;地址偏移量si=0

*ord*,d*

;和的高字d*=0

movc*,99

;加的次数

mova*,[si]

;第一个数

again:

incsi

;指向下一个字单元

incsi

adda*,[si]

;加下一个数

jnc

noc

;无进位转

incd*

;有进位d*=d*+1

noc:

decc*

;次数-1

jnzc*,again

;非0继续加

ret

(6)

movsi,offsetstring

movc*,8000h

;32k=2^15=8000h

again:cmp[si],’$’

jnzne*t

mov[si],20h

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

ne*t:

incsi

loopagain

(7)

*orsi,si

;si<--0

movc*,100

;循环次数

again:decarray[si]

decc*

jnz

again

(8)

*orsi,si

;si<--0

coun:

cmpstring[si],’$’

je

done

incsi

jmpcoun

done:ret

2..27;(1)使CF=0:

clc

anda*,a*

;ora*,a*

(2)使A*=0:

*ora*,a*

anda*,0

;mova*,0

(3)同时使A*=0和CF=0:anda*,0;*ora*,a*;suba*,a*2.29;压缩BCD码加法:A*←A*+B*

出口参数:A*=BCD码和2.24;okmsg

db‘OK’,‘$’errmsg

db‘Error!Overflow!’,‘$’

mova*,*

suba*,Y

jooverflow

movd*,offsetokmsg

jmpne*t

overflow:movd*,errmsg

ne*t:

movah,9

int21h

错误:

mova*,*

suba*,Y

jooverflow

movd*,offsetokmsg

okmsg

db‘OK’,‘$’

movd*,errmsg

;错误1:数据定义在代码中

movah,9

int21h

overflow:

errmsgdb‘Error!Overflow!’,‘$’

movd*,errmsg

;错误2:缺少JMP指令

movah,9

int21h2.37;;*t237.asm

.modelsmall

.stack

.data

arraydb255

db0

array1db255dup('$')

array2db0dh,0ah,'$'

.code

.startup

movah,0ah

;键盘输入字符串

movd*,offsetarray

int21h

movd*,offsetarray2;回车换行

movah,09h

int21h

movb*,offsetarray1

again:moval,[b*]

cmpal,'$'

jzdone

cmpal,'a'

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

ne*t

cmpal,'z'

jane*t

subal,20h

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

mov[b*],al

;保存到原位置

ne*t:incb*

jmpagain

done:movd*,offsetarray1

movah,09h

int21h

.e*it0

end第三章(01)3.1;硬指令:每个硬指令就是一个处理器指令,在CPU执行时产生相应功能;伪指令:伪指令并不产生处理器指令,它通常用于辅助汇编程序对源程序进展汇编。3.2;3.5;⒈编辑文本编辑程序汇编语言源程序.asm

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

⒊连接连接程序可执行文件.e*e或.

⒋调试调试程序应用程序3.6;;*t236.asm

简化段定义格式

.modelsmall;定义程序的存储模式〔小模式〕

.stack

;定义堆栈段〔默认1024个字节〕

.data

;定义数据段

str1

ab’InputNumber:0~9:’,0dh,0ah,’$’

str2

ab’Error!’,0dh,0ah,’$’

.cade

;定义代码段

.startup

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

movah,09h

;显示str1字符串

movd*,offsetstr1

int21h

gtekey:movah,1

;调用BIOS判断按键功能

int16h

jz

getkey

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

cmp

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

error

;如<‘0’,出错处理

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

jaerror

;如〉‘9’,出错处理

movah,02h

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

movdl,al

int21h

.e*it0

;终止程序执行,返回DOS

error:movah,09h

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

movd*,offsetstr2

int21h

jmpgetkey

;等待按键

end

;汇编完毕3.7;;*t307.asm

stack

segment

dw512dup(")

stack

ends

data

segment

arraydb255

db0

array1db255dup('$')

array2db0dh,0ah,'$'

dataends

codesegment'code'

assumecs:code,ds:data,ss:stack

start:mova*,data

movds,a*

movah,0ah

;键盘输入字符串

movd*,offsetarray

int21h

movd*,offsetarray2;回车换行

movah,09h

int21h

movb*,offsetarray1

again:moval,[b*]

cmpal,'$'

jzdone

cmpal,'a'

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

ne*t

cmpal,'z'

jane*t

subal,20h

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

mov[b*],al

;保存到原位置

ne*t:incb*

jmpagain

done:movd*,offsetarray1

movah,09h

int21h

mova*,4c00h

int21h

codeends

endstart3.9;〔1〕movbyteptr[b*],1000

;1000超出了一个字节范围

〔2〕movb*,offsetmyword[si];存放器的值只有程序执行时才能确定,

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

;可以改为leab*,myword[si]

〔3〕cmpmybyte1,mybyte2

;两个都是存储单元,指令不允许

〔4〕moval,mybyte1+mybyte2;变量值只有执行时才确定,汇编过程不能计算

〔5〕subal,myword

;字节量AL与字量myword,类型不匹配

〔6〕jnzmyword

;Jcc指令只有相对寻址方式,不支持间接寻址方式3.10;前者为"与〞操作硬指令助记符,可汇编成机器代码。

后者为逻辑运算符,在汇编时进展"与〞运算,产生具体数值。3.11;注:对于逻辑运算,有关操作数可化为二进制数。

(1)moval,23hAND45hOR67h

;67h

(2)mova*,1234h/16+1Oh

;133h

(3)mova*,NOT(65535*OR1234h)

;1234h

(4)moval,LOW1234hORHIGH5678h

;76h

(5)mova*,23hSHL4

;0234h

(6)mova*,1234hSHR6

;0048h

(7)moval,’a’AND(NOT(’a’-’A’));41h

(8)moval,’H’OR00100000b

;68h

(9)mova*,(76543LT32768)*OR7654h

;7654h3.12;假设block开场的数据块有32个字节数据:16个正数+100(64h),16个负数-48〔0doh〕

分别连续分布:

block

db16dup〔100〕,16dup〔-48〕;也可以是任意字节数据,随意分布。

dplus

db32dup(")

;为正数预留存储空间

dminus

db32dup(")

;为负数预留存储空间

count

equ32

;字节数3.15;mydataseg

segment

my1b

db‘Personalputer’

my2b

db20

my3b

db14h

;20h

my4b

db00010100b

my5w

dw20dup(")

my6c

equ100

;my6c=100

my7c

equ<Personalputer>

mydataseg

ends3.18;段地址:表示标号所在代码段的段地址;

偏移地址:表示标号所在代码段的段内偏移地址;

类型:引用该标号时,表示它所在同一个段――near类型,还是另外一个段――far类型。3.19;mydata

segment

ORGlO0h

VARWDWl234H,5678H

VARBDB3,4

AGLIN4

VARDDD12345678H

EVEN

BUFFDB10DUP(")

MESSDB

’HELLO’

MOVA*,OFFSETVARB+OFFSETMESS

;A*=4+16H=1AH

MOVA*,TYFETYPEBUFF+TYPEMESS+TYPEVARD;A*=1+1+4=06H

MOVA*,SIZEVARW+SIZEBUFF+SIZEMESS;A*=4+10+5=19=13H

MOVA*,LENGTHVARW+LENGTHVARD

;A*=2+1=03H

MOVA*,LENGTHBUFF+SIZEVARW

;A*=10+4=14=0EH

MOVA*,TYPEBIGIN

;A*=FF02H(近〕

MOVA*,OFFSETBEGIN

;A*=1BH

3.22;段定义伪指令

段名

定位

组合

类别

组名

.CODE

_TE*T

WORD

PUBLIC

’CODE’

.DATA

_DATA

WORD

PUBLIC

’DATA’

DGROUP

.STACK

STACK

PARA

STACK

’STACK’DGROUP3.25;.modelsmall

.stack

.data

num

equ5

datalistdw-1,0,2,5,4,"

.code

.startup

movb*,offsetdatalist

movc*,num

*ora*,a*

again:adda*,[b*]

incb*

incb*

loopagain

mov[b*],a*

.e*it0

end3.26;stack

segmentpara‘stack’

dw

512dup(")

stack

ends

data

segment

dwordarray

db100dup(")

data

ends

code

segment‘code’

assumecs:code,ds:data,es:data,ss:stack

org100h

start:mova*,data

movds,a*

moves,a*

movdi,offsetarray

moval,64h

movc*,100

cld

repstosb

mova*,4c00h

int21h

code

ends

endstart3.27;解答;*t327.asm

.model

small

.stack

256

;定义堆栈段大小为256个字节

.data

anum

dd

11223344h

;定义两个双字的数〔随意〕

bnum

dd

77553311h

sum

dd

"

;定义结果,执行后为:88776655h

.code

.startup

*or

si,si

;相对于变量的位移量清零

mov

c*,2

;分上下字分别相加,共两次

clc

;清零cf

again:mova*,anum[si]

;取第一个数的一个字〔先低字后高字〕

adca*,bnum[si]

;取第二个数的一个字〔先低字后高字〕

movsum[si],a*

;存和的一个字〔先低字后高字〕

incsi

;修改位移量指向下一个字〔加2〕

incsi

loop

again

;c*=c*-1,ifc*<>0,jumpagain

.e*it0

end3.28;

.startup

*or

si,si

;位移量清零

moval,bdata[si]

;取第一个数

movc*,num-1

;累加次数

again:inc

si

;指向下一个数

adcal,

bdata[si]

;累加

loop

again

;如未完,继续累加

mov

sum,al

;完了,存结果

.e*it0

end4.3;思路:设这四组从低位到高位分别放在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,0fh4.4;getkey:movah,1

;从键盘输入,出口:al存键值

int21h

cmp

al,’a’

;判键值是小写字母?

getkay

cmp

al,’z’

ja

getkay

subal,20h

;是小写字母转换为大写字母

movah,09h

;显示

int21h4.8;〔1〕将jmptable[b*]指令改为:movd*,table[b*]

〔2〕去掉源程序中:.e*it0---end之间的语句4.17;.modelsmall

.stack256

.data

stri1db’pleaseinputnumber:1--9’,odh,oah,’$’

.code

.startup

again:mov

d*,offsetstri1

;显示stri1,提示输入

movah,09h

int21h

movah,01h

;调用输入一个字符

int

21h

;输入一个字符存在al中

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

again

;重新输入

cmpal,’9’

ja

again

andal,0fh

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

movc*,al

;振铃次数送c*

.repeat

movdl,07h

;调用一次振铃

movah,02h

int21h

movd*,0ffffh

;延时

abc:decd*

jnzabc

.untilc*z

;c*=c*-1,c*=0退出

.e*it0

end4.22;crazy

PROC

;crazy

PROC

pusha*

*ora*,a*

*ora*,a*

*ord*,d*

*ord*,d*

again:

adda*,[b*]

;again:

adda*,[b*]

adcd*,0

adcd*,0

incb*

incb*

incb*

incb*

loopagain

loopagain

ret

ret

ENDPcrazy

;crazy

ENDP4.25;子程序中又调用子程序就形成子程序嵌套。子程序中直接或间接调用该子程序本身就形成子程序递归。4.26;

.modelsmall

.stack256

.data

stdng

db’HeLLOeveRyboDy!’,0

.code

.startup

movb*,offsetatring

again:moval,[b*]

callchan

;调用过程

mov[b*],al

ne*t:incb*

jmpagain

done:.e*it0

chan

proc

;大写转换为小写字母的过程

oral,al

jzdone

cmpal,’A’

ne*t

cmpal,’Z’

jane*t

oral,20h

ret

chan

endp

end4.27;astob

proc

anddh,0fh

;十位数的ASCII码转为二进制数

moval,dh

mul10

;al=10*dh

anddl,0fh

;个位数的ASCII码转为二进制数

addal,dl

;al=10*dh+dl

ret

astob

endp5.1;cmp*,5

je

abc

jmp

done

abc:cmpa*,b*

jne

cde

jmp

done

cde:inca*

done:....5.2;cmp*,5

je

abc

jmp

done

cmpa*,b*

jne

abc

jmp

done

abc:

inca*

done:

....5.4;宏定义采用一对伪指令实现,格式如下〔其中方括号表示可选〕:

宏名

macro

[形参表]

宏定义体

endm

宏调用时,利用宏名带上实参即可,格式如下:

宏名[实参表]5.6;宏的参数功能非常强大,即可以没有参数,也可以带有一个或多个参数;而且参数的形式非常灵活,可以是常量、变量、存储单元、指令或它们的一局部,还可以是表达式等。宏展开时的形参与实参结合是用位置匹配的实参对形参进展取代。实参个数与形参个数不同时,多余的实参没有作用,缺少的实参则用空格代替。取代时,不进展有效性等检查。5.7;宏汇编的特点是在汇编阶段进展语句展开,无需返回,不减少目标程序代码,执行速度没有改变;通过形参、实参结合传递参数。宏汇编适合于程序段较短或要求执行速度快的场合。子程序在执行阶段需要由主程序执行调用指令CALL进展调用,进而转入子程序执行,子程序执行完毕执行返回指令RET返回主程序。子程序如果被屡次使用,则会减少目标程序代码;主程序与子程序之间主要采用存放器、存储单元、堆栈等传递参数。子程序适合于程序段较长或为减少目标代码的场合。5.9;shrotwordptr[b*],4,ror

1

pushc*

1

movcl,4

1

rorwordptr[b*],cl

1

popc*5.10;ogical

macrolcode,dopd,sopd

lcodedopd,sopd

endm

例如,如果使用"anda*,[b*]〞指令,可以利用该宏定义,写出宏指令如下:

logicaland,a*,[b*]

初看起来,这个问题似乎比拟难解决。实际上,这4条逻辑指令都具有一样的指令操作数格式,所以可以归纳为如上宏定义。5.12;move

MACROdoprnd,soprnd

pusha*

mova*,soprnd

movdoprnd,a*

popa*

ENDM第五章(02)5.13;解答movstr

strN,dstr,sstr

leasi,sstr

leadi,dstr

movc*,strN

cld

repmovsb

endm5.14;①ABSDIFPl,P2,DISTANCE

②ABSDIF[B*],[SI],[DI]

1

pusha*

答:1

pusha*

1

mova*,P1

1

mova*,[b*]

1

suba*,P2

1

suba*,[si]

1

cmpa*,0

1

cmpa*,0

1

jge""0000

1

jge""0000

1

nega*

1

nega*

1

""0000

1

""0000

1

movDISTANCE,a*

1

mov[di],a*

1popa*

1popa*5.15;wtemp

=2

repeat100

dw0

dwwtemp

wtemp

=wtemp+2

endm5.18;DOS21H

MACROcallnum,calladdress

movah,callnum

ifnb

movd*,calladdress

endif

int21h

ENDM5.22;1.编写主程序,并进展汇编产生OBJ模块;2.编写独立的子程序,也进展汇编产生OBJ模块;3.分别编写主程序与子程序时,需要处理好共用变量、过程、逻辑段属性、参数传递等问题;4.利用连接程序将主程序模块和子程序模块连接起来,形成完整的可执行程序。5.28;;数据段

tabledw2277,2138,1808,1709,1522,1356,1208,1139

;对应中音1~7和高音i的定时器记数值

;代码段

moval,0b6h

;设置定时器2工作方式

out43h,al

again:movah,1

;等待按键

int21h

cmpal,’1’

;判断是否为数字1~8

ne*t

cmpal,’8’

jane*t

subal,30h

;1~8的ASCII码转换为二进制数

subal,1

;再减1,将数字1~8变为0~7,以便查表

*orah,ah

shla*,1

;乘以2

movb*,a*

;记数值表是16位数据,无法采用*lat指令

mova*,table[b*]

;取出对应的记数值

out42h,al

;设置定时器2的记数值

moval,ah

out42h,al

inal,61h

;翻开扬声器声音

oral,03h

;使D1D0=PB1PB0=11b,其他位不变

out61h,al

jmpagain

;连续发声,直到按下另一个键

ne*t:pusha*

inal,61h

;不是数字1~8,则关闭扬声器声音

andal,0fch

;使D1D0=PB1PB0=00b,其他位不变

out61h,al

popa*

cmpal,1bh

;判断是否为ESC键〔对应ASCII码1bh〕

jneagain

;不是ESC,继续;否则程序执行完毕1.〔1〕立即寻址

没有

〔2〕直接寻址

7237H〔3〕使用B*的存放器寻址

没有

〔4〕使用B*的间接寻址

637DH〔5〕使用B*的存放器相对寻址

0D5F0H(6)

基址变址寻址

8E18H〔7〕相对基址变址

004FH2。根据以下要求,写出相应的汇编指令。〔1〕ADD

D*,B*

(2)

ADD

AL,[B*][SI]

(3)

ADD

[B*][0B2H],

C*

(4)

MOV

A*,2A59H

ADD

[0524H]

,A*(5)

ADD

AL

,0B5H

3。〔1〕存放器间接寻址

MOV

B*,OFFSET

BLOCKADD

B*,OAH

MOV

D*

,[B*]〔2〕存放器相对寻址

MOV

B*,0AH

MOV

D*,BLOCK[B*](3)基址变址寻址MOV

B*

,

OFFSET

BLOCK

MOV

SI,OAHMOV

D*,[B*][SI]

4。现有〔DS〕=2000H,(B*)=0100H,(SI)=0002H,(20210)=12H,(20211)=34H,(20212)=56H,(20213)=78H,(21200)=2AH,(20211)=4CH,(21202)=B7H,(21203)=65H,试说明以下各条指令执行完后,A*存放器的内容。〔1〕MOV

A*,1200H

1200H

(2)

MOV

A*,B*

0100H

(3)

MOV

A*,[1200]

4C2AH

〔4〕MOV

A*,[B*]

3412H

〔5〕MOV

1100[B*]

4C2AH

(6)

MOV

A*,[B*][SI]

7856H

(7)

MOV

A*,1100[B*][SI]

65B7H

5。〔1〕

7CD9H

(2)

〔212A0+1200〕H=0600H

(3)

〔212A0H+1200H+5119H〕H=098AH6。

MOV

B*,2000H

LES

B*,[2000]

LES

DI

,[B*]

MOV

A*,ES:[B*]

MOV

A*,

ES:DI

7。转向地址OBJ的值分别为:〔1〕064DH

(2)0691H

(3)05ECH

注意有符号数的符号位~~8。〔1〕

MOV

A*,0ABH

立即数寻址无物理地址〔2〕MOV

A*,B*存放器寻址

同上〔3〕MOV

A*,[100]

直接寻址

20210H〔4〕MOV

A*,VAL

直接寻址

20050H(5)

MOV

A*,[B*]

存放器间接寻址

20210H(6)

MOV

A*,ES:[B*]

直接寻址

21100H(7)

MOV

A*,[BP]

存放器间接寻址

20010H〔8〕MOV

A*,[SI]

同上

200A0H

(9)

MOV

A*,[B*+10]

存放器相对寻址

20210H〔10〕MOV

A*,VAL[B*]

同上20210H

(11)

MOV

A*,[B*][SI]

基址变址寻址201A0H

(12)

MOV

A*,VAL[B*][SI]

相对基相变址寻址201F0H

9。〔1〕的指令:

MOV

A*,

[B*][0CH]

MOV

ZREO

,A*

(2)

的指令:

MOV

A*,ARRAY[B*]

MOV

ZREO,A*10。

MOV

A*,TABLE是把符号地址TABLE里的内容送到A*里,指令执行完后,(A*)=1234H

LEA

A*,TABLE

是把符号地址TABLE

的有效地址〔这里是偏移量〕送到指定存放器A*里,指令执行完后,〔A*〕=0032H11。执行完指令后,〔A*〕=1E00H12。

LEA

A*,CSTRING

MOV

DL,A*

MOV

DH,[A*+6]13。这个嘛不想做了

,麻烦啊~14。LES

B*,[2000]

MOV

A*,ES:[B*]

注意:一开场我写的是:

MOV

A*,ES:[8000H],后来看到题目里要求写两条指令,所以一条就不行了,就要画蛇添足~~~

15。

运算结果

SF,ZF,CF,OF各位的值〔从左至右依次往下~〕〔1〕

74D4H

0

0

0

0

(2)

A5C1H

1

0

0

1

(3)

4240

H

0

0

1

0

(4)

0000

H

0

1

1

0

16。

接上表(1)

5D14

0

0

0

0(2)

A870

1

0

0

1(3)

D870

1

0

0

0(4)

34E4

0

0

1

017。(1).MOV

A*,Z

;把Z送到A*

SUB

A*,*

;Z-*

ADD

A*,W

;W+(Z-*)

MOV

Z,A*

;结果保存在Z中(2).

MOV

A*,R

;R送到A*中

ADD

A*,9

;R+9

MOV

B*,*

;*送到B*中

ADD

B*,6

;*+6

ADD

A*,B*

;〔R+9〕+(*+6),结果保存在A*中

MOV

B*,W

W送到B*中

SUB

B*,A*

W-〔R+9〕-(*+6),连续减去两个数,相当于减去这两个数的和~~

MOV

Z,B*

;最终结果送到Z中(3)MOV

A*,W

;把W送到A*IMUL

*

;W**

注意:低十六位保存在A*里,高十六位保存在D*里MOV

B*,Y

;把Y送到B*

里ADD

B*,6

;Y+6IDIV

B*

;〔W**〕/(Y+6)

注意:商保存在A*里,余数保存在D*里MOV

Z,A*

;把商送到Z中,MOV

R,D*

;把余数

送到R中(4)MOV

A*,W

;把W送到A*中SUB

A*,*

;W-*CWD

;把A*中的十六位带符号数扩展成为32位,低十六位保存在A*中,高十六位保存在D*中

MOV

B*,5

;把5送到B*中IDIV

B*

;〔W-*〕/5

被除数为32位,除数为16位

商为16位

IMUL

Y

;上一步结果再乖以Y,积为32位MOV

B*,2

;把2送到B*中

IMUL

B*

;上一步乘法所得的积再乘以2,各为64位MOV

Z,EA*

;把结果中低32位放入Z双字单元中MOV

[Z+4],ED*

;把结果中高32位放入Z+4双字单元中

18。指令本条指令执行完后A*的内容

执行完后CF,SF,ZF的值MOV

A*,1234H

1234H

0

0

0MOV

CL,4

1234H

0

0

0

ROL

A*,CL

2341H

1

0

0DEC

A*

2340H

1

0

0

MOV

C*,42340H

1

0

0

MUL

C*

8918H

0

0

0INT

20H

程序完毕后,〔A*〕=8918H

(D*)=0000H19。指令

执行完后A*的内容执行完后CF

,SF,ZF和OF的值MOV

A*,0

0

0010DEC

A*

FFFFH

0100ADD

A*,7FFFH

7FFEH

0000ADD

A*,2

8000H

0101NOT

A*

7FFFH

0101

SUB

A*,0FFFFH

8000H

1101ADD

A*,8000H

0000H

1011SUB

A*,1

FFFFH

1101

AND

A*,58D1H

58D1H

0000

SAL

A*,1

B1A2H

0101SAR

A*,1

D8D1H

0100NEG

A*

272FH

1000

ROR

A*,1

9397H

1001

20。〔1〕MOV

A*,DATA*

ADD

DATAY,A*〔2〕MOV

A*,DATA*

ADD

DATAY,A*

MOV

A*,[DATA*+2]

ADD

[DATAY+2]

,A*〔3〕本組指令的作用是:B*

<------[DATA*]+[DATAY]+[1](CF的值)

帶進位加法~

〔4〕MOV

A*,DATA*

MUL

DATAY

;結果的高十六位保存在D*裏,低十六位保存在A*裏

〔5〕MOV

A*,DATA*

MOV

D*,[DATA*+2]

MUL

DWORD

DATAY

;結果的高三十二位保存在ED*裏,低三十二位保存在EA*裏;這裏所用的DWORD為一屬性操作符,在第四章會學到~~

〔6〕MOV

A*,DATA*

DIV

17H

;結果商保存在AL中,余數在AH中

〔7〕MOV

A*,DATA*

CDW

DIV

DATAY

21。NEG

D*

NEG

A*

SBB

D*,022。MOV

A*,A

;把雙字長數的低字放到A*中MOV

D*,[A+2]

;把雙字長數的高字放到D*中TEST

D*,8000H

;測試雙字長數的符號JZ

RIGHT

;如果是非負數,則直接保存NEG

D*

;如果是負數,則求補NEG

A*SBB

D*,0

RIGHT:

MOV

B

,A*

MOV

[B+2],D*1。指令以下指令的错误〔1〕

MOV

AH,B*

源操作数与目的操作数长度不一样~〔2〕

MOV

[B*],[SI]

这是两个内存单元在传递数据,而这在汇编语言中是不允许的~~~

(3)

MOV

A*,[SI][DI]

不能用两个变址连用,其中一个应为基址~〔4〕

MOV

MYDAT[B*][SI],ES:A*

同〔2〕〔5〕

MOV

BYTE

PTR[B*],1000

必须有一个为存放器〔6〕MOV

B*,OFFSET

MYDAT[SI]

OFFSET

不能与复杂操作数相连~〔7〕MOV

CS,A*

不能对CS赋值~〔8〕MOV

EC*,A*

操作数类型不同~2。〔1〕合法

〔2〕非法

〔3〕非法

〔4〕非法3。〔1〕非法,操作数类型不同

〔2〕合法

〔3〕非法,不允许两个内存单元直接传递数据,你把人家CPU放哪了?~~~呵~

〔4〕合法~

〔5〕合法~

〔6〕合法

〔7〕

非法~,必须有一个存放器~~把CPU放哪了?~~

〔8〕非法,两个内存单元地址相加没有意义~

〔9〕合法

〔10〕非法,同〔3〕

4。〔1〕两内存单元传递数据

〔2〕操作数类型不同

〔3〕跳转指令只能跳转到符号地址

〔4〕转移指令后不能为变量,只能为标号

〔5〕格式不对,

应为

NEAR

PTR

。。。5。图,就不画了~~6。〔1〕DW

5150H〔2〕MOV

A*,5150H

MOV

ADDRESS

,A*等,写出几个就可以~~7。DATASG

SEGMENT

FLD1B

DB

'personal

puter'

FLD2B

DB

10

DUP

(32)

FLD3B

DB

20H

FLD4B

DB

01011001B

FLD5B

DB

'32654'

FLD6B

DB

10

DUP

(0)

FLD7B

DB

'PART1',DUP

20

("),'PART2',DUP

50

("),'PART3',DUP

14

(")FLD1W

DW

0FFF0HFLD2W

DW

01011001BFLD3W

DW

FLD7BFLD4W

DW

5,6,7,8,9FLD5W

DW

5

DUP

〔0〕FLD6W

DW

〔FLD6W-FLD1W〕-〔FLD7B-FLD1B〕8。PLENTH

的值为22,GE表示该数据段的长度~9。L的值为710。〔1〕MOV

A*,OFFSET

LNAME

〔2〕MOV

SI,WORD

PTR

CODE_LIST

〔3〕CODE_LENGHT

EQU

$-CODE_LIST11。代码如下:DATA_SEG

SEGMENT

DB

5

DATA_LIST

DW

0FFFFH,0,2,5,4,

5

DUP

(")DATA_SEG

ENDSCODE_SEG

SEGMENTASSUME

CS:CODE_SEG,DS:DATA_SEGMOV

A*,5MOV

MA*,A*MOV

A*,0FFFFHMOV

MIN,A*

CODE_SEG

ENDS12。〔1〕10025

〔2〕19

〔3〕2548

〔4〕3

〔5〕103

〔6〕0FFFFH

〔7〕1

〔8〕3

13。分别汇编成为:MOV

A*,0AHMOV

BL,0AHMOV

CL,114。〔1〕〔A*〕=1

〔2〕〔A*〕=2

〔3〕〔C*〕=14H

〔4〕〔D*〕=32H

〔5〕〔C*〕=1]15。〔1〕操作符错误

改为:

DATA_SEG

SEGMENT

(2)缺少段名

在前面加个段名

〔3〕引用应该从;开场

把那个"/〞改成";〞

〔4〕构造混乱

改为:

MAIN_PROC

PROC

FAR

。。。。MAIN_PROC

ENDPEND

16。程序

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论