微机原理与接口技术课后习题答案郭兰英文档格式.docx

上传人:b****6 文档编号:18158059 上传时间:2022-12-13 格式:DOCX 页数:37 大小:156.72KB
下载 相关 举报
微机原理与接口技术课后习题答案郭兰英文档格式.docx_第1页
第1页 / 共37页
微机原理与接口技术课后习题答案郭兰英文档格式.docx_第2页
第2页 / 共37页
微机原理与接口技术课后习题答案郭兰英文档格式.docx_第3页
第3页 / 共37页
微机原理与接口技术课后习题答案郭兰英文档格式.docx_第4页
第4页 / 共37页
微机原理与接口技术课后习题答案郭兰英文档格式.docx_第5页
第5页 / 共37页
点击查看更多>>
下载资源
资源描述

微机原理与接口技术课后习题答案郭兰英文档格式.docx

《微机原理与接口技术课后习题答案郭兰英文档格式.docx》由会员分享,可在线阅读,更多相关《微机原理与接口技术课后习题答案郭兰英文档格式.docx(37页珍藏版)》请在冰豆网上搜索。

微机原理与接口技术课后习题答案郭兰英文档格式.docx

(1)

(2)

(3)

原码反码补码

+3700100101/25H00100101/25H00100101/25H

-37/A5H/DAH/DBH

+37

-37

16位

32位

0025H

00000025H

FF5BH

FFFFFF5BH

无符号数:

70D

补码有符号数:

BCD码:

46D

ASCII:

F

1)、相加后假设显现和大于9,那么将和减去10后再向高位进1

2)、假设显现组间进位,那么将低位加6

详见讲义16页。

C3402000

50

50H

十进制值

80

二进制

十六进制

00110010B

32H

01010000B

D:

44H

d:

64H

CR:

0DH

LF:

0AH

0:

30H

SP:

20H

NUL:

00H

国标码:

3650H

机内码:

B6B0H

第3章

(1)完整的汇编语言源程序由段组成

(2)一个汇编语言源程序能够包括假设干个代码段、数据段、附加段或堆栈段,段与段之间的顺序可随意排列

(3)需独立运行的程序必需包括一个代码段,并指示程序执行的起始点,一个程序只有一个起始点

(4)所有的可执行性语句必需位于某一个代码段内,说明性语句可依照需要位于任一段内

(5)通常,程序还需要一个堆栈段

存储模式

特点

TINY

COM类型程序,只有一个小于64KB的逻辑段(MASM支持)

SMALL

小应用程序,只有一个代码段和一个数据段(含堆栈段),每段不大于64KB

COMPACT

代码少、数据多的程序,只有一个代码段,但有多个数据段

MEDIUM

代码多、数据少的程序,可有多个代码段,只有一个数据段

LARGE

大应用程序,可有多个代码段和多个数据段(静态数据小于64KB)

HUGE

更大应用程序,可有多个代码段和多个数据段(对静态数据没有限制)

FLAT

32位应用程序,运行在32位80x86CPU和Windows9x或NT环境

开始位置:

用标号指明

返回DOS:

利用DOS功能挪用的4CH子功能来实现

汇编停止:

执行到一条END伪指令时,停止汇编

段定位、段组合和段类型。

stacksegmentstack

db1024(0)

stackends

datasegment

stringdb'

Hello,Assembly!

'

,0dH,0aH,‘$’

dataends

codesegment'

code'

assumecs:

code,ds:

data,ss:

stack

start:

movdx,offsetstring

movah,9

int21h

codeends

endstart

(1).EXE程序

程序能够有多个代码段和多个数据段,程序长度能够超过64KB

通常生成EXE结构的可执行程序

(2).COM程序

只有一个逻辑段,程序长度不超过64KB

需要知足必然条件才能生成COM结构的可执行程序(MASM需要采纳TINY模式)

符号概念伪指令有“等价EQU”和“等号=”:

符号名EQU数值表达式

符号名EQU<

字符串>

符号名=数值表达式

EQU用于数值等价时不能重复概念符号名,但“=”许诺有重复赋值。

例如:

X=7;

等效于:

Xequ7

X=X+5;

“XEQUX+5”是错误的

(1)al=67h

(2)ax=133h,dx=4h

(3)ax=0230h

(4)al=41h

(4)ax=7654h

(1)

41h

42h

43h

10

10h

45h

46h

-1

?

4

00h

0fbh

0ffh

.data

my1bdb'

PersonalComputer'

my2bdb20

my3bdb14h

my4bdb00010100b

my5wdw20dup(?

my6c=100

my7c=<

>

利用定位伪指令操纵,如org,even,align

包括逻辑地址和类型两种属性。

数据段

org100h

varwdw1234h,5678h

varbdb3,4

vardddh

buffdd10dup(?

messdb'

Hello'

代码段

movax,offsetvarb+offsetmess

movax,typebuff+typemess+typevard

movax,sizeofvarw+sizeofbuff+sizeofmess

movax,lengthofvarw+lengthofvard

(1)1000超过一个字节所能表达的最大整数

(2)SI应为偶数

(3)两个内存单元不能直接运算

(4)应改成[al+1]

(5)条件转移指令后面应接标号,而不是变量

movah,1;

只允许输入小写字母

int21h

subal,20h;

转换为大写字母

movdl,al

movah,2

int21h;

显示

movbx,offsetLEDtable

moval,lednum

xlat

movax,bufX

cmpax,bufY

jaedone

movax,bufY

done:

movbufZ,ax

.modelsmall

.stack

.data

bufXdw-7

signXdb?

.code

.startup

cmpbufX,0;

testbufX,80h

jlnext;

jnznext

movsignX,0

jmpdone

next:

movsignX,-1

.exit0

end

movdl,’2’

movax,bufX

cmpax,bufY

jenext1

decdl

next1:

cmpax,bufZ

jenext2

next2:

;

moval,number

movbx,0;

BX←记录为1的位数

restart:

cmpal,0;

AL=0结束

jzdone

again:

shral,1;

最低位右移进入CF

jcnext;

为1,转移

incbx;

不为1,继续

jmpagain

pushax

pushbx

shlbx,1;

位数乘以2(偏移地址要用2个字节单元)

jmpaddrs[bx];

间接转移:

IP←[table+BX]

以下是各个处置程序段

fun0:

movdl,'

0'

jmpdisp

fun1:

1'

fun2:

2'

fun3:

3'

fun4:

4'

fun5:

5'

fun6:

6'

fun7:

7'

disp:

movah,2;

显示一个字符

popbx

popax

jmprestart

编制程序完成12H、45H、0F3H、6AH、20H、0FEH、90H、0C8H、57H和34H等10个字节数据之和,并将结果存入字节变量SUM中(不考虑溢出和进位)。

b_datadb12h,45h,0f3h,6ah,20h,0feh,90h,0c8h,57h,34h;

原始数据

numequ10;

数据个数

sumdb?

预留结果单元

xorsi,si;

位移量清零

xoral,al;

取第一个数

movcx,num;

累加次数

addal,b_data[si];

累加

incsi;

指向下一个数

loopagain;

如未完,继续累加

movsum,al;

完了,存结果

求主存0040h:

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

;

start:

movax,0040h;

送段地址

movds,ax

movsi,0;

偏移地址

movcx,si;

计数(循环次数)

xorax,ax;

空格计数器清零

cmpbyteptr[si],20h;

与空格的ASCII码比较

jnenext;

不是空格,转

incax;

是空格,空格数加1

修改地址指针

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

endstart

编写计算100个16位正整数之和的程序。

若是和不超过16位字的范围(65535),那么保留其和到wordsum,如超过那么显示‘overflow’。

答:

countequ100

parraydwcountdup(?

);

假设有100个数据

wordsumdw0

msgdb‘overflow’,’$’

movcx,count

movax,0

movbx,offsetparray

addax,[bx]

jncnext

movdx,offsetmsg

movah,9

显示溢出信息

jmpdone;

然后,跳出循环体

addbx,2

loopagain

movwordsum,ax

编程把—个16位无符号二进制数转换成为用8421BCD码表示的5位十进制数。

转换算法能够是:

用二进制数除以10000,商为“万位”,再用余数除以1000,取得“千位”;

依次用余数除以l00、10和l,取得“百位”、“十位”和“个位”。

.modelsmall

.stack256

.data

arraydw?

源字数据

dbcddb5dup(?

五位bcd结果,高对高低对低

.code

.startup

movdx,array;

取源数据(余数)

movbx,10000;

除数

movcx,10;

除数系数

movsi,4;

目的数据高位位移量

movax,dx;

中存放被除数

movdx,0

divbx;

除于bx,商ax,余数dx

movdbcd[si],al;

商<10,存结果

pushdx;

暂存余数

movax,bx;

除数除于10

movdx,0

divcx;

除于cx,商ax、余数0存在dx

movbx,ax;

bx是除数

popdx

decsi;

目的数据位移量减1

jnzagain

movdbcd,dl;

存个位数(<

10)

(1)汇编语言中,子程序要用一对进程伪指令PROC和ENDP声明,格式如下:

进程名PROC[NEAR|FAR]

……;

进程体

进程名ENDP

(2)爱惜用到的寄放器内容,以便子程序返回时进行相应的恢复。

(3)改错:

crazyproc

pishbx

pushcx

xorax,ax

xordx,dx

again:

adda,[bx]

adcdx,0

incbx

loopagain

popcx

popbx

解(不需挪用HTOASC子程序):

movah,1

cmpal,1bh;

ESC的ASCII码是1bh

jedone

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

解答:

asctobproc

pushcx

anddh,0fh;

先转换十位数

shldh,1;

十位数乘以10(采用移位指令)

movch,dh

shldh,1

adddh,ch

anddl,0fh;

转换个位数

adddh,dl;

十位数加个位数

moval,dh;

设置出口参数

popcx

ret

asctobendp

DIPASCproc;

入口参数:

AL=要显示的一个16进制数

pushdx

movcl,4;

转换高位

shral,cl

callHTOASC

movdl,al;

popax;

转换低位

movdl,’H’;

显示一个字母“H”

DIPASCendp

HTOASCproc;

将AL低4位表达的一位16进制数转换为ASCII码

andal,0fh

cmpal,9

jbehtoasc1

addal,37h;

是0AH~0FH,加37H转换为ASCII码

ret;

子程序返回

htoasc1:

addal,30h;

是0~9,加30H转换为ASCII码

HTOASCendp

lucaseproc

movbx,offsetstring

cmpal,0

jecase0

cmpal,1

jzcase1

cmpal,2

jzcase2

case0:

cmpbyteptr[bx],0

cmpbyteptr[bx],’A’

jbnext0

cmpbyteptr[bx],’Z’

janext0

addbyteptr[bx],20h

next0:

incbx

jmpcase0

case1:

cmpbyteptr[bx],’a’

jbnext1

cmpbyteptr[bx],’z’

janext1

subbyteptr[bx],20h

jmpcase1

case2:

jbnext2

janext20

jmpnext2

next20:

janext2

jmpcase2

lucaseendp

(1)用寄放器传递参数:

最简单和经常使用的参数传递方式是通过寄放器,只要把参数存于约定的寄放器中就能够够了

由于通用寄放器个数有限,这种方式对少量数据能够直接传递数值,而对大量数据只能传递地址

采纳寄放器传递参数,注意带有出口参数的寄放器不能爱惜和恢复,带有入口参数的寄放器能够爱惜、也能够不爱惜,但最好能够维持一致

(2)用共享变量传递参数

子程序和主程序利用同一个变量名存取数据确实是利用共享变量(全局变量)进行参数传递

若是变量概念和利用不在同一个源程序中,需要利用PUBLIC、EXTREN声明

若是主程序还要利用原先的变量值,那么需要爱惜和恢复

利用共享变量传递参数,子程序的通用性较差,但专门适合在多个程序段间、尤其在不同的程序模块间传递数据

(3)用堆栈传递参数

参数传递还能够通过堆栈那个临时存储区。

主程序将入口参数压入堆栈,子程序从堆栈中掏出参数;

子程序将出口参数压入堆栈,主程序弹出堆栈取得它们

采纳堆栈传递参数是程式化的,它是编译程序处置参数传递、和汇编语言与高级语言混合编程时的常规方式

方式:

注意:

压栈与弹栈必需要一一对应。

方式1:

neg32proc;

=32位有符号数

negax;

实现0-功能

negdx

sbbdx,0;

这条指令也可以用decdx代替

neg32endp;

出口参数:

=32位有符号数的补码

方式2:

notax;

实现求反加1

notdx

addax,1

adcdx,0

arraydb12h,25h,0f0h,0a3h,3,68h,71h,0cah,0ffh,90h;

数组

countequ$-array;

数组元素个数

resultdb?

校验和

movbx,offsetarray;

BX←数组的偏移地址

movcx,count;

CX←数组的元素个数

callchecksum;

挪用求和进程

movresult,al;

处置出口参数

movax,4c00h

计算字节校验和的通用进程

DS:

BX=数组的段地址:

偏移地址,CX=元素个数

AL=校验和

说明:

除AX/BX/CX外,不阻碍其他寄放器

checksumproc

xoral,al;

累加器清0

sum:

addal,[bx];

求和

指向下一个字节

loopsum

checksumendp

wdatadw34abh

movax,wdata

calldispa

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

当前位置:首页 > 高等教育 > 文学

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

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