newplan

阿基米德在洗澡時發現浮力原理,高興得來不及穿㆖褲子,跑到街㆖大喊:Eureka(我找到了)。
posts - 39, comments - 26, trackbacks - 0, articles - 4
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

汇编习题答案精心收集

Posted on 2007-11-19 19:10 山泉弯延 阅读(14489) 评论(1)  编辑 收藏 引用
这是 http://222.34.36.100/longrange/%E6%B1%87%E7%BC%96%E8%AF%AD%E8%A8%80.doc 的 HTML 档。
G o o g l e 在网路漫游时会自动将档案转换成 HTML 网页来储存。
请使用网址 http://www.google.com/search?q=cache:HLwqrGxAqr0J:222.34.36.100/longrange/%E6%B1%87%E7%BC%96%E8%AF%AD%E8%A8%80.doc+%E6%B1%87%E7%BC%96%E5%86%99%E4%B8%80%E6%9D%A1%E4%BD%8D%E6%93%8D%E4%BD%9C%E4%BD%BF+%E7%AD%89%E4%BA%8E%E5%AE%9E%E9%99%85%E9%95%BF%E5%BA%A6&hl=zh-CN&ct=clnk&cd=4&gl=cn&st_usg=ALhdy28Qe3-eJfzKKP9oI4ELwCfo4O7KzA 链接此页或将其做成书签。


Google 和网页作者无关,不对网页的内容负责。
这些搜索字词都已标明如下:  汇编  写  一条  位  操作  使  等于  实际  长度 

汇编语言程序设计》复习重点

一、汇编语言基础知识(6学时)

1.1 计算机系统概述 (1) 
 1.1.1 计算机硬件 
 1.1.2 计算机软件 
 1.1.3 计算机的程序设计语言 
1.2 计算机数据表示 (2) 
 1.2.1 数制 
    二进制 
    十六进制 
    二进制、十六进制之间的转换 
    二进制、十六进制转换为十进制 
    十进制转换成二进制、十六进制 
 1.2.2 编码 (3) 
    BCD码  
    ASCII码 
    汉字编码 
 1.2.3 有符号数的表示法 
    原码 
    反码 
    补码 
 1.2.4 二进制运算 
    算术运算 
    逻辑运算 
1.3 Intel 80x86系列微处理器 (4) 
  Intel x86系列CPU的发展过程 
  8086基本情况 
  80286 
  80386 
  80486 
  Pentium 
  PentiumMMX 
  Pentium II 
  Celeron(赛扬) 
  Pentium III 
1.4 IBM系列微型计算机系统 (5) 
  PC 机硬件 
  PC机存储器 
  DOS下的汇编语言软件 
  DOS下的汇编语言文件 
  将一个Hello World程序用EDIT录入,编译,连接并执行。 (6) 
  用DEBUG列出8086寄存器,试用其他DEBUG命令。

二、8086指令系统(17学时)

2.1 8086寄存器组 (1) 
 2.1.1 8086的通用寄存器 
    数据寄存器 
    指针寄存器SP, BP 
    变址寄存器SI, DI 
 2.1.2 标志寄存器 
    例题:加法运算对标志的影响 
    例题:减法运算对标志的影响 
 2.1.3 存储器组织与段寄存器 (2) 
    存储器 
    存储器的分段 
2.2 8086的寻址方式 (3) 
 2.2.1 8086的机器代码格式 
 2.2.2 立即数寻址 
 2.2.3 寄存器寻址 
 2.2.4 存储器寻址 
    直接寻址 
    寄存器间接寻址 
    寄存器相对寻址 
    基址变址寻址 
    相对基址变址寻址  
 2.2.5 指令操作数的符号说明 (4) 
    通用符号 
    指令功能的符号描述 
    8086 CPU指令的分类 
2.3 数据传送类指令 
 2.3.1 通用数据传送指令 
    MOV 
    例题:容易出错的指令 
    XCHG (5) 
    XLAT 
 2.3.2 堆栈操作指令 
    PUSH / POP 
 2.3.3 标志传送指令 
    LAHF / SAHF 
    PUSHF / POPF  
 2.3.4 地址传送指令 
    LEA 
    LDS , LES 
 2.3.5 输入/输出指令 
    IN, OUT 
    例题:通过I/O指令控制PC机扬声器发声 
2.4 算术运算类指令 (6) 
  汇编语言中的数 
  8086指令可以进行的运算  
 2.4.1 二进制加 / 减指令 
    指令格式 
    ADD, ADC, SUB, SBB, CMP 
    操作数 
    数据类型 
    加减指令影响标志 
 2.4.2 单目标运算指令 
    INC, DEC, NEG 
    例题:单目标指令的运算结果及对标志的影响 
 2.4.3 乘指令 (7) 
    MUL - 无符号乘 
    IMUL - 有符号乘 
 2.4.4 除指令 
    DIV - 无符号除 
    IDIV - 有符号除 
 2.4.5 符号扩展指令 
    CBW, CWD 
    例题:乘除指令练习 (8) 
    2.4.6 十进制调整指令 
    压缩BCD码 
    DAA, DAS 
    非压缩BCD码 
    AAA, AAS, AAM, AAD 
    用DEBUG程序验证程序非压缩BCD除。 (9) 
2.5 操作类指令 (10) 
 2.5.1 逻辑运算指令  
    求反指令NOT 
    与、或和异或指令 
    AND, OR, XOR, TEST 
 2.5.2 位移指令  
    SHL, SHR, SAL, SAR, ROL, ROR, RCL, RCR 
    例题:运算练习 (11) 
    对标志的影响 
    例题:操作综合练习 
2.6 串操作类指令 (12) 
    MOVS - 串传送指令 
    STOS - 串读取指令 
    LODS - 串存储指令 
    CMPS - 串比较指令 
    SCAS - 串扫描指令 
    REP, REPZ, REPNZ - 重复前缀指令 
2.7 控制转移类指令 (13) 
 2.7.1 无条件转移指令 
    JMP 
    段内与段间转移 
    直接与间接转移 
 2.7.2 条件转移指令 
    Jcc 
    判断单个标志 
    用于无符号数比较 
    用于有符号数比较 
    例题:条件转移练习 
    JCXZ 
 2.7.3 循环指令 (14) 
    无条件循环指令 
    LOOP 
    条件循环指令 
    LOOPZ, LOOPNZ, JCXZ 
    例题:循环指令练习 
 2.7.4 子程序指令 (15) 
    子程序调用指令 
    CALL 
    RET 
 2.7.5 中断指令 (16) 
    8086中断类型 
    8086的中断过程 
    INT, IRET, INTO 
 2.7.6 系统功能调用 
    单个字符输出 
    字符串输出 
    单个字符输入 
    字符串输入 
    系统功能调用--简单的功能调用举例。 (17) 
2.8 处理机控制类指令 
 2.8.1 标志操作指令 
    CLC, STC, CMC 
    CLD, STD 
    CLI, STI 
 2.8.2 CPU控制指令 
    NOP 
    段前缀 CS:, ES:, DS:, SS: 
    LOCK, HLT, ESC, WAIT 
    综合练习

 
三、汇编语言程序格式(8学时)

3.1 汇编语言的开发过程 (1) 
 3.1.1 汇编语言程序的两种格式 
    语句格式 
    简化和完整的段定义初步 
3.1.2 宏汇编程序MASM的安装 
   开发环境和开发过程  
   EDIT, MASM, LINK, DEBUG 
   MASM 6.0的集成开发平台。 
   MASM 6.0的安装 
3.1.3 汇编程序的命令行开发过程 
   MASM 6.0的命令行操作方式 
3.1.4 汇编程序的集成开发过程 (2) 
   MASM 6.0的集成开发平台操作方式 
3.2 参数、变量和标号 (3) 
3.2.1 数值型参数 
   常数 
   数值表达式 
3.2.2 变量定义伪指令 (4) 
   变量定义伪指令 
   DB, DW, DD 等,变量属性 
   重复前缀 
   标号的定义和属性 
   定位伪指令 
3.2.3 变量和标号的属性 
   用于地址的操作符 
   用于类型的操作符 
3.3 程序段的定义和属性 (5) 
 3.3.1 DOS的程序结构 
   EXE程序 
   COM程序 
 3.3.2 简化段定义的格式 
   存储模式伪指令 
   段定义伪指令 
   程序开始伪指令 
   程序终止伪指令 
   汇编结束伪指令 
 3.3.3 完整段定义的格式 (6) 
   完整段定义伪指令 
   指定段寄存器伪指令 
   段组伪指令 
3.4 复杂数据结构 (7) 
 3.4.1 结构 
   结构类型的说明 
   结构变量的定义 
   结构变量及其字段的引用 
   段、变量和结构的练习 
 3.4.2 记录 (8) 
   记录类型的说明 
   记录变量的定义 
   记录变量的引用和记录操作

四、汇编语言程序设计(11学时)

4.1 顺序程序设计 (1) 
  例题:顺序程序练习 
4.2 分支程序设计 
 4.2.1 利用转移指令实现分支 
   单分支程序 
   双分支程序 
   例题:分支程序练习 (2) 
 4.2.2 利用条件控制伪指令实现分支 
   用条件伪指令实现分支.IF, .ELSE, .ENDIF (3) 
   IF伪指令的表达式 
   例题:条件伪指令练习 
4.3 循环程序设计 (4) 
 4.3.1 利用循环指令和转移指令实现循环 
   循环指令: LOOP、LOOPE/LOOPZ、LOOPNE/LOOPNZ  
   例题:冒泡法排序程序  
   转移指令: JCXZ、Jxx 
 4.3.2 利用循环伪指令实现循环 (5) 
   WHILE循环 
   UNTIL循环 
   循环伪指令: .WHILE, .REPEAT, .UNTIL, .BREAK, .CONTINUE 
4.4 子程序设计 (6) 
 4.4.1 过程定义伪指令 
   过程定义伪指令 
   调用和返回指令: CALL, RET 
   例题:用过程冒泡法排序程序 
 4.4.2 过程的参数传递 (7) 
   通过寄存器传送参数 
   通过存储器传送参数 
   通过堆栈传送参数 
 4.4.3 子程序的嵌套、递归与重入 (8) 
   嵌套 
   利用循环嵌套构成的程序 
   递归 (9) 
   例题:递归程序例 
4.5 宏结构程序设计 (10) 
 4.5.1 宏汇编 
   宏的定义和调用 
   宏的参数 
   与宏有关的伪指令 
   宏与子程序 
 4.5.2 重复汇编 
   按参数值重复伪指令 
   按参数个数重复伪指令 
 4.5.3 条件汇编 
   IFxx [ELSE] ENDIF 
4.6 模块化程序设计 (11) 
   模块化程序开发的要点 
   多个模块的程序例

 
五、32指令及其编程(6学时)

 
5.1 32指令运行环境 (1) 
5.1.1 32寄存器组 
   通用寄存器和指针寄存器 
   段寄存器 
   标志寄存器 
5.1.2 寻址方式 
   16寻址方式 
   32寻址方式 
5.2 32扩展指令 (2) 
   符号说明 
5.2.1 数据传送类指令 
   32传送指令 MOV 
   32交换指令XCHG 
   32入栈指令PUSH、出栈指令POP 
   32地址传送指令LEA和LDS, LES, LFS, LGS, LSS (3) 
   例题:32传送指令练习 
   32传送指令练习 
5.2.2 算术运算类指令 (4) 
   32加减指令 
   32乘除指令 
   新增加符号扩展指令 
5.2.3 操作类指令 
   32逻辑指令 
   32位移指令 
5.2.4 串操作类指令 (5) 
   基本串操作指令扩展 
   例题:32操作指令 
   例题:32指令综合练习 (6)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

大作业题(答案全部要求手写)

    1. 计算机系统概述 习题

1、简述计算机系统的构成。(1.1) 
2、试述汇编语言的特点。(1.1) 
3、将下列十进制数转换为二进制数和十六进制数。(1.2.1) 
 (1)369 (2)10000 (3)4095 (4)32767 
4、将下列二进制数转换为十六进制数和十进制数。(1.2.1) 
 (1)101101 (2)10000000 (3)1111111111111111 (4)11111111 
5、将下列十六进制数转换为二进制数和十进制数。(1.2.1) 
 (1)FA (2)5B (3)FFFE (4)1234 
6、试分别判断下列各组数据中哪个数据最大?哪个最小?(1.2.1) 
 (1)A=0.101B B=0.101D C=0.101H 
 (2)A=1011B B=1011D C=1011H 
7、将下列十进制数转换为BCD码。(1.2.2) 
 (1)12 (2)24 (3)68 (4)127 
 (5)128 (6)255 (7)1234 (8)2458 
8、将下列BCD码转换为十进制数。(1.2.2) 
 (1)1001,0001 (2)1000,1001 (3)0011,0110 (4)1001,0000 
 (5)0000,1000 (6)1001,0111, (7)1000,0001 (8)0000,00010 
9、请出下列字符串的ASCII码值。(1.2.2) 
  For example, 
  This is a number 3692. 
10、下列各数为用十六进制表示的8二进制数,它们所表示的十进制数及被看作字符的ASCII码时的字符是什么?(1.2.2) 
  (1)4F (2)2B (3)73 (4)59 
11、下列各数为十六进制表示的8二进制数,说明当它们分别被看作是无符号数或用补码表示的带符号数时,所表示的十进制数是什么?(1.2.3) 
  (1)D8 (2)FF 
12、现有一个二进制数10110110,若将该数分别看作是无符号数,原码表示的带符号数,补码表示的带符号数,它对应的十进制数的真值分别是多少?(1.2.3) 
13、将下列十进制数分别用8二进制数的原码、反码和补码表示。(1.2.3) 
  (1)0  (2)-127 (3)127 (4)-57 
  (5)126 (6)-126 (7)68 
14、计算机中有一个"0110,0001"编码,如果把它认为是无符号数,它是十进制的什么数?如果认为它是BCD码,则表示什么数?又如果它是某个ASCII码,则代表哪个字符?(1.2.3) 
15、完成下列无符号二进制数的运算。(1.2.4) 
  (1)11,1010+1011,0111 (2)1,0010,0011,0100+1010,1111 
  (3)1010,1011,1100,1101-1111,1110 (4)111,1010,1011*110,1111 
16、下列各数均为十进制数,请用8二进制补码计算下列各题,并用十六进制数表示其结果。(1.2.4) 
  (1)(-85)+76 (2)85+(-76) (3)85-76 (4)85-(-76) 
  (5)(-85)-76 (6)-85-(-76) 
17、完成下列二进制数的运算。(1.2.4) 
  (1)1011,1000/1001 (2)1011∧1001 (3)1011∨1001  
  (4)~1011 (5)1011⊕1001 
18、简述Intel 80X86系列CPU体系结构发展。(1.3) 
19、简述PC机最低1MB主存空间的使用情况。 (1.4) 
20、列出8086寄存器时所用的DEBUG命令是什么?(1.4)
 

第二章 8086指令系统 习题

1、简述标志寄存器各个的含义。(2.1) 
2、简述8086机器代码格式。 (2.2) 
3、分别指出下列指令中源操作数和目的操作数的寻址方式。(2.2) 
 (1)MOV SI,100  (2)MOV CX,DATA[SI] 
 (3)MOV [SI],AX  (4)PUSHF 
4、假定DS=2000H,SS=1500H,SI=00A0H,BX=0100H,BP=0010H,数据变量VAL的偏移地址为0050H,请指出下列指令中源操作数字段是什么寻址方式?它的物理地址是多少?(2.2) 
 (1)MOV AX,100H  (2)MOV AX,[100H] 
 (3)MOV AX,[BP]  (4)MOV AX,VAL[BX][SI] 
5、试分别说明下列各指令中源操作数和目的操作数使用的寻址方式。(2.2) 
 (1)AND AX,0FFH  (2)AND BL,[0FFH]  (3)MOV DS,AX 
 (4)CMP [SI],CX  (5)MOV DS:[0FFH],CL  (6)SUB [BP][SI],AH 
 (7)ADC AX,0ABH  (8)OR DX,-35[BX][DI]  (9)PUSH DS 
6、给定(BX)=637DH (SI)=2A9BH 位移量D=7237H,试确定下列各种寻址方式下的有效地址是什么?(2.2) 
 (1)直接寻址   (2)使用BX的寄存器寻址   (3)使用BX的间接寻址 
 (4)使用BX的寄存器相对寻址   (5)基址变址寻址   (6)相对基址变址寻址 
7、指出下列指令中的错误。(2.3) 
 (1)MOV AH,BX  (2)MOV [BX],[SI] 
 (3)MOV AX,[SI][DI]  (4)MOV BYTE PTR[BX],1000 
 (5)MOV CS,AX 
8、计算下列4条指令中操作数的地址并指出执行结果。(2.3) 
 (1) MOV 1[BX+SI],AX 
 (2) MOV 2[BP+SI],BX 
 (3) MOV 3[BX+DI],CX 
 (4) MOV 4[BP+DI],DX 
假定执行前: 
(DS)=1000H, (SS)=2000H, (BX)=300H, (BP)=400H, (SI)=50H, (DI)=60H, (AX)=12H, (CX)=13H, (DX)=15H. 
9、指出下列指令的功能。(2.3) 
MOV BX,OFFSET TAB 
MOV AL,4 
XLAT TAB 
10、分别指出下列各条指令的功能。(2.3) 
MOV SI,OFFSET NUM  
LEA SI,NUM 
MOV AX,[SI] 
LEA AX,[SI] 
LEA DI,4[SI] 
LEA POIN,BUF 
MOV POIN,OFFSET BUF 
11、编指令实现两个双精度数SUB1和SUB2的减法运算,相减后结果保存在DSUB和DSUB+2的单元中。(2.4) 
12、若AL=0B4H,BL=11H,指令MUL BL和指令IMUL BL分别执行后,它们的结果为何值?OF、CF为何值?(2.4) 
13、出完成下述功能的程序段。(2.4) 
 (1)传送25H到AL寄存器。 
 (2)将AL内容乘以2。 
 (3)传送15H到BL寄存器。 
 (4)AL的内容乘以BL的内容。 
问最后结果AX=? 
14、出实现"4001H/4"的运算的程序段。(2.4) 
15、下述程序段执行完后,AX和SI中的内容各为多少?(2.4) 
MOV AL,-7 
CBW 
MOV SI,AX 
16、阅读下列程序,出此程序所完成的运算算式。已知符号常量A,B,C分别表示数值常量a,b,c。(2.4) 
MOV AX,A 
IMUL B 
MOV CX,AX 
MOV BX,DX 
MOV AX,C 
CWD 
ADD AX,CX 
ADC DX,BX 
SUB AX,70 
SBB DX,0 
IDIV A 
MOV D,AX 
MOV D+2,DX 
17、编写程序段实现字节非压缩的BCD码53除以字节非压缩的BCD码3,要求商置于字节单元C中,余数置于字节单元R中。(2.4) 
18、如(BCD1)=1834,(BCD2)=2789,要求执行(BCD3)<-(BCD1)+(BCD2),BCD1和BCD2均为用压缩的BCD码表示的十进制数,由于它们都是4数,所以每个数占有2个字节,高位数占有高位字节,其存放方式为 
(BCD1)=34, (BCD1+1)=18 
(BCD2)=89, (BCD2+1)=27。(2.4) 
19、分析下面程序段中第三条语句执行后,AL中的内容是多少?(2.5) 
A EQU B6H 
MOV AL,0ABH 
AND AL,A AND 0FDH 
20、对给定字节数据,用指令序列实现下述要求: 
 (1)屏蔽0BFH的0、1; 
 (2)将43H的第5位置1; 
 (3)测试40H的第0,1,2,3,5,7,是否为0; 
 (4)测试AL寄存器中字节数的第2是否为1,如为1则转NEXT执行; 
 (5)将11H的第0、1两变反; 
 (6)测试AL寄存器内容是否与04FFH相等,若相等则转NEXT执行。(2.5) 
21、将S1为起始地址的30个字符依次传送到同数据段的以S2为起始地址的一段字节存储单元中。(2.6) 
22、有一段程序如下:(2.6) 
MOV CX,10 
LEA SI,FIRST 
LEA DI,SECOND 
CLD 
REP MOVSB 
 (1)这个程序段完成什么操作? 
 (2)REP和MOVSB哪部分先执行? 
 (3)MOVSB第一次执行时,要完成什么动作? 
 (4)REP第一次执行时,要完成什么工作? 
23、用其它指令完成和下列指令一样的功能。(2.6) 
 (1)REP MOVSB  (2)REP STOSB 
24、阅读下列程序段,指出它所完成的运算。(2.7) 
CMP AX,0 
JGE EXIT 
NEG AX 
EXIT:…… 
25、分析下面两条语句的功能。(2.7) 
CMP AX,0 
JNE T 
26、编程序段计算S=2+4+6+……+200.(2.7) 
27、比较AX,BX,CX中带符号数的大小,并将最大数放在AX中。试编写此程序段。(2.7) 
28、编写程序段将DATA中的100个字节数据的位置颠倒过来。(2.7) 
29、试编写一程序段,求符号函数SNG(X)的值。(2.7) 
30、有一串L个字符的字符串存储于首地址为ASCII_STR的存储区中。如要求在字符串中查找"空格" (ASCII码为20H)字符,找到则继续执行,如未找到则转到NOT_FOUND去执行,编制实现这一要求的程序。(2.7)
 

第三章 汇编语言程序格式 习题

  1. 简述汇编语言程序的两种格式。(3.1)
  2. 简述汇编语言程序的命令行开发过程。(3.1)
  3. 简述汇编语言程序的集成化开发过程(PWB)。(3.1)
  4. 下面两条语句有何区别:(3.2.1) 
          X1 EQU   1000H 
          X2 =    1000H
  5. 指令 
        AND AX,OPD1 AND OPD2 
      中,OPD1和OPD2是两个已赋值的变量,问两个AND操作分别在什么时间进行?有什么区别?(3.2.1)
  6. 下列程序完成什么工作?(3.2.2) 
    DATX1 DB 300 DUP(?) 
    DATX2 DB 100 DUP(?) 
     
      MOV CX,100 
      MOV BX,200 
      MOV SI,0 
      MOV DI,0 
    NEXT: MOV AL,DATX1[BX][SI] 
      MOV DATX2[DI],AL 
      INC SI 
      INC DI 
      LOOP NEXT
  7. 变量DATAX和变量DATAY的定义如下:(3.2.2) 
     DATAX   DW 0148H 
          DW 2316H 
     DATAY   DW 0237H 
          DW 4052H 
    按下述要求出指令序列: 
    (1)DATAX和DATAY中的两个字数据相加,和存放在DATAY及DATAY+2中。 
    (2)DATAX双字除以字DATAY。
  8. 下列指令序列有何错误?请改正,并指出AX,AL的内容。(3.2.2) 
    OPER1 DB 1,2 
    OPER2 DW 1234H,5678H 
     
      MOV AX,OPER1+1 
      MOV AL,OPER2
  9. 单条执行如下程序,每一步有关寄存器的内容是什么?(3.2.2) 
    CODE   SEGMENT 
      A  DB  1,2,3 
      B  DB  5 DUP(4) 
      C  DW  5,6,7 
      D  DB  'Hello' 
        ASSUME  CS:CODE,DS:CODE 
    GO:   MOV AX,CODE 
        MOV DS,AX 
        MOV AX,C 
        MOV BX,LENGTH C 
        MOV BX,SIZE C 
        MOV BX,TYPE C 
        MOV BX,OFFSET C 
        MOV AL,LENGTH B 
        MOV AL,LENGTH D 
        MOV AL,LENGTH A 
        MOV AL,SIZE D 
        MOV AL,SIZE B 
        MOV AH,4CH 
        INT 21H 
    CODE ENDS 
        END GO
  10. 试列出几种方法使汇编程序把5150H存入一个存储器字中。(3.2.2)
  11. 下面的语句中有数据0102H的字存储单元有多少?(3.2.2) 
    DB 10H DUP(1,2 DUP(2))
  12. 如要求把首地址为BLOCK的字数组的第6个字传送到DX寄存器,可用什么指令?(3.2.2)
  13. 下述程序段执行后,寄存器AX和BX的内容分别是多少?(3.2.2) 
    NUM EQU 945H  
    ALPH=35*27 
     
      MOV AX,ALPH LE NUM 
      MOV BX,ALPH GT NUM
  14. 下述程序段执行后,寄存器BX和CX的内容分别是多少?(3.2.2) 
    NUM1=20*20 
    NUM2 EQU 400H 
    REL1 DW NUM1 LE NUM2 
    REL2 DB NUM1 NE NUM2,NUM1 EQ NUM2

      MOV BX,REL1 
      MOV CX,WORD PTR REL2

  1. 对于下面的数据定义,三条MOV指令分别汇编成什么?(可用立即数方式表示)(3.2.2) 
    TABLEA DW 10 DUP(?) 
    TABLEB DB 10 DUP(?) 
    TABLEC DB '1234' 


    MOV AX,LENGTH TABLEA 
    MOV BL,LENGTH TABLEB 
    MOV CL,LENGTH TABLEC
  2. 程序在数据段中定义的数组如下:(3.2.3) 
     NAMES DB 'TOM' 
        DB 20 
        DB 'ROSE' 
        DB 30 
        DB 'KATE' 
        DB 25 
    请指出下列指令是否正确?为什么? 
    (1)MOV BX,OFFSET NAMES 
       MOV AL,[BX+5] 
    (2)MOV AX,NAMES 
    (3)MOV AX,WORD PTR NAMES+1 
    (4)MOV BX,6 
       MOV SI,5 
       MOV AX,NAMES[BX][SI] 
    (5)MOV BX,6*2 
       MOV SI,5 
       MOV AX,OFFSET NAMES[BX][SI] 
       INC [AX] 
    (6)MOV BX,6 
       MOV SI,5 
       LEA DI,NAMES[BX][SI] 
       MOV AL,[DI]
  3. 假设数据段DSEG中的符号及数据定义如下,试出此数据段汇编后各行语句的初始地址及其内容。(3.2.3) 
    DSEG SEGMENT 
    JOE=100 
    SAM=JOE+20 
    S_F DB '/XYZ/',0DH,0AH 
    B_F DB 101B,19,'a' 
    .RADIX 16 
    BLK DB 11 DUP(' ') 
    EVEN 
    W_F1 DW '12,13D,11010B,333,SAM 
    .RADIX 10 
    W_F2 DW 15 
    LEN EQU $-S_F 
    DSEG ENDS
  4. 出以下数据段中每个符号所对应的值。(3.2.3) 
    DATAREA SEGMENT 
    MAX EQU 0FFFH 
    VALONE EQU MAX MOD 10H 
    VALTWO EQU VALONE*2 
    BUFSIZ EQU ((VALTWO GT 10H)AND 10H)+10H 
    BUFFER DB  BUFSIZ DUP(?) 
    BUFEND EQU BUFFER+BUFSIZ-1 
    DATAREA ENDS
  5. 用段伪操作定义一个数据段DATA_SEG,要求段界起始与字边界,连接时,该段将与同名逻辑段连接成一个物理段,类别为"DATA"。(3.2.3)
  6. 假设程序中的数据定义如下:(3.2.3) 
       LNAME  DB 30 DUP(?) 
       ADDRESS DB 30 DUP(?) 
       CITY   DB 15 DUP(?) 
       CODE_LIST DB 1,7,8,3,2 
    (1)用一条MOV指令将LNAME的偏移地址放入AX. 
    (2)用一条指令将CODE_LIST的头两个字节的内容放入SI. 
    (3)一条操作使CODE_LENGTH的值等于CODE_LIST域的实际长度
  7. 给出等值语句如下: 
    ALPHA EQU 100 
    BETA EQU 25 
    GAMMA EQU 2 
    下列表达式的值是多少?(3.2.3) 
    (1)ALPHA*100+BETA 
    (2)ALPHA MOD GAMMA+BETA 
    (3)(ALPHA+2)*BETA-2 
    (4)(BETA/3) MOD 5 
    (5)(ALPHA+3)*(BETA MOD GAMMA) 
    (6)ALPHA GE GAMMA 
    (7)BETA AND 7 
    (8)GAMMA OR 3
  8. 对于下列指令汇编后的结果。(3.2.3) 
    (1) ARRAY DW 1,2,3 
        ADD SI,TYPE ARRAY 
    (2) FEES DW 100 DUP(0) 
        MOV CX,LENGH FEES 
    (3)TABLE DB 'ABCD' 
        MOV CX,LENGH TABLE
  9. 指出下列伪指令表达方式的错误,并改正之。(3.3) 
      (1)STACK_SEG SEGMENT'STACK' 
    (2)SEGMENT 'CODE' 
    (3)MAIN_PROC PROC FAR 
       START:…… 
         
       MAIN_PROC ENDS 
       END MAIN_PROC 
       MAIN_PROC ENDP
  10. 某一程序的数据段中有如下几条伪指令语句,试分析各变量的属性。(3.3) 
    DATA SEGMENT 
    DDBUF EQU THIS DWORD 
    BUF  DB 100 DUP(?) 
    DWBUF EQU WORD PTR BUF 
    DATA ENDS 
     
    FIRST EQU THIS FAR 
    LEA SI,BUF
  11. 某程序中的数据段内容如下所示,请指出变量BUF和NUM的偏移地址为多少?(3.3) 
    DATA SEGMENT 
    ORG 10 
    BUF DB 'ABCD' 
    ORG ﹩+5 
    NUM DW 50 
    DATA ENDS
  12. 如数组ARRAY定义如下,试出把数组长度(字数)存入CX寄存器的指令。(3.3) 
    ARRAY DW 1,2,3,4,5,6,7 
    END DW ?
  13. 请把40个字母a的字符串从源缓冲区传送到目的缓冲区。(3.3)
  14. 编一完整程序求两数14与-25和的绝对值。(3.3)
  15. 结构数据类型如何说明、结构变量如何定义、结构字段如何应用?(3.4)
  16. 记录数据类型如何说明,记录变量如何定义,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码表示。当其为"A"时,程序转移到LPA处;如为"B",则转移到LPB处;如为"E",则转移到LPE处,否则,均转向LPN处。(4.2)
  9. 在DATA单元有一个二进制数x,要求编程完成运算:(4.2)
           x+1 x>0
      y= x x=0
         x-1 x<0
  1. 数组A和B,各有20个数据,它们均已按升序排放。现要求将这两个数组合并为一个数组C,且要求其数据也按升序排放,试编程实现。(4.2)
  2. 编一程序,要求将BUF单元开始的100个存储单元全部清零。若不知所清单元长度,只知以0FFH作为结束标志,又该如何处理?(4.3)
  3. 有一数据块,长度为100字节,存放于DAT开始的存储单元。要求将此数据块中的负数的个数统计出来,并将统计结果存入MNUM单元中。(4.3)
  4. 有一个由八位数组成的数列,长度为三字节,存放地址始于DAT单元。求此数列的算术和并存于BUF和BUF+1单元。已知数列之和为十六位数。(4.3)
  5. 从NUMB单元起有100个数,其值在0~100之间。试编程实现以下数据统计: 
    (1) 有多少个大于等于60的数?统计结果存于COUNT单元。 
    (2) 有多少个为100的数?统计结果存于COUNT+1单元。 
    (3) 有多少个为0的数?统计结果存于 COUNT+2单元。 
    (4) 当小于60的数超过十个,则结束统计,同时置COUNT单元为0FFH。(4.3)
  6. 将ADAT单元起的100个字节数据,传送到BDAT开始的单元中去。已知数据区无覆盖问题,要求用三种方法实现。(4.3)
  7. 将BUF单元开始的50个字节数,区分出奇、偶数。将奇数在前,偶数在后,仍存回原数据区。(4.3)
  8. 对A址起的30个字节长的字符串,删除其中的数字符,后续字符向前递补,剩余字符补空格字符,编程实现。(4.3)
  9. 已知有三个八位无符号数x,y,z,分别存放于NUMB,NUMB+1和NUMB+2单元。要求编一程序实现2x+3y+5z,并要求将运算结果送RES单元和RES+1单元。(4.4)
  10. 将两个八位无符号数乘法的程序编为一个子程序。被乘数、乘数和乘积存放于自NUB开始的四个存储单元中。(4.4)
  11. 将CSTRN起的50个字符的串,统计相同字符的字符数,找出相同字符数最多字符,存于CMORE单元中。(4.4)
  12. 宏定义体内不仅可以使用宏调用,也可以包含宏定义。以下宏定义: 
     
    其中MACNAM是内层的宏定义名,但又是外层宏定义的哑元,当调用DEFMAC时,就形成一个宏定义。写出宏调用: 
    DEFMAC ADDITION,ADD的宏展开。(4.5)
  13. 用宏定义及重复伪操作把TAB,TAB+1,TAB+2,……,TAB+16的内容存入堆栈。(4.5)
  14. 要求建立一个100D字的数组,其中每个字的内容是下一个字的地址,而最后一个字的内容是第一个字的地址。(4.5)
  15. 试定义宏指令MAX把三个变元中的最大值放在AX中,而且使变元数不同时产生不同的程序段。(4.5)
  16. 编一个程序模块完成轮流查询三个数据输入设备的功能。(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,字符为"O"。 
 (2)表示的十进制数为43D,字符为"+"。 
   (3)表示的十进制数为115D,字符为"s"。 
   (4)表示的十进制数为89D,字符为"Y"。 
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码,代表字符"a"。 
15、 (1)1111,0001B  (2)1,0010,1110,0011B 
 (3)1010,1010,1100,1111B  (4)11,0101,0011,0010,0101B 
16、 (1)表示:1010,1011+0100,1100 结果:0FBH。 
 (2)表示:0101,0101+1011,0100 结果:9H。 
  (3)表示:0101,0101-0100,1100 结果:9H。 
 (4)表示:0101,0101-1011,0100 结果:A1H。 
 (5)表示:1010,1011-0100,1100  结果:4FH。 
 (6)表示:1010,1011-1011,0100 结果:FBH。 
17、 (1)10100 (余数:100)  (2)1001  (3)1011 
 (4)0100  (5)0010 
18、总的来说可以概括为六个阶段: (1)8086/8088/80186. (2)80286. (3)80386. 
 (4)80486. (5)Petium/MMX Petium. (6)Petium Pro/Petium II/Petium III。 
19、整个1MB主存空间从低位地址到高位地址可分为4个区段:基本RAM区、保留RAM区、扩展ROM区和基本ROM区。 
 (1) 基本RAM区 (00000H-9FFFFH)。 
该区共640KB,由DOS进行管理。 
 (2) 保留RAM区 (A0000H-BFFFFH) 
该区段为系统安排的"显示缓冲存储区",共128KB,由显示卡上的RAM芯片提供支持,用于存放屏幕显示信息。 
 (3) 扩展ROM区 (C0000H-DFFFFH) 
该区共128KB,由I/O接口卡上的ROM芯片提供支持,用于为系统不直接提供支持的外设安排设备驱动程序。 
 (4) 系统ROM区 (E0000H-FFFFFH) 
该区共128KB,由系统占用。它主要提供ROM-BIOS程序。 
20、检查和修改寄存器内容的命令为R,它有三种格式如下: 
 (1)显示CPU内所有寄存器内容和标志位状态,格式为:-R。 
 (2)显示和修改某个寄存器内容,格式为:-R register name。 
 (3)显示和修改标志位状态,格式为:-RF。

第二章 8086指令系统 习题答案

1、(1)状态标志:CF-进位标志,ZF-零标志,SF-符号标志,PF-奇偶标志

          OF-溢出标志,AF-辅助进位标志。

  (2)控制标志:DF-方向标志,IF-中断允许标志,TF-陷井标志。

2、8086机器代码格式一般是:

   操作码 寻址方式 偏移量 立即数。

3、(1)源操作数为立即寻址,目的操作数为寄存器寻址。

  (2)源操作数为寄存器相对寻址,目的操作数为寄存器寻址。

  (3)源操作数为寄存器寻址,目的操作数为寄存器间接寻址。

  (4)源操作数和目的操作数均为固定寻址。

4、此题要求出物理地址,物理地址的计算公式为:

   段地址(段首地址)*10H+偏移地址(有效地址)

  (1)源操作数为立即寻址方式,操作数地址就在本条指令中。

  (2)源操作数为直接寻址方式,其物理地址为

     DS*10H+100H=20100H

  (3)源操作数为寄存器间接寻址,其物理地址为

     SS*10H+BP=15010H

  (4)源操作数为基址变址寻址,其物理地址为

     DS*10H+BX+SI+VAL=201E0H

5、(1)源操作数为立即寻址,目的操作数为寄存器寻址。

  (2)源操作数为直接寻址,目的操作数为寄存器寻址。

  (3)源操作数为寄存器寻址,目的操作数为寄存器寻址。

  (6)源操作数为寄存器寻址,目的操作数为基址变址寻址。

  (7)源操作数为寄存器相对寻址,目的操作数为寄存器寻址。

  (8)源操作数为相对基址变址寻址,目的操作数为寄存器寻址。

  (9)源操作数为寄存器寻址。

6、(1)位移量D   (2)BX      (3)637DH     (4)D5B4H

   (5)8E18H        (6)1004FH

7、(1)此指令中AHBX分别为8位和16位寄存器,所以类型不匹配。

  (2)此指令中源地址和目的地址均为寄存器间接寻址的两个存储单元,而MOV指令不允许两存储单元间直接传送信息。

  (3)源地址为基址变址寻址,则SI(或DI)应与BPBX组合使用,而SIDI不能一起使用。

  (4)目的操作数地址在本指令中用伪操作PTR将字类型改变成了字节类型。因此源操作数1000只能是字节立即数,否则类型不匹配。但一字节宽度仅为一个8位的二进制数,能表达的最大数为28=256,显然1000超出了一个字节的范围。

  (5)虽然MOV指令允许寄存器与段寄存器交换信息,但CS不能用作目的寄存器。

8、4条指令的目的操作数都是基址加变址寻址方式。第(1)、(3)两条指令选用了BX作基址寄存器,(2)、(4)两条指令选用了BP作基址寄存器,所以,AXCX的内容将送往数据段中的相应单元,BXDX的内容将送往堆栈段中的相应单元。

第(1)条:

         目的操作数地址:EA=[BX]+[SI]+1=300H+50H+1=351H

                         PA=(DS)左移4+EA=1035H

         源操作数地址:  AX

         执行:         AX—>10351H

第(2)条:

         目的操作数地址:EA=[BP]+[SI]+2=452H

                         PA=(SS)左移4+EA=20452H

         源操作数地址:  BX

         执行:         BX—>20452H

第(3)条:

        目的操作数地址:EA=[BX]+[DI]+3=363H

                         PA=(DS)左移4+EA=10363H

         源操作数地址:  CX

         执行:         CX—>10363H

第(4)条:

         目的操作数地址:EA=[BP]+[DI]+4=464H

                         PA=(SS)左移4位+EA=20464H

     源操作数地址:  DX

         执行:         DX—>20464H

上述4条指令执行后,存储器中相应单元的内容如下:

10351H=12       ;由第(1)条指令送入

20452H=300H     ;由第(2)条指令送入

10363H=13       ;由第(3)条指令送入

20464H=15       ;由第(4)条指令送入

9MOV  BXOFFSET TAB     ;变量TABEA—>BX

   MOV  AL4               TAB表中第五项的位移量4—>AL

   XLAT  TAB                ;([BX+AL]=TAB+4=34H—>AL

10MOV  SIOFFSET NUM    ;将NUMEA—>SI

   LEA  SINUM            ;与上一条语句等效

   MOV  AX[SI]            ;([SI]—>AX

   LEA  AX[SI]             ;将SI所指的存储单元的EA—>AX

   LEA  DI4[SI]              ;取以NUM为首址的第三个字符存储单元的EA—>DI

   LEA  POINBUF           ;错误语句,因为OPD不是寄存器

   MOV  POINOFFSET BUF  ;将BUFEA—>POIN

11、编程如下:

   MOV  AXSUB1

   SUB   AXSUB2

   MOV  DSUBAX        ;两低位字相减,结果—>DSUB

   MOV  AXSUB1+2

   SBB   AXSUB2+2      ;两高位字相减,并减去低位的借位CF

   MOV  DSUB+2AX

12AL=0B4H为无符号数的180D,为有符号数的-76D;BL=11H为无符号数的17D,为有符号数的+17D

   MUL BL的执行结果为 AX=180D*17D=3060D=0BF4H

   IMUL BL的执行结果为 AX=(76D)*17D=1292D=0FAF4H

   又两乘积结果在AX中的高位数(在AH中)均不为0,所以两条指令均置OF=CF=1

13、按先后顺序写出完成题目要求的4个功能的程序段如下:

   MOV  AL,25H             ;AL<25H

   SHL  AL,1                 ;用逻辑左移指令左移一次,实现AL<AL*2

   MOV  BL,15H              ;BL<15H

   MUL  BL                  ;AX<AL*BL

   上段程序执行后,AX=25H*2*15H=612H.

14、编写的程序段如下:

   MOV  AX4001H

   CWD

   MOV  CX4

   IDIV   CX

执行以上程序段后,商在AX中,余数在DX中,运算的结果为:

  AX=1000H,(DX=1

15、执行完以上三条语句后,(AX=0FFF9H,(SI=0FFF9H

16、该程序所完成的运算算式为:(a*b+c-70/a并将运算结果存入变量D中,而余数存入D+2中(表达式中的a,b,c均为数值常量)。

17、首先列已知条件:

   除数为非压缩的BCD3,被除数为非压缩的BCD53.被除数和除数的内存地址均未给出,我们可以随意给定,假设53存放在B字节单元中,3存放在A字节单元中。

   其次确定算法:

   字节除法要求被除数在AX中,结果的8位商在AL中,8位余数在AH中。因此首先应将被除数置AX中,最后再将结果的商按要求存放在字节单元C中,余数存放在字节单元R中。编程时应注意,对两位非压缩BCD数与一位非压缩BCD数相除,应先用AAD指令将AX中的被除数调整成二进制数并存放在AL中,然后再用DIV指令实现除法运算。

   最后编程如下:

   MOV  AH,0             ;AH<0

   MOV  AL,B+1           ;AL<5(被除数十位)

   DIV  A                 ;除法,第一个余数在AH

   MOV  C+1,AL           ;[C+1]<-第一个商

   MOV  AL,B             ;AL<3(被除数的个位)

   AAD                    ;调整

   DIV  A                  ;除法

   MOV  C,AL              ;C<7(第二个商)

   MOV  R,AH              ;R<2(第二个余数)

   运算后的结果为[C=07H,[C+1]=01H,[R]=02H,即商为17,余数为2,结果正确。

18、指令序列如下:

   MOV  AL,BCD1

   ADD  AL,BCD2

   DAA 

   MOV  BCD3,AL

   MOV  AL,BCD1+1

   ADC  AL,BCD2+1

   DAA  

   MOV  BCD3+1,AL

最后(BCD3)=4623结果正确。

19、在第三个语句中,AND出现了两次,但这两个AND所代表的意义是截然不同的。第二个AND是常量运算符。因而,“A AND 0FDH”是表示要进行逻辑运算的数值表达式,它是在汇编期间被运算出来的,结果为0B4H。而第一个AND是机器指令逻辑乘的指令助记符。它的源操作数是采用立即方式寻址,立即操作数为0B4H,该指令将被汇编程序翻译成目标代码,只有在CPU执行该目标代码时,才能完成(AL)∧0B4H—>AL的操作,最后AL中的内容为0A0H

20、(1)要屏蔽某些位,可以用AND指令。

    MOV  AL,0BFH

        AND  AL,0FCH

        指令执行后的结果为AL=0BCH

  (2)将给定数的某位置1,可以用OR指令。

    MOV  AL,43H

        OR  AL,20H

    指令执行后的结果为AL=63H

   (3)要测试给定数的某位是否为0,可用TEST指令。

    MOV  AL,40H

        TEST  AL,0AFH

        指令执行结果为00H。显然标志位CF=OF=0,SF=0,ZF=1,说明要测试的40H的第0,1,2,3,5,7位均为0。

  (4)要测试操作数的某位是否为1,可先将该操作数按位取反,然后再用TEST指令测试。

    MOV  DL,AL

        NOT  DL

        TEST  DL,04H

        JE   NEXT

   (5)要使操作数的某些位变反,可使用XOR指令。

    MOV  AL,11H

        XOR  AL,3H

       指令执行后的结果为AL=12H.

   (6)测试某一操作数是否与另一确定操作数相等,也可使用XOR指令来实现。

    XOR  AL,4EFH

        JZ  NEXT

21、方法一:

   用变址寻址方式来访问S1S2。即用S1[SI]S2[SI]来分别表示S1S2中各字节的有效地址,其中[SI]表示距S1S2的起始地址的字节数。用CX控制循环次数,则SI的取值应从0~29,每循环一次SI1

      MOV  SI,0                ;SI<—0

      MOV  CX,30              ;计数器赋初值

NEXT: MOV  AL,S1[SI]           ;传送一个字节数据

      MOV  S2[SI],AL

      INC  SI                   ;SI<—SI+1

      LOOP                     ;CX<—CX—1,CX0则转NEXT

   方法二:

   使用MOVS指令,并采用重复前缀,于是有

      MOV  SI,OFFSET S1

      MOV  DI,OFFSET S2

      MOV  CX,30

      CLD                      ;串地址正向增值

      REP  MOVSB

22、(1)这个程序段完成的动作是:将FIRST开始的10个字节数据传送到SECOND段中。(2)MOVSBREP重复使用,MOVSB先执行,REP后执行。

 (3)MOVSB第一次执行时完成的动作是:先将(SECOND)<—(FERST),然后将SI<—SI+1,DI<—DI+1

  (4)REP指令第一次执行时,将CX<—CX—1,然后重复执行REP MOVSB

23、(1)NEXT:  MOV  DL,[SI]

                 MOV  [DI],DL

                 INC  SI(DEC  SI)

                 INC  DI(DEC  DI)

                 LOOP  NEXT

 (2)NEXT:  MOV  [DI],AL

                INC  DI(DEC  DI)

                LOOP  NEXT

24、该程序段可实现求(AX)绝对值的运算。现分析如下:

   x为一带符号的16位二进制数,有(AX=[x]

   如果x0,则[x]=[x]=|x|,转EXIT执行。

   如果x<0,[x]可通过[x]形成,形成的方式是:保持[x]的符号位不变(即为1),其余各位取反后再加1。现要执行语句“NEG AX”,即对[x]进行求补运算,运算的方法是:将(AX)连同符号位一起取反后再加1,于是符号位由1变为0,即由负变正,而后面各位再取反加1则还原成原码中后面各位的值,因此[x]=|x|

25、第一条语句将(AX)与0比较,第二条语句是转移语句,根据前面一条语句的比较结果确定转移方向。如果(AX)≠0,则转至标号T处执行;否则顺序执行。

26、假设AX用来存放累加结果,BX存放待加数据项,每累加一次,BX内容加2,即指向下一个待加数据,直至累加的循环次数计数器CX中的内容为零为止,其中CX的初值为100。现编写程序段如下:

     MOV  AX,0          ;累加器清零

     MOV  BX,2          ;置累加初值

     MOV  CX,100        ;置循环次数初值

NEXT:ADD  AX,BX         ;实现一次累加

      ADD  BX,2           ;形成下一个待累加数据

      LOOP  NEXT         ;未加完则继续累加

      MOV  S,AX          ;累加结果存入S变量

27、编写程序段如下:

   CMP  AX,BX           ;比较AXBX

     JGE  NEXT             ;AXBX则转NEXT

     XCHG  AX,BX          ;AX<BX则交换AX,BX内容

NEXT: CMP  AX,CX           ;比较AXCX

      JGE  DONE             ;AXCX则转DONE执行

      XCHG  AX,CX          ;AX<CX则交换AX,CX内容

DONE:…

28、算法:将第1个字节和第100个字节的内容互换,将第2个字节与第99个字节的内容互换,……,那么,只要互换50次便可完成。

  编写程序段如下:

   MOV  CX,50               ;置循环次数初值

      LEA  SI,DATA        ;将源操作数的地址偏移量送SI   

      MOV  DI,SI        

      ADD  DI,99                 ;将目的操作数的地址偏移量送DI

NEXT: MOV  AL,[SI]               ;交换一个字节

      XCHG  AL,[DI]

      MOV  [SI],AL

      INC  SI                      ;源操作数地址加1

      DEC  DI                     ;目的操作数地址减1

      LOOP NEXT                 ;继续交换过程直至CX=0

29、算法:假设自变量X的值在内。若AX<0则有Y=-1,若AX0则还要继续判断;当AX>0则有Y=1,否则只有Y=0

    具体程序段可用条件转移和无条件转移指令来实现:

    CMP  AX,0

       JL  NONE

       CMP  AX,0

       JG  ONE

       MOV  Y,0

       JMP  OUT

NONE: MOV  Y,—1

       JMP  OUT

  ONE: MOV  Y,1

  OUT: RET

30、编制的程序如下:

               MOV  CX,L                  ;将数组长度存放在CX

               MOV  SI,—1                 ;初始化SI

               MOV  AL,20H                ;在AL中存放空格的ASCII

NEXT:        INC  SI                      SI1

               CMP  AL,ASCII_STR[SI]       ;进行比较

               LOOPNE  NEXT              ;没找到且CX0时,继续循环

               JNZ  NOT_FOUND            ;未找到则转入NOT_FOUND执行

                   .

                   .

                   .

NOT_FOUND:

第三章 汇编语言程序格式 答案习题

  1. 汇编语言源程序由语句序列构成。语句一般是由分隔符分成的四个部分组成,它们有两种格式。 
    (1) 执行性语句------由硬指令构成的语句,它通常对应一条机器指令,出现在程序的代码段中: 
    标号:硬指令助记符 操作数,操作数 ;注释 
    (2) 说明性语句--------由伪指令构成的语句,它通常指示汇编程序如何汇编源程序: 
    名字 伪指令助记符 参数,参数,… ;注释
  2. 汇编语言的开发过程为: 
    (1)首先调用一个文字编辑程序,送入已编写好的源程序,建立一个源文件。 
    (2)调用汇编程序,把源程序汇编成目标程序(.OBJ),在此过程中进行语法检查。  
    (3)通过连接程序LINK转换为一个可执行文件(.EXE)。 
    (4) 最后调试程序(DEBUG)把可执行文件装入内存,在此过程中对程序和数据进行适当的修改和调整,如此反复直到程序完全正确为止。
  3. 使用MASM6.0提供的集成开发平台PWB。PWB的功能特点: 
    全菜单方式操作:通过菜单选择执行编辑、编译、连接等。 
    集成编辑环境:完成源程序编辑。 
    多窗口: 同时显示源程序和信息编译、连接。 
    CodeView源程序调试工具: 
    全屏幕调试工具,源代码级、符号调试。 
    多窗口,可同时显示源程序、寄存器、数据等。 
    可单步、分段、设置断点执行程序,可监测变量。  
    支持32位指令调试。 
    支持8087调试。
  4. 两条语句中的X1与X2都被赋值1000H,但因为X1是用EQU伪指令赋值的,所以X1的值不能被重新赋值;而X2是用=伪指令定义的,因此X2的值可以被重新定义。
  5. 第二个AND是逻辑运算符,它在汇编时进行,计算表达式OPD1 AND OPD2后,产生一个立即数作为指令的操作数,而第一个AND是指令助记符,它在汇编以后执行AND指令时进行。
  6. DATX1 DB 300 DUP(?)   ;为DATX1分配300个字节单元空间 
    DATX2 DB 100 DUP(?)   ;为DATX2分配100个字节单元空间 
     
       MOV CX,100      ;CX<-100 
       MOV BX,200      ;BX<-200 
       MOV SI,0      ;SI<-0 
       MOV DI,0      ;DI<-0 
    NEXT: MOV AL,DATX1[BX][SI]  ;AL<-[DS*10H+BX+SI+DATX1] 
       MOV DATX2[DI],AL      ;[DS*10H+DI+DATX2]<-AL 
       INC SI            ;SI<-SI+1 
       INC DI            ;DI<-DI+1 
      LOOP NEXT ;CX<-CX-1,CX≠0时转NEXT执行 
    经过分析可以看出:此段程序完成的工作为将DATX1中的后100个字节数据传送到DATX2中去。
  7. (1)MOV AX,DATAX 
       ADD DATAY,AX 
       MOV AX,DATAX+2 
       ADD DATAY+2,AX 
    (2)MOV DX,DATAX+2 
       MOV AX,DATAX 
       DIV DATAY
  8. 汇编程序在汇编这段程序时会发现,两条MOV指令的两个操作数类型属性不相同:OPER1+1为字节类型属性,而AX为字类型属性;OPER2为字类型而AL为字节类型。 
    我们可以使用PTR属性操作符来临时指定操作数类型,于是以上指令修改为 
        MOV AX,WORD PTR OPER1+1 
        MOV AL,BYTE PTR OPER2 
    第一条MOV指令运行把OPER1+1的字内容送AX;把OPER1+1的内容送AL,把OPER2的第一个字节内容送AH,所以指令执行后(AX)=3402H;第二条MOV指令运行时把OPER2的第一个字节内容送入AL,即(AL)=34H。
  9. 用注释形式在程序右边逐条给出执行结果如下: 
      GO: MOV AX,CODE    ;将CODE装入DS 
        MOV DS,AX  
        MOV AX,C       ;将字5->AX 
        MOV BX,LENGTH C    ;BX<-1 
        MOV BX,SIZE C    ;BX<-2 
        MOV BX,TYPE C    ;BX<-2 
        MOV BX,OFFSET C    ;BX<-8 
        MOV AL,LENGTH B    ;AL<-5 
        MOV AL,LENGTH D    ;AL<-1 
        MOV AL,LENGTH A    ;AL<-1 
        MOV AL,SIZE D    ;AL<-1 
        MOV AL,SIZE B    ;AL<-5
  10. 可以用以下几种等价方法实现要求: 
      DW 5150H 
      DB 50H,51H 
      DB 'PQ'
  11. 0FH。
  12. 可用的指令如下: 
      MOV DX,BLOCK+(6-1)*2
  13. AX=0FFH BX=0。
  14. BX=0FFH CX=0FFH。
  15. MOV AX,10 
     MOV BL,10 
     MOV CL,1
  16. (1)两条指令都是合法指令。第一条指令取得NAMES的偏移地址,第二条指令使用间接寻址方式,将地址为DS*10H+BX+5字节中的数据传送给AL,结果AL=20。 
      (2)这条指令不正确。因为NAMES的属性为字节,而目的寄存器为AX,所以类型不匹配。 
      (3)这是一条合法指令。指令中将已定义的字节变量用伪操作PTR改变为字类型,所以避免了类型不匹配的错误。操作结果AX=4D4FH,即M和O的ASCII码。 
      (4)前两条指令使用的是立即数方式,第三条指令的源操作数字段使用的是基址变址寻址方式,但形成的数据地址中的数据属性为字节,而源操作数寄存器为AX,故出现类型不匹配错误,如AX改为AL,则这条指令就是合法指令。 
      (5)前两条指令是正确的,后两条指令有错误。在汇编过程中,OFFSET操作将得到变量的偏移值,但对基址变址方式形成的值在汇编指令时还是未知的。同样,诸如 
    MOV BX,OFFSET NAMES[SI]也是错误指令。第四条指令中,AX不能作为基址寄存器用。 
      (6)四条指令均为合法指令。第三条指令中的DI取得一个字节地址:BX+SI+NAMES,然后再按DI中的偏移地址,在数据段中将一字节内容传送给AL寄存器。操作结果AL=30.
  17. 汇编时,汇编程序默认无标记数为十进制数;而运行时,DEBUG程序默认无标记数为16进制数。经过分析,各行语句的初始地址及内容如下: 
      初始地址    内容 
        0000     =0064 
                =0078 
                 2F 78 79 7A 2F 0D 0A 
        0007      05 13 61 
        0010 
        000A      11[20] 
        001B      90 
        001C       3132 000D 001A 0333 0078 
        000A  
        0026       000F 
                  =0028 
       0028
  18. MAX=0FFFH 
    VALONE=000FH(VALONE为MAX的值除以10H的余数) 
    VALTWO=001EH(000FH*2=001EH) 
    BUFSIZ=0020H(因为VALTWO=001EH>10H,则VALTWO GT 10H结果为真,表示为0FFFFH,再和10H相与,结果为10H,最后加上10H,取得值20H 
    BUFEND=001FH(数据区BUFFER最后一个字节的地址值)
  19. DATA_SEG SEGMENT    ;定义数据段 
    WORD            ;段界为字 
    PUBIC            ;该数据段为组合类型 
    'DATA'         ;类别为"DATA" 
    故按题目要求,该段的定义语句应写为: 
    DATA_SEG SEGMENT WORD PUBLIC 'DATA'
  20. (1)MOV AX,OFFSET LNAME 
    (2)MOV SI,WORD PTR CODE_LIST 
    (3)CODE_LENGTH EQU $-CODE_LIST
  21. (1)10025 (2)25 (3)2548 
    (4)3 (5)103 (6)1 
    (7)1 (8)3
  22. 汇编后的结果如下: 
    (1) ADD SI,2 
    (2) MOV CX,100 
    (3) MOV CX,1
  23. 三组指令均有错误,现改正如下: 
    (1)STACK_SEG SEGMENT STACK 'STACK' 
    (2)SEG_CODE SEGMENT 'CODE' 
    (3)MAIN_PROC ENDP 
    SEG_CODE ENDS 
    END START
  24. 变量BUF为字节类型,所在段的段首地址为DATA,偏移地址为0。语句"DDBUF EQU THIS DWORD"将紧跟它后面的字节类型的变量BUF重新定义为双字类型,并命名为DDBUF。变量DDBUF与BUF具有相同的段属性和偏移地址属性。而语?quot;DWBUF EQU WORD PTR BUF"是将变量BUF重新定义为字类型,并命名为DWBUF,变量DWBUF也与BUF具有相同的段属性和偏移地址属性。由此可见,DDBUF、BUF、DWBUF为同一数据存储区的首址,只是类型分别为双字、字节、字。
  25. 分析以上数据段中各语句的功能,可知变量BUF的偏移地址为10,NUM的偏移地址为19。
  26. END是为计算数组长度而建立的符号地址,所需指令如下: 
    MOV CX,(END-ARRAY)/2 
    汇编程序在汇编期间将计算表达式而形成指令 
    MOV CX,7
  27. 源文件如下: 
    ;PROGRAM TITLE GOES HERE--EX_MOVS ;程序名为EX_MOVS 
    ;******************************************* 
    DATA  SEGMENT    ;定义数据段 
    SOURCE_BUFFER  DB  40 DUP('A') 
    DATA  ENDS 
    ;******************************************** 
    EXTRA  SEGMENT ;定义附加段 
     DEST_BUFFER  DB 40 DUP(?) 
    EXTRA  ENDS 
    ;******************************************** 
    CODE   SEGMENT  ;定义代码段 
    ;********************************************* 
    MAIN PROC  FAR  ;主程序部分 
     ASSUME CS:CODE,DS:DATA,ES:EXTRA 
    START: 
      PUSH DS ;保存原数据段地址  
      SUB AX,AX     ;将AX清0并入栈       
      PUSH AX

       PUSH AX,DATA ;数据段地址送DS 
      MOV DS,AX 
      MOV AX,EXTRA ;附加段地址送ES 
      MOV ES,AX  
      LEA SI,SOURCE_BUFFE ;将源地址偏移量送SI 
      LEA DI,DEST_BUFF ;将目标地址偏移量送DI 
      CLD ;清方向标志,使其递增 
      MOV CX,40 ;将传送字符数送CX 
      REP MOVSB ;传送字符 
      RET ;返回 
    MAIN ENDP 
    ;------------------------------------------------------------------------------------- 
    CODE ENDS 
    ;************************************************************ 
    END START

  1. 两个有符号加数及和我们均可在数据段内为其进行定义和预置。当求得的和非负时存入结果单元;若和为负则求反后再存入结果单元。另外我们还可以用TITLE给出标题,用

      END START表示程序结束。 
      TITLE ABSOLT ;标题 
      DATA_SEG SEGMENT ;定义数据段 
      OPER1 DW 1110B ;定义两个加数 
      OPER2 DW 11100111B ; 
      RESULT DW ?      ;预置结果空间      
      DATA_SEG ENDS      ;数据段结束  
      CODE_SEG SEGMENT    ;定义代码段 
           ASSUME CS:CODE_SEG,DS:DATA_SEG 
      START:  MOV AX,DATA_SEG   ;传送数据段基址给段寄存器DS    
           MOV DS,AX 
           MOV AX,OPER1     ;AX<--14D 
           ADD AX,OPER2     ;AX<--14D+(-25D) 
           JGE STORE      ;若AX≥0则转STORE 
           NEG AX        ;若AX<0则对AX取补 
      STORE:  MOV RESULT,AX      ;RESULT<--AX 
           HLT          ;CPU暂停处理 
      CODE_SEG ENDS         ;代码段结束 
           END START       ;过程结束 

  1. (1)结构类型的说明: 
      结构名 STRUCT 
          ……     ;数据定义语句 
      结构名 ENDS 
     (2)结构变量的定义: 
      变量名 结构名 <字段初值表> 
     注:结构说明只是定义了一个框架,并未分配主存空间,必须通过结构预置语句分配主存并初始化。  
     (3)用结构变量,只要直接书写结构变量名;要引用其中的某个字段,则采用圆点"."操作符,其格式是:结构变量名.结构字段名。
  2. (1)记录类型的说明采用伪指令RECORD,它的格式为: 
      记录名 RECORD 位段 [,位段…] 
      记录名给出了说明的记录类型,位段(也称字段)表示构成记录的数据结构。 
      记录中位段的格式为: 
       位段名:位数[=表达式] 
    整个记录的长度为1-16位,记录长度小于8位时,汇编成1个字节;长度为9-16位时,汇编成1个字。位段从低位(右)对齐,不用的位为0。 
     (2)记录变量的定义格式: 
       记录变量名 记录名<段初值表> 
     (3)"WIDTH 记录名/记录位段名"操作符返回记录或记录位段所占的位数。 
      "MASK 记录位段名"操作符返回一个8位或16位数值,其中对应该位段的个位为1,其余位为0。

第四章 汇编语言程序设计 答案习题

1、此题为两个八位无符号数相减,我们可以直接使用减法指令SUB来实现。

   源程序如下:

   SSEG     SEGMENT   STACK ‘STACK’

   STA       DW         100 DUP(?)

   SSEG     ENDS

   DSEG    SEGMENT   ‘DATA’

   BUF      DB           82,60

   DSEG     ENDS

   CSEG    SEGMENT    ‘CODE’

            ASSUME   CS:CSEG,DS:DSEG,SS:SSEG

   START:   MOV     AX,DSEG

             MOV     DS,AX

             MOV     AL,BUF

             SUB      AL,BUF+1

             MOV     BUF,AL

             MO      AH,4CH

             INT        21H

   CSEG     ENDS

             END      START

2、一般情况下,要改变一个字或一个字节中的某些位,可以利用逻辑运算操作来完成。本题应用两步来完成。第一步将x的低四清零,同时使最高位D7也清零;第二步再利用逻辑“或”变低四位为1010并同时使最高位D7为1。

   MOV  AL,DAT     ; 取x

      AND  AL,70H   ;清低四位和D7

       OR   AL,8AH   ;置低四位为1010,D7位为1

      MOV  DAT,AL   ;送回DAT单元

3、由于两数均为压缩的 BCD码,进行的是加法操作,因此可使用DAA指令进行相加后的十进制调整。高位数与高位数相加,低位数与低位数相加。程序如下:

   MOV  AL,BCD1         ;取BCD1低位数

   ADD  AL,BCD2         ;加BCD2低位数

   DAA                    ;调整

   MOV  BCD3,AL         ;低位相加结果送BCD3单元

   MOV  AL,BCD1+1       ;取BCD1高位数

   ADC  AL,BCD2+1       ;加BCD2高位数

   DAA                    ;调整

   MOV  BCD3+1,AL       ;高位数相加结果送BCD3+1单元

   HLT                    ;结束

4、此类拆字问题一般均采用移位指令。先将DAT单元内容取出,屏蔽高四位,送入DAT+2单元。再将DAT单元内容右移四位。即:将高四位移至低四位,高四位补0,送入DAT+1单元。

程序如下:

     MOV  AL,DAT

     MOV  DAT+2,AL

     AND  DAT+2,0FH

     MOV  CL,4

     SHR   AL,CL

     MOV  DAT+1,AL

     HLT

5、代码转换问题的解决,一般都有多种实现方法,但其中的主要操作过程是不变的。压缩的BCD码转换为ASCII码的主要操作过程为:

    1       拆开BCD码为两个字节。

    2       将BCD码高位移至低位

    3       将字节高四位屏蔽(置0)

    4       分别在高、低位字节上加30H

以下程序为实现BCD码到ASCII码的转换方法之一:

DATA     SEGMENT

BCDBUF  DB       34H,56H,23H,70H,96H,45H,32H,14H,81H,99H

;10个十进制数

COUNT   EQU      $-BCDBUF

ASCBUF   DB       20 DUP(?)

;需20个单元存放ASCII码

DATA     ENDS

STACK    SEGMENT    PARA STACK ‘STACK’

STAPN     DB          100 DUP(?)

STACK    ENDS

COSEG    SEGMENT

           ASSUME  CS:COSEG,DS:DATA,ES:DATA,SS:STACK

START:    PUSH  DS

           MOV  AX,0

           PUSH  AX

           MOV  AX,DATA

           MOV  DS,AX

           MOV  ES,AX

           MOV  SI,OFFSET  BCDBUF

           MOV  DI,OFFSET  ASCBUF

           CLD

;增量方向

TRANT:    LODSB

           MOV  BL,AL

           AND  AL,0FH

           OR   AL,30H

;低位十进制数—>ASCII码

           STOSB

           MOV  AL,BL

           PUSH  CX

           MOV  CL,4

           SHR   AL,CL

;右移四位

           POP  CX

           OR  AL,30H

;高位十进制数—>ASCII码

           STOSB

           LOOP   TRANT

           RET

COSEG    ENDS

           END  START

6、算法1:两两比较

  1、从存储单元分别取出x,y,z.

  2、将x与y进行比较,小者为d,大者为e.

  3、将z与d比较,若z不大于d,则d为中间值。

  4、若z大于d,再将z与e进行比较,小者为中间值。

 5、存中间值。

 编写程序:使用直接寻址方式存取数据。x,y,z和中间结果d,e分别存放于寄存器AH、AL、BH、BL和CH中。参考程序如下:

    MOV  AH,DATA

        MOV  AL,DATA+1

        MOV  BH,DATA+2

        CMP  AH,AL

        JAE   LP1

        MOV  BL,AH

        MOV  CH,AL

        JMP   LP2

  LP1:  MOV  BL,AL

        MOV  CH,AH

  LP2:  CMP  BH,BL

        JAE   LP3

        MOV  AL,BL

        JMP   SAV

  LP3:  CMP  BH,CH

        JB    LP4

        MOV  AL,CH

        JMP   SAV

  LP4:  MOV  AL,BH

  SAV:  MOV  BUF,AL

        HLT

算法2:比较换位

   我们假设x,y,z分别被存放于AL,BL,CL寄存器中,且AL中总是存放中间数。采用两数比较换位的方法,就可以最终在AL中得到中间数值。程序如下:

    MOV  AL,DATA

        MOV  BL,DATA+1

        MOV  CL,DATA+2

        CMP  AL,BL

        JB    LP1

        XCHG  AL,BL

LP1:   CMP   AL,CL

        JAE   SAV

        XCHG  AL,CL

        CMP   AL,BL

        JB     SAV

        XCHG  AL,BL

SAV:   MOV  BUF,AL

        HLT

注:程序中利用交换指令XCHG实现换位,以保证AL中总是中间值。

7、此类题目属于多条件多分支类型。对于正负数的判断,在上例中已有说明。而对于奇偶数的判断,只要判断最低位D0即可。若为0则为偶数,为1则为奇数。判断的顺序可以有两种。一种是先判正负,再判奇偶;另一种是先判奇偶,再判正负。我们选其中一种用程序实现。

程序如下:

        MOV  AL,DAT

        AND  AL,DAT

        JNS   POSI

        TEST  AL,01H

        JZ    M

        OR   AL,BUF

        JMP  DONE

M:     XOR  AL,BUF

        JMP  DONE

POSI:  TEST  AL,01H

       JZ   N

       ADD  AL,BUF

       JMP   DONE

N:     AND  AL,BUF

DONE: MOV  BUF,AL

       HLT

注:以上程序是先判正负,再判奇偶。

8、这是一个多分支问题。我们只需将AL中的内容分别与字符A,B和E的ASCII码相比较,就可以确定所要转向的地址。

   查ASCII码表可知:字符A的ASCII码为41H;

                     字符B的ASCII码为42H;

                  字符C 的ASCII码为45H.

编程如下:

         CMP  AL,41H

         JE    LPA

         CMP  AL,42H

         JE    LPB

         CMP  AL,45H

         JE    LPE

         JMP  LPN

9、本题为分支加简单运算。判断条件在零的左右,分支有三条,

程序如下:

         MOV  AL,DATA

         OR    AL,AL

         JZ     L1

         JNS    I1

         DEC    AL

         JMP    L1

I1:       INC    AL

L1:      MOV   Y,AL

         HLT

10、解决本题的方法有多种,其中最简单的方法是依次比较两个数组中的数据,小数存入C数组,直至两个数组中所有数据比较、处理完毕。具体操作过程为:

   用a1与b1比较,若a1小,则将a1存入C,再用a2与b1比较;否则,将b1存入C,再用a1与b2比较,比较之后仍将小数存入C,大数与小数的下一个数再进行比较。这种不断重复的操作过程可用以下形式来说明:

TOP       ai与bj比较(i,j=1,2,3,,20)

           若ai≤bj  则ai>Cz(z=1,2,3,,40)

                  i+1>i,转TOP

           若ai>bj  则bj>Cz

                  j+1>j,转TOP

当然,在编程时还需要有i,j,z的结束控制来完善上述的重复操作过程。参考程序如下:

SSEG   SEGMENT   STACK ‘STACK’

STR    DB          100 DUP(?)

SSEG   ENDS

DATA   SEGMENT

A       DB         ‘……

B       DB         ‘……

C       DB         40 DUP(?)

DATA   ENDS

CODE   SEGMENT

         ASSUME  CS:CODE,DS:DATA,ES:DATA,SS:SSEG

START:  MOV  AX,DATA

         MOV  DS,AX

         MOV  EX,AX

         LEA   SI,A

         LEA   DI,B

         LEA   BX,C

         MOV  AH,0

         MOV  CH,20

         MOV  CL,CH

LP:      CMP  CH,0

         JZ    SB

         CMP  CL,0

         JNZ   LP1

         MOV  AL,[SI]

         JMP   SA

LP1:     MOV  AL,[SI]

         CMP  AL,[DI]

         JG    SB

SA:      MOV  [BX],AL

         INC   SI

         DEC   CH

         JMP   NEXT

SB:      MOV  AL,[DI]

         MOV  [BX],AL

         INC   DI

         DEC  CL

NEXT:   INC   BX

         INC   AH

         CMP  AH,40

         JNZ   LP

DONE:   MOV  AH,4CH

         INT   21H

CODE    ENDS

          END     START

11、本题所要做的工作是将100个连续单元逐一清零。采用循环的方法最为简单。设置一个循环计数器,每清完一个单元,计数器减1,然后判断计数器是否为0,不为0则再去清一个存储单元,否则清零工作完成。

   一般情况下,已知循环次数的,循环判断放在循环体的后面。未知循环次数但已知结束条件的,循环判断置于循环体的前面。

编程如下:

         LEA   BX,BUF

         MOV  CL,64H

LP:      MOV  [BX],0

         INC   BX

         DEC  CL

         JNZ   LP

         HLT

注:以上采用字节操作,每次清一个存储单元。也可以采用字操作,每次清两个存储单元。

程序如下:

         LEA   BX,BUF

         MOV  CX,0032H

         MOV  AX,0

LP:      MOV  [BX],AX

         ADD  BX,2

         LOOP  LP

         HLT

注:当不知道所清单元个数但已知结束条件时,可编程序如下:

         LEA   BX,BUF

         MOV  AL,0FFH

LP:      CMP AL,[BX]

          JE   DONE

         MOV  [BX],0

         INC   BX

         JMP   LP

DONE:   HLT

12、判断数据的正负由每个字节数的最高位来决定。因此,可以对每个字节数进行一次自身的“与”操作,运算结果仍是数据本身不变,但要影响SF标志。因为符号标志SF总与逻辑运算结果的最高位(符号位)相同。当然,利用逻辑测试指令TEST加上对ZF标志的判断也能完成字节数正负的判断。

程序如下:

  10        MOV  CX,0064H

   20        LEA   BX,DAT

   30        MOV  AH,0

   40  LP:   MOV  AL,[BX]

   50        AND  AL,[BX]

   60        JNS   LP1

   70        INC   AH

   80  LP1:  INC   BX

   90        LOOP  LP

   100       MOV  MNUM,AH

   110       HLT

   该程序执行100次循环。循环体是从40行开始,到90行结束。循环次数由CX寄存器控制,其初值等于数据块长度。每循环一次,CX的内容减1。循环100次后,CX的内容等于0,结束循环。程序每循环一次,完成对数列中一个数的检查。在循环体中又含有一个条件转移指令,是用符号标志SF直接判断被检查的数是否负数,若是负数,寄存器AH加1;若为正数,满足转移条件,程序转移,AH内容不变并继续对数列的下一个数进行检查。

13、由题目已知数列长度为3,将其存入CX寄存器,用于计循环次数。数列之和存于BUF和BUF+1单元中。使用字操作可以简化程序。

程序如下:

  10          MOV  CX,3

  20          LEA   BX,DAT

  30          MOV  AX,0

  40          MOV  DX,AX

  50  LP:     MOV  DL,[BX]

  60          ADD  AX,DX

  70          INC   BX

  80          LOOP  LP

  90          MOV  BUF,AX

  100         HLT

注:该程序有三次循环。每次循环从50行开始至80行结束,这部分为循环体。循环次数由CX计数器来控制。由于计算累加是使用的字操作,也就省略了字节相加时对进位的处理,从而简化了程序。

14、这是一个典型的多分支带循环的问题。

程序如下:

          MOV   CX,0064H

          LEA    BX,NUMB

          MOV   AX,0

          MOV   COUNT,AX

          MOV   COUNT+2,AX

LP:      MOV   AL,[BX]

          CMP    AL,100

          JE      L100

          CMP    AL,60

          JC      L60

          INC     COUNT

          JMP     NEXT

L100:     INC     COUNT+1

         JMP     NEXT

L60:      OR      AL,AL

          JZ       L0

          INC      AH

          CMP     AH,11

          JNC      DONE1

          JMP      NEXT

L0:       INC      COUNT+2

          LOOP    LP

          JMP      DONE

DONE1:   MOV     COUNT,0FFH

DONE:    HLT

15、数据块的传送应首先考虑覆盖问题。如无覆盖,则正向、反向传送均可。如有覆盖区,则必须使用反向传送,以防止破坏数据区原有内容。

程序如下:

   方法一:正向传送:

                 MOV  AX,0

                 MOV  CX,0064H

                 LEA  SI,ADAT

                 LEA  DI,BDAT

         LP:        MOV  AL,[SI]

                 MOV  [DI],AL

                 INC    SI

                 INC    DI

                 LOOP  LP

                 HLT

   方法二:反向传送:

                 MOV  AX,0

                 MOV  CX,0064H

                 LEA   SI,ADAT+63H

                 LEA   DI,BDAT+63H

        LP:         MOV  AL,[DI]

                 MOV  [SI],AL

                 DEC   SI

                 DEC   DI

                 LOOP  LP

                 HLT

  方法三:串传送:

                 MOV  SI,OFFSET ADAT

                 MOV  DI,OFFSET BDAT

                 MOV  CX,100

                 CLD

                 REP   MOVSB

                 HLT

16、本题需另开辟一个数据区,长度与原数据区相同。将原数据区中经过判断的奇数放在新数据区的低地址单元,偶数放在高地址单元。待原数据区所有数据判断完毕,新数据区也就装满了。再将新数据区全部数据送回原数据区。程序开始要在新数据区设置两个指针。一个指针向数据区头,用于指示奇数存放单元。另一个指向数据区尾,用于指示偶数存放单元。两个指针相向移动。

编程如下:

SSEG    SEGMENT   STACK ‘STACK’

STA      DB         100 DUP(?)

SSEG    ENDS

DATA    SEGMENT

BUF      DB          50 DUP(?)

NEWD    DB

DATA    ENDS

CODE    SEGMENT

         ASSUME  CS:CODE,DS:DATA,ES:DATA,SS:SSEG

START:   MOV  AX,DATA

          MOV  DS,AX

          MOV  ES,AX

          LEA   BX,BUF

          LEA   SI,NEWD

          LEA   DI,NEWD+49

          MOV  CX,50

LP:       MOV  AL,[BX]

          TEST  AL,01H

          JZ     PP

          MOV  [SI],AL

          INC   SI

          JMP   NEXT

PP:       MOV  [DI],AL

          DEC  DI

NEXT:    INC   BX

          LOOP  LP

          LEA  SI,NEWD

          LEA  DI,BUF

          MOV  CX,50

          CLD

          REP   MOVSB

DONE:    MOV  AH,4CH

          INT   21H

CODE    ENDS

          END  START

17、本题需要从A地址起判断每一个字符是否为数字,若是则删除并将其后剩余字符依次向前递补,再将递补前最后一个字符位置用空格符(FFH)代替;否则判断下一个字符,判断后的操作同上,直至字符串所有字符判断完毕。

参考编程如下:

          LEA   BX,A           ;字符串首地址送BX

          MOV  CL,30           ;字符串长度送CL

LP1:      MOV  AL,[BX]         ;取1个字符

          CMP  AL,30H

          JC    NEXT            ;小于30H,转NEXT

          CMP  AL,3AH

          JNC   NEXT            ;大于39H,转NEXT

          MOV  DI,BX            ;是数字,做递补准备

          MOV  SI,DI

          INC    SI

          MOV   CH,CL

LP2:      MOV  AH,[SI]            ;依次递补

          MOV  [DI],AH

          INC    SI

          INC    DI

          DEC    CH

          JNZ    LP2               ;未完,继续递补

          MOV  [SI],0FFH           ;完成递补,最后补空格符

NEXT:    INC   BX

          DEC  CL

          JNZ   LP1                ;字符串未完,转LP1继续

          HLT                      ;结束

注:在上面的程序中看不到专门删除数字符的指令操作,这是因为只要是数字符,就要进行向前递补操作,当递补操作结束后,原来数字符位置已由其后面的字符覆盖,起到了实际上的删除作用。所以,没有必要再进行额外的删除操作。

18、通过题目要求,我们可以发现,每一单项的计算(乘法)过程是相同的,只是乘数与被乘数的值不同而已。这样,我们就可以将乘法操作用一个子程序来完成。乘数和被乘数在主程序中确定。

程序如下:

      MOV  AX,0

      MOV  RES,AX

      LEA   BX,NUMB

      MOV  AL,2

      CALL  SUBS

      MOV  AL,3

      INC   BX

      CALL  SUBS

      MOV  AL,5

      INC   BX

      CALL  SUBS

      HLT

SUBS  PROC   NEAR

      MUL  [BX]

      ADD  RES,AX

      MOV  AX,0

      RET

上面的程序在主程序部分使用了三次子程序指令,而实际上这三次如果使用循环的话只用一条即可完成。源程序如下:

   SSEG    SEGMENT   STACK ’STACK’

   STA     DB   100 DUP(?)

   SSEG    ENDS

   DATA    SEGMENT

   NUMB   DB   3 DUP(?)

   MUD    DB   2,3,5

   RES     DW   0

   DATA    ENDS

   CODE    SEGMENT

            ASSUME  CS:CODE,DS:DATA,SS:SSEG

   START:   MOV  AX,DATA

             MOV  DS,AX

             MOV  AX,0

             MOV  CX,3

             LEA  BX,NUMB

             LEA  DI,MUD

   LP:       MOV  AL,[DI]

             CALL  SUBS

             INC    BX

             INC    DI

             LOOP  LP

             MOV  AH,4CH

             INT    21H

   SUBS     PROC   NEAR

             MUL    [BX]

             ADD    RES,AX

             MOV    AX,0

            RET

   SUBS     ENDP

   CODE     ENDS

             END     START

   这个程序与前一个比较起来似乎并不简单,但如果题目中所要求进行运算的项数比较多时,这个程序的通用性和高效率就会显现出来了。

19、作为一个通用子程序,就必须要把子程序中要用到的寄存器原值内容保存起来。在子程序工作结束后恢复它们,然后返回。但是应该注意的是:如果使用寄存器在主程序和子程序之间传送参数的话,那么该寄存器的值就不一定要保存。特别是用来向主程序回送结果的寄存器,就更不应该因保存和恢复寄存器而破坏了应该向主程序传送的信息。

程序如下:

   SSEG    SEGMENT    STACK ‘STACK’

   STA      DB          100 DUP(?)

   SSEG    ENDS

   DATA    SEGMENT

   NUB     DB           4 DUP(?)

   DATA    ENDS

   CODE    SEGMENT

            ASSUME    CS:CODE,DS:DATA,ES:DATA,SS:SSEG

   SUBS    PROC 

            PUSH      AX

            PUSH      BX

            PUSH      DI

            MOV      AX,DATA

            MOV       DS,AX

            MOV       ES,AX

            MOV       AX,0

           LEA        BX,NUB

            MOV       DI,BX

            ADD       DI,2

            MOV       AL,[BX]

            INC        BX

            MUL        [BX]

            POP        DI

            POP        BX

            POP        AX

            RET

   SUBS    ENDP

   CODE    ENDS

             END

20、解决本题可以先设置两个寄存器,分别存放相对重复次数最多的字符和字符数。每当字符串中一个字符的重复次数统计完毕后,都与记录相对重复次数最多的寄存器内容进行比较,大者存入该寄存器并记录相应的字符。如此逐个判断、统计,直至字符串结束。最后将重复次数最多的字符送入CMORE单元中。

参考编程如下:

           LEA   BX,CSTRN          ;字符串首地址送BX

           MOV  CL,50               ;字符串长度送CL

           MOV  DX,0

           MOV  AL,[BX]

           MOV  CMORE,AL

LP:          MOV  AL,[BX]

           CALL  CPP                 ;调统计重复字符数子程序

           CMP   DH,DL               ;重复字符数比较

           JNC   NEXT

           MOV  DH,DL

           MOV  CMORE,AL

NEXT:       INC   BX

           DEC  CL

           JNZ  LP                      ;字符串未完,继续

           HLT

            

CPP          PROC

             MOV  CH,CL

             MOV  SI,BX

           INC   SI

LP1:         CMP  AL,[SI]                  ;判断是否重复            

           JNZ   NEXT1                  ;不重复,转NEXT1

           INC  DL                       ;重复,DL计数器增1

NEXT1:      INC  SI

           DEC  CH

           JNZ  LP1                      ;统计未完,继续

           RET                           ;返回

CPP          ENDP

21、宏展开为:

   +   ADDITION  MACRO  X,Y,Z

                   PUSH    AX

                   MOV    AX,X

                   ADD     AX,Y

                   MOV     Z,AX

                   POP      AX

                   ENDM

形成宏定义ADDITION。

22、宏定义:

   PUSH_TAB  MACRO  K

               PUSH    TAB+K

               ENDM

   宏调用:

   I=0

               REPT  17

               PUSH_TAB %I

   I=I+1

               ENDM

   宏展开:

   +           PUSH  TAB+0

   +           PUSH  TAB+1

              .

              .

   +           PUSH  TAB+16

23、程序段如下:

   ARRAY  LABEL  WORD

            REPT    99

            DW     $+2

            ENDM

            DW     ARRAY

   经汇编后得

   +     DW    $+2    

   +     DW    $+2

          .               99个字

          .

   +     DW    $+2

         DW    ARRAY

24、宏定义:

   MAX  MACRO  K,A,B,C

          LOCAL  NEXT,OUT

          MOV     AX,A

          IF        K1

          IF        K2

          CMP      C,AX

          JLE       NEXT

          MOV      AX,C

          ENDIF

   NEXT:CMP      B,AX

          JLE      OUT

          MOV     AX,B

          ENDIF

   OUT:

         ENDM

25、程序段如下:

   INPUT:  IN     AL,STAT1            ;测试设备1

             TEST  AL,20H               ;是否可用

             JZ     DEV2                  ;不可用则转入测试设备2

             CALL  FAR PTR PROC1        ;可用则从设备1输入

   DEV2:   IN     AL,STAT2             ;测试设备2

             TEST   AL,20H               ;是否可用

             JZ      DEV3                 ;不可用则转入测试设备3

             CALL   FAR PTR PROC2        ;可用则从设备2输入

   DEV3:   IN      AL,STAT3            ;测试设备3

             TEST    AL,20H              ;是否可用

                          JZ       NO_INPUT            ;不可用则转入NO_INPUT,如可用的输入设备

             CALL   FAR PTR PROC3        ;可用则从设备3输入

   NO_INPUT:

第五章 32位指令及其编程 答案习题

  1. 实模式:寻址采用和8086相同的16位段和偏移量,最大寻址空间1MB,最大分段64KB。可以使用32位指令。32位的x86 CPU用做高速的8086。 
    保护模式:寻址采用32位段和偏移量,最大寻址空间4GB,最大分段4GB (Pentium Pre及以后为64GB)。在保护模式下CPU可以进入虚拟8086方式,这是在保护模式下的实模式程序运行环境。
  2. SS,保存堆栈指针的寄存器。
  3. 8个32位通用寄存器分别是:EAX,EBX,ECX,EDX,ESI,EDI,EBP,ESP。它们都可以保存数据,暂存运算结果,也都可以存放存储器地址用于基址/变址寻址。对比16位x86 CPU只有BX/BP/SI/DI可以实现寄存器间接寻址,可见,32位通用寄存器更具有通用性。
  4. 相对于原来16位指令代码格式,32位指令格式仅增加了两个关键的长度超越前缀指令。操作数长度超越和地址长度超越,指令代码分别为66H和67H。作用如下: 
    操作数长度超越--根据处理器所处的工作方式不同,一条指令会默认使用16位或32位的操作数,使用操作数长度前缀后,将默认使用16/32位操作数的指令分别转为使用32/16位操作数。 
    地址长度超越--地址长度决定了指令中位移量的长度和有效地址计算时产生的地址位移长度。处理器在不同的工作方式下,指令会默认使用原16位地址或新的32位地址寻址存储器,使用地址长度前缀后,将默认使用16/32位地址的指令分别转为使用32/16位地址。
  5. 新增的标志及其含义如下: 
      NT(D14):任务嵌套标志。若NT=1,表示当前执行的任务,嵌套于另一个任务中,待执行完毕时应返回原来的任务。 
      IOPL(D13D12):I/O特权层标志,共2位,编码表示4个特权级别,用来指定任务的I/O操作处于4个特权级别的哪一层。 
      VM(D17):虚拟8086方式,当32位x86 CPU处于保护方式时,如果使VM=1置位,32位x86 CPU将进入虚拟8086方式。 
      RF(D16):恢复标志。这个标志与调试寄存器一起使用。 
      AC(D18):对齐检测标志。设置是否在存储器访问时进行数据对齐检测。 
      VIF(D19):虚拟中断标志。IF中断允许标志的虚拟影象,与VIP连用。 
      VIP(D20):虚拟中断挂起标志。此标志置位指示有一个中断被挂起。 
      ID(D21):CPU识别标志。程序如果能够置位和复位这个标志位,则表示该微处理器支持CPU识别指令CPUID。
  6. 支持原8086的16位寻址方式: 
    有效地址 = 基址寄存器(BX/BP)+变址寄存器(SI/DI)+8/16位常数。增加32位寻址方式:有效地址 = 基址寄存器(8个32位通用寄存器之一)+变址寄存器(除ESP的通用寄存器之一)×比例因子(1/2/4/8)+8/32位常数。BP,EBP,ESP作为基址寄存器时默认段寄存器为SS,其他为DS。数据宽度有字节(8位)、字(16位)和双字(32位)。
  7. (1)立即数寻址 
    (2)直接寻址 
    (3)相对基址变址寻址 
    (4)带比例的变址寻址 
    (5)基址的带位移量的带比例的变址寻址
  8. 当用PUSH指令把堆栈指针(E)SP压入堆栈时,8086/8088是将SP减2后的值进栈,而80286后的处理器是将进栈前的(E)SP值进栈。
  9. 指令如下: 
      LEA EAX,[EBX+ESI*2+1234H] 
      要保证该运算的正确必须使这条指令在32位段中执行。
  10. 指令如下: 
      MOV DX,3FCH 
      IN   EAX,DX
  11. (1)(SP)<-(SP)-2 
    ((SP)+1,(SP))<- [BX] 
      (2)32位通用寄存器依次进栈,进栈次序为:EAX,ECX,EDX,EBX,指令执行前的ESP,EBP,ESI和EDI。指令执行后(SP)<- (SP)-32。 
      (3)将立即数4压入堆栈。 
      (4)将32位通用寄存器ESI弹出堆栈。
  12. (1)有效地址为:00001000H + 00002000H = 00003000H。 
      (2)有效地址为:00001000H + 2*00002000H = 00005000H。 
      (3)有效地址为:4*00001000H + 00002000H + 1000H = 00007000H。
  13. (1)错误。AX是16位的,而ECX是32位的。 
      (2)正确。因为在32位存储器寻址中变址寄存器可以是除ESP之外的任何32位通用寄存器之一,而16位存储器寻址中变址寄存器只能是SI或DI。所以在这里ECX是可以做变址寄存器的。
  14. 此指令执行的操作是:DX*100H->BX。 
    DX与100H的乘积有可能溢出。如果溢出,那么高位部分被丢掉,并置CF=OF=1表示;如果没有溢出,则CF=OF=0。
  15. 程序段如下: 
    MOV EDX,0    ;将EDX置0 
    ADD EAX,EBX  ;EAX和EBX累加和到EAX 
    ADD EAX,ECX  ;EAX和ECX累加和到EAX,则EAX中为累加和。 
    ADC EDX,0    ;将CF存入EDX
  16. (1)EAX = 2CEFF93H 
      (2)EAX = 09090804H
  17. 要使操作数的某些位变反,可以使用XOR指令,只要将源操作数的立即数字段的相应位置成1就可以达到目的。此题要求第0,1位变反,可用如下指令: 
    XOR EAX,3H
  18. 编制程序如下: 
    MOV CX,16 
    ROL  EAX,CX 
    ADD  EAX,EBX
  19. 程序段如下: 
      ROR ECX,2  ;CX低2位移入了ECX的高2位 
      REP MOVSD  ;使用CX为计数器,每次传送双字 
      ROL ECX,1   
      REP MOVSW  ;传送可能余下的字 
      ROL ECX,1 
      REP MOVSB   ;传送可能余下的字节
  20. 指令 JECXZ label 是当ECX=0时,转移到label指定的段内偏移地址处。但要注意的是它的偏移量只能是在-128 ~ +127范围内。
 
 
 
 
 
 
 

《汇编语言程序设计》试题A

 
一、 数制转换填空(10分)

    十进制数 二进制数 十六进制数
    119      
       11110010   
          DF
       00010111   
          5A
    120      

二、 填空(20分)

  1. Intel 8086 CPU的段寄存器有______________________________________________。
  2. Intel 8086 CPU的SP寄存器的主要作用是____________________________________。
  3. (CS)=1000H,(DS)=2000H,(ES)=3000H,(SS)=4000H,(DI)=a100,操作数 [DI+1000H] 的寻址方式是____________________,物理地址是________________ 。
  4. 标志寄存器中OF标志位的主要作用是__________________________________。
  5. TEST指令的功能是__________________________________。
  6. 指令LEA__AX, [SI+100H]的具体操作是______________________________。
  7. 有符号二进制字节数可表示的数的范围是____________________________ 。
  8. 执行一条POP__AX指令后,SP的内容发生的变化是______________________。
  9. AL寄存器的内容为28H,执行指令OR__AL, 33H后,AL的值为____________。
  10. 测试寄存器AL和BL的值是否相等而不改变其值应使用指令__________________。

三、 判断以下各语句是否有错误,如有错误请说明错误原因(20分)

  1. MOV AX, 0
  2. MOV [1000H], 1000H
  3. MOV BL, AX
  4. MOV [0], AX
  5. PUSH PSW
  6. SHR DX, BL
  7. MUL AL, BL
  8. AND AX, [1000]
  9. XCHG CS, DS
  10. LDS AL, [BX]

四、 读程序(30分)

1. 已知(DS)=091DH,(AX)=1234H,(BX)=0024H,(CX)=5678H,(SI)=0012H,(DI)=0032H,[09226H]=00F6H,[09228H]=1E40H,[0922AH]=3500H,[0922CH]=1000H,[0922EH]=0040H,分别填写独立执行以下各指令后的结果。 
 ①、MOV CL,20H[BX][SI]  ; (CL)=(    ) 
 ②、LEA BX,20H[BX][SI]  ; (BX)=(    ) 
 ③、LDS SI,[BX][DI]    ; (SI)=(    )  
 ④、MOV [SI],BX     ; [SI]=(    ) 
 ⑤、XCHG CX,32H[BX]   ; (CX)=(    ) 
2. 写出下列程序段执行过程中,AL、DL寄存器及CF标志的值。 
 MOV CL, 2 
 MOV AL, 66H 
 MOV DL, AL 
 AND AL, 0F0H ; (AL)=(    ) 
 OR AL, 77H 
 SHR DL, CL ; (DL)=(    ) (CF)=(    ) 
 OR DL, 30H ; (DL)=(    )  
3. 分别填写下列操作数的寻址方式。若是存储器寻址,填写有效地址和物理地址的表达式。

       寻址方式 有效地址 物理地址
    ① [10]         
    ② [BX][DI]         
    ③ [BX][SI][20]         
    ④ [BP]         
    ⑤ AL         

4. 以下为一程序段,填写每条语句执行后AX寄存器及CF、SF和ZF标志的值。

   AX CF OF ZF
MOV AX, 0FFFFH            
INC AX            
ADD AX, 7FFFH            
NOT AX            
ADD AX, 0FFFFH            
SUB AX, 8000H            

五、 写程序(20分)

1. 编写一程序片段,将AL寄存器的低四位内容复制到AL寄存器的高四位。 
2. 在数据段偏移量为100H开始的存储空间内连续存放着10个字节型无符号二进制数,编写一段程序,求出该10个数之和,并将结果存放在寄存器AX中。

《汇编语言程序设计》试题B

 
一、 数制转换填空(10分)

十进制数 二进制原码 二进制反码 二进制补码
19         
-92         
-127         

二、 填空(20分)

  1. Intel 8086 CPU的通用寄存器有__________________________________________。
  2. Intel 8086 CPU的IP寄存器的作用是____________________________________ 。
  3. (CS)=1000H,(DS)=2000H,(ES)=3000H,(SS)=4000H,操作数[1000H]寻址方式是____________ ______ ,物理地址是________________ 。
  4. 标志寄存器中CF标志位的主要作用是__________________________________。
  5. NEG指令的功能是__________________________________。
  6. 指令MUL__CL的具体操作是______________________________。
  7. 无符号二进制字节数可表示的数的范围是____________________________ 。
  8. 执行一条PUSH__AX指令后,SP的内容发生的变化是______________________。
  9. AL寄存器的内容为28H,执行指令AND__AL, 33H后,AL的值为____________。
  10. 测试寄存器AL和BL的值是否相等而不改变其值应使用指令__________________。

三、 判断以下各语句是否有错误,如有错误请说明错误原因(20分)

  1. MOV CS, 100H
  2. MOV [1000H], 0
  3. MOV 1023H, AX
  4. MOV CS, AX
  5. PUSH AL
  6. SHR DX, 4
  7. MOV AL, 1234H
  8. MOV AL, AH+1
  9. XCHG 1000H, AX
  10. LDS SS, [BX]

四、 读程序(30分)

1. 已知(DS)=091DH,(AX)=1234H,(BX)=0026H,(CX)=5678H,(SI)=0012H,(DI)=0034H,[09226H]=0F62H,[09228H]=4020H,[0922AH]=3529H,[0922CH]=1111H,[0922EH]=0440H,分别填写独立执行以下各指令后的结果。 
① MOV CL,20H[BX][SI]  ; (CL)=(    ) 
② LEA BX,20H[BX][SI]  ; (BX)=(    ) 
③ LDS SI,[BX][DI]    ; (SI)=(    )  
④ MOV [SI],BX     ; [SI]=(    ) 
⑤ XCHG CX,32H[BX]   ; (CX)=(    ) 
2. 写出下列程序段执行过程中,AL、DL寄存器及CF标志的值。 
MOV CL, 4 
MOV AL, 81H 
MOV DL, AL 
AND AL, 0FH ; (AL)=(    ) 
OR AL, 30H 
SHR DL, CL ; (DL)=(    ) (CF)=(    ) 
OR DL, 30H ; (DL)=(    )  
 
3. 分别填写下列操作数的寻址方式。若是存储器寻址,填写有效地址和物理地址的表达式。

       寻址方式 有效地址 物理地址
    ① 2100H         
    ② [BX][SI]         
    ③ [BX+SI+20H]         
    ④ [BP]         
    ⑤ AX         

4. 以下为一程序段,填写每条语句执行后AX寄存器及CF、SF和ZF标志的值。

   AX CF OF ZF
SUB AX, AX            
DEC AX            
ADD AX, 7FFFH            
NOT AX            
SUB AX, 0FFFFH            
ADD AX, 8000H            

五、 写程序(20分)

 
1. 编写一程序片段,将AL寄存器的低四位内容与BL寄存器低四位内容交换。 
2. 在数据段偏移量为100H开始的存储空间内连续存放着100个字节型有符号二进制数,编写一段程序,找出其中的最大值和最小值,并分别存放在寄存器DH和DL中。
 

《汇编语言程序设计》试题A 答案

一、 数制转换填空

十进制数 二进制数 十六进制数
119 01110111 77
242 11110010 F2
223 11011111 DF
23 00010111 17
90 01011010 5A
120 01111000 78

二、 填空

  1. DS、CS、ES、SS
  2. 堆栈指针寄存器,用于记录堆栈区偏移量。
  3. 寻址方式:寄存器相对寻址,物理地址:21100H。
  4. 用于判断有符号数加减运算的结果是否溢出。
  5. "与"测试,对两个操作数作与操作,只影响标志,不产生结果。
  6. 将寄存器SI的内容与100H相加的和送AX寄存器。
  7. -128 ~ +127
  8. SP的值加2。
  9. 3BH。
  10. CMP AL, BL

三、 判断以下各语句是否有错误,如有错误请说明错误原因(20分)

  1. 正确。
  2. 错误,传送类型不明确。
  3. 错误,寄存器长度不相等。
  4. 正确。
  5. 错误,非法指令,应为PUSHF。
  6. 错误,第二个操作数必须为1或CL。
  7. 错误,MUL指令只能有一个操作数。
  8. 正确。
  9. 错误,CS不能参与交换。
  10. 错误,第一个操作数必须为16位通用寄存器。

四、 读程序(30分)

1. (CL) = 0F6H, (BX) = 9226H, (SI) = 00F6H, [SI] = 0024H, (CX) = 00F6H 
2. (AL) = 60H, (DL) = 1DH, (CF) = 1, (DL) = 3DH

 
3.

       寻址方式 有效地址 物理地址
    ① [10] 立即寻址 10 (DS)X10H+10
    ② [BX][DI] 基址变址寻址 (BX)+(DI) (DS)X10H+(BX)+(DI)
    ③ [BX][SI][20] 相对基址变址寻址 (BX)+(DI)+20 (DS)X10H+(BX)+(DI)+20
    ④ [BP] 寄存器间接寻址 (BP) (SS)X10H+(BP)
    ⑤ AL 寄存器寻址 -- --

4.

   AX CF OF ZF
MOV AX, 0FFFFH FFFFH X X X
INC AX 0 X 0 1
ADD AX, 7FFFH 7FFFH 0 0 0
NOT AX 8000H 0 0 0
ADD AX, 0FFFFH 7FFFH 1 1 0
SUB AX, 8000H 0FFFFH 1 1 0

五、 写程序(20分)

1.  MOV  BL,AL 
   MOV  CL,4 
   ROL  BL,CL 
   AND  BL,0F0H 
   AND  AL,0FH 
   OR  AL,BL 
2.  MOV  SI,100 
   XOR  AX,AX 
   MOV  CX,10 
   P01:  ADDAL,[SI] 
   ADC  AH,0 
   INC  SI  
   LOOP  p01

《汇编语言程序设计》试题B 答案

 
一、 数制转换填空(10分)

十进制数 二进制原码 二进制反码 二进制补码
19 0001 0011 0001 0011 0001 0011
-92 1101 1100 1010 0011 1010 0100
-127 1111 1111 1000 0000 1000 0001

二、 填空(20分)

  1. AX、BX、CX、DX、SI、DI、SP、BP
  2. 指令指针寄存器,指向下一条要执行的指令的地址。
  3. 寻址方式:直接寻址,物理地址:21000H。
  4. 进位/借位标志,加法中标志进位,减法中标志借位。
  5. 求补,即求反加1。
  6. 无符号乘:(CL)X(AL)→(AX)
  7. 0~255。
  8. SP的值减2。
  9. (AL) = 20H。
  10. CMP AL, BL

三、 判断以下各语句是否有错误,如有错误请说明错误原因(20分) 
 
1. 错误,立即数不能送段寄存器。 
2. 错误,传送类型不明确。 
3. 错误,立即数不能作为目标。 
4. 错误,不能改变CS寄存器。 
5. 错误,操作数必须为字类型。 
6. 错误,第二个操作数只能为1或CL。 
7. 错误,源操作数太大。 
8. 错误,源操作数非法。 
9. 错误,立即数不能参与交换。 
10. 错误,第一个操作数不能是段寄存器。

四、 读程序(30分)

1. (CL) = 20H, (BX) = 9228H, (SI) = 3529H [SI] = 0026H, (CX) = 4020H 
2. (AL) = 01H, (DL) = 08H, (CF) = 0, (DL) = 38H 
 
 
3. 分别填写下列操作数的寻址方式。若是存储器寻址,填写有效地址和物理地址的表达式。

       寻址方式 有效地址 物理地址
    ① 2100H 立即数寻址 - -
    ② [BX][SI] 基址变址寻址 (BX)+(SI) (DS)X10H+(BX)+(SI)
    ③ [BX+SI+20H] 相对基址变址寻址 (BX)+(SI)+20H (DS)X10H+(BX)+(SI)+20H
    ④ [BP] 寄存器间接寻址 (BP) (SS)X10H+(BP)
    ⑤ AX 寄存器寻址 - -

4. 以下为一程序段,填写每条语句执行后AX寄存器及CF、SF和ZF标志的值。

   AX CF OF ZF
SUB AX, AX 0 0 0 1
DEC AX FFFFH 0 1 0
ADD AX, 7FFFH 7FFEH 1 0 0
NOT AX 8001H 1 1 0
SUB AX, 0FFFFH 8002H 1 1 0
ADD AX, 8000H 0000H 1 0 0

五、 写程序(20分)

1.  MOV CL, AL 
   MOV  CH, BL 
   AND  AL, 0F0H 
   AND  BL, 0F0H 
   AND  CL, 0FH 
   AND  CH, 0FH 
   OR   AL, CH 
   OR   BL, CL 
2.  MOV  SI, 100 
   MOV  CX, 100 
   MOV  DH, -128 
   MOV  DL, +127 
L01:CMP   DH, [SI] 
   JL   L02 
   MOV  DH, [SI] 
L02:CMP   DL, [SI] 
   JG   L03 
   MOV  DL, [SI] 
L03:INC   SI 
   LOOP  L01

Feedback

# re: 汇编习题答案精心收集  回复  更多评论   

2009-03-14 16:27 by 肖锋
五、读程序(15分)

要求:(1)在每条指令后给出作用注释。

(2)画出程序流程框图。

(3)该程序完成什么功能?

CSEG SEGMENT

MAIN RPOC RAR

ASSUME CS:CSEG,DS:CSEG

START: PUSH DS

XOR AX,AX

PUSH AX

PUSH CS

POP DS

MOV DX,64H

MOV BX,300

MOV SI,0

MOV DI,0

NEXT: MOV AL,BYTE PTR NUM1 [BX][SI]

ADD AL,AL

MOV NUM2[DI],AL

INC DI

INC SI

LOOP NEXT

RET

MAIN ENDP

NUM1 DW 500 DUP(?)

NUM2 DB 140 DUP(?)

CSEG ENDS

END START




只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理