29. 结构数据类型如何说明、结构变量如何定义、结构字段如何应用?(3.4)
30. 记录数据类型如何说明,记录变量如何定义,WIDTH和MASK操作符是什么作用?(3.4)
第四章 汇编语言程序设计 习题
1. 已知两个八位无符号数x和y,分别存放在BUF和BUF+1单元中,且x>y。请编程序计算x-y,结果
存回BUF单元。(4.1)
2. 已知DAT单元有一数x。现要求编程将x的低四位变为1010,最高位D7置为1,其它三位不变。
(4.1)
3. 已知有两个压缩BCD数BCD1和BCD2,其在内存存放形式为:
(BCD1)=34 (BCD1+1)=18 (BCD2)=89 (BCD2+1)=27
高位字节为高位数。要求编程将BCD1和BCD2相加,结果送BCD3开始的存储单元。(4.1) 4. DAT单元的内容拆成高、低各四位,然后分别存于DAT+1及DAT+2的低四位。(4.1)
5. 内存某一缓冲区中存放着十个单元的BCD码,每个单元中放两位BCD码(压缩BCD码)。要求把
它们分别转换为ASCII码。高位BCD码转换后放在高地址单元。(4.1)
6. 三个无符号数x,y,z,均小于等于255,分别存于DATA,DATA+1和DATA+2单元中。现要找出三个数
中数值大小居中的一个,并将其存入BUF单元中。(4.2)
7. 已知在DAT单元内有一带符号数x。试编一程序,根据x的具体情况进行如下处理:
若x为正奇数,则将x与BUF单元内容相加; 若x为正偶数,则将x与BUF单元内容相\与\; 若x为负奇数,则将x与BUF单元内容相\或\; 若x为负偶数,则将x与BUF单元内容相\异或\。
以上四种情况运算的结果都送回BUF单元。零作为正偶数处理。(4.2)
8. 累加器AL中有一字符,用ASCII码表示。当其为\时,程序转移到LPA处;如为\则转移到
LPB处;如为\则转移到LPE处,否则,均转向LPN处。(4.2) 9. 在DATA单元有一个二进制数x,要求编程完成运算:(4.2)
x+1 x>0 y=
x
x=0
x-1 x<0
10. 数组A和B,各有20个数据,它们均已按升序排放。现要求将这两个数组合并为一个数组C,且
要求其数据也按升序排放,试编程实现。(4.2)
11. 编一程序,要求将BUF单元开始的100个存储单元全部清零。若不知所清单元长度,只知以0FFH
作为结束标志,又该如何处理?(4.3)
12. 有一数据块,长度为100字节,存放于DAT开始的存储单元。要求将此数据块中的负数的个数统
计出来,并将统计结果存入MNUM单元中。(4.3)
13. 有一个由八位数组成的数列,长度为三字节,存放地址始于DAT单元。求此数列的算术和并存于
BUF和BUF+1单元。已知数列之和为十六位数。(4.3)
14. 从NUMB单元起有100个数,其值在0~100之间。试编程实现以下数据统计:
(1) 有多少个大于等于60的数?统计结果存于COUNT单元。 (2) 有多少个为100的数?统计结果存于COUNT+1单元。 (3) 有多少个为0的数?统计结果存于 COUNT+2单元。
(4) 当小于60的数超过十个,则结束统计,同时置COUNT单元为0FFH。(4.3)
15. 将ADAT单元起的100个字节数据,传送到BDAT开始的单元中去。已知数据区无覆盖问题,要求
用三种方法实现。(4.3)
16. 将BUF单元开始的50个字节数,区分出奇、偶数。将奇数在前,偶数在后,仍存回原数据区。(4.3) 17. 对A址起的30个字节长的字符串,删除其中的数字符,后续字符向前递补,剩余字符补空格字符,
编程实现。(4.3)
18. 已知有三个八位无符号数x,y,z,分别存放于NUMB,NUMB+1和NUMB+2单元。要求编一程序实现
2x+3y+5z,并要求将运算结果送RES单元和RES+1单元。(4.4)
19. 将两个八位无符号数乘法的程序编为一个子程序。被乘数、乘数和乘积存放于自NUB开始的四个
存储单元中。(4.4)
20. 将CSTRN起的50个字符的串,统计相同字符的字符数,找出相同字符数最多字符,存于CMORE单
元中。(4.4)
21. 宏定义体内不仅可以使用宏调用,也可以包含宏定义。以下宏定义:
其中MACNAM是内层的宏定义名,但又是外层宏定义的哑元,当调用DEFMAC时,就形成一个宏定义。写出宏调用:
DEFMAC ADDITION,ADD的宏展开。(4.5)
22. 用宏定义及重复伪操作把TAB,TAB+1,TAB+2,??,TAB+16的内容存入堆栈。(4.5) 23. 要求建立一个100D字的数组,其中每个字的内容是下一个字的地址,而最后一个字的内容是第一
个字的地址。(4.5)
24. 试定义宏指令MAX把三个变元中的最大值放在AX中,而且使变元数不同时产生不同的程序段。
(4.5)
25. 编一个程序模块完成轮流查询三个数据输入设备的功能。(4.6)
第五章 32位指令及其编程 习题
1. 试述什么是实模式、保护模式和虚拟8086方式?(5.1.1)
2. 在以BP、EBP、ESP作为基址寄存器访问存储器操作数时,其默认的段寄存器是______;但是,通
常ESP作为________,不应该将它用于其他目的。(5.1.1) 3. 为什么说32位通用寄存器比16位通用寄存器更通用?(5.1.1)
4. 32位指令新增了哪些超越指令前缀,代码为66H和67H的超越前缀是什么作用?(5.1.1) 5. 试述32位x86 CPU的标志寄存器EFLAGS相对于原来的16位FLAGS寄存器新增那些标志位,其说
明其含义。(5.1.1)
6. 试述16位存储器寻址与32位存储器寻址在计算有效地址上有哪些不同。(5.1.2) 7. 指出下列传送指令中源操作数的寻址方式。(5.1.2)
(1) MOV EBX,77665544H (2) MOV EAX,[5678H] (3) MOV EAX,[EBX+ESI+80H] (4) MOV EAX,[ESI*2] (5) MOV EAX,[EBX+ESI*8+80H]
8. 8086/8088处理器和80286后的处理器在对PUSH指令的处理上有什么不同?(5.2.1) 9. 试用一条LEA指令实现如下运算操作:
EAX<--EBX+ESI*2+1234H
能够保证该运算正确的条件是什么?(5.2.1) 10. 写指令从端口03FCH送一个双字到EAX寄存器。(5.2.1) 11. 说明下列指令的操作。(5.2.1)
(1) PUSH [BX] (2) PUSHAD
(3) PUSH 4 (4) POP ESI
12. 假设(EAX)= 00001000H,(EBX)= 00002000H,试问下列指令访问内存的有效地址是什么?(5.2.1)
(1) MOV ECX,[EAX+EBX] (2) MOV [EAX+2*EBX],CL (3) MOV DH,[EBX+4*EAX+1000H] 13. 说明下面两条指令是否正确。(5.2.2)
(1) ADD ECX,AX (2) MOV AX,[EBX,ECX]
14. 说明指令IMUL BX,DX,100H完成的操作。(5.2.2)
15. 写一个程序段,求EAX、EBX、ECX的和。若有进位则将1存入EDX;否则EDX存入0,EAX为累加
和。(5.2.2)
16. 指出下列指令序列执行完后目的寄存器的内容。(5.2.2)
(1) MOV EAX,299FF94H ADD EAX,34FFFFH (2) MOV EAX,39393834H AND EAX,0F0F0F0FH
17. 要求将EAX中的第0,1位取反,用什么指令?(5.2.3)
18. 如(EAX)= 00001122H,(EBX)= 00003344H,要求把它们装配在一起形成
(EAX)= 11223344H,试编程实现。(5.2.3)
19. 在实方式下(16位段)编程序段,把长度为CX字节的数据块从DS:SI指定的源存储区搬到ES:
DI指定的目的存储区。(5.2.4) 20. JECXZ指令什么条件下转移?(5.2.5)
作业题答案
第一章 计算机系统概述 习题答案
1、计算机系统分为硬件和软件两大部分。硬件包括:运算器、控制器、存储器、输入设备、输出设备五个主要组成部分。软件分为系统软件和应用软件。
2、 (1)汇编语言与处理器密切相关。每种处理器都有自己的指令系统,相应的汇编语言各不相同。所以,汇编语言程序的通用性、可移植性较差。
(2)汇编语言功能有限,又涉及寄存器、主存单元等硬件细节,所以编写程序比较繁琐,调试起来也比较困难。
(3)汇编语言本质上就是机器语言,它可以直接地、有效地控制计算机硬件,因而容易产生运行速度快、指令序列短小的高效率目标程序。
3、 (1)1,0111,0001B 171H (2)10,0111,0001,0000B 2710H (3)1111,1111,1111B FFFH (4)111,1111,1111,1111B 7FFFH 4、 (1)2DH 45D (2)80H 128D
(3)FFFFH 65535D (4)FFH 255D
5、 (1)1111,1010B 250D (2)101,1011B 91D
(3)1111,1111,1111,1110B 65534D (4)1,0010,0011,0100B 4660D 6、 (1)将A、B、C均转换为十进制数,则 A=0.101B=1*2-1+1*2-3=0.5+0.125=0.625D B=0.101D
C=0.101H=1*16-1+1*16-3=0.0625+0.0002=0.0627D 由此可得A最大C最小。
(2)将A、B、C均转换为十进制数,则 A=1011B=1*23+1*21+1=8+2+1=11D B=1011D
C=1011H=1*163+1*16+1=4096+16+1=4113D 由此可得C最大A最小。
7、 (1)0001,0010 (2)0010,0100 (3)0110,1000 (4)0001,0010,0111 (5)0001,0010,1000 (6)0010,0101,0101
(7)0001,0010,0011,0100 (8)0010,0100,0101,1000 8、 (1)91 (2)89 (3)36 (4)90 (5)08 (6)97 (7)81 (8)02 9、466F72206578616D706C6527
746869732069732061206E756D62657220333639322E 10、 (1)表示的十进制数为79D,字符为\。 (2)表示的十进制数为43D,字符为\+\。 (3)表示的十进制数为115D,字符为\。 (4)表示的十进制数为89D,字符为\。 11、 (1)D8=1101,1000B
当其为用补码表示的带符号数时,表示的十进制数是-40D。 当其为无符号数时,表示的十进制数是216D。 (2)FFH=1111,1111B
当其为用补码表示的带符号数时,表示的十进制数是-1D。 当其为无符号数时,表示的十进制数是255D。 12、当看作是无符号数时,对应的十进制真值是182D。 当看作是原码表示的带符号数时,对应的十进制真值是-54D。 当看作是补码表示的带符号数时,对应的十进制真值是-74D。
13、 (1)原码:0000,0000B 反码:0000,0000B 补码:0000,0000B (2)原码:1111,1111B 反码:1000,0000B 补码:1000,0001B (3)原码:0111,1111B 反码:0111,1111B 补码:0111,1111B (4)原码:1011,1001B 反码:1100,0110B 补码:1100,0111B (5)原码:0111,1110B 反码:0111,1110B 补码:0111,1110B (6)原码:1111,1110B 反码:1000,0001B 补码:1000,0010B (7)原码:0100,0100B 反码:0100,0100B 补码:0100,0100B 14、如果认为是无符号数,它是十进制数97。 如果认为是BCD码,表示十进制数61。 如果认为是ASCII码,代表字符\。
15、 (1)1111,0001B (2)1,0010,1110,0011B