微机原理与接口技术课后习题答案郭兰英文档格式.docx
- 文档编号:18158059
- 上传时间:2022-12-13
- 格式:DOCX
- 页数:37
- 大小:156.72KB
微机原理与接口技术课后习题答案郭兰英文档格式.docx
《微机原理与接口技术课后习题答案郭兰英文档格式.docx》由会员分享,可在线阅读,更多相关《微机原理与接口技术课后习题答案郭兰英文档格式.docx(37页珍藏版)》请在冰豆网上搜索。
(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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 微机 原理 接口 技术 课后 习题 答案 郭兰英
![提示](https://static.bdocx.com/images/bang_tan.gif)