|
Posted on 2007-11-19 19:10 山泉弯延 阅读(15367) 评论(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) 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)
第三章 汇编语言程序格式 习题
- 简述汇编语言程序的两种格式。(3.1)
- 简述汇编语言程序的命令行开发过程。(3.1)
- 简述汇编语言程序的集成化开发过程(PWB)。(3.1)
- 下面两条语句有何区别:(3.2.1)
X1 EQU 1000H X2 = 1000H
- 指令
AND AX,OPD1 AND OPD2 中,OPD1和OPD2是两个已赋值的变量,问两个AND操作分别在什么时间进行?有什么区别?(3.2.1)
- 下列程序完成什么工作?(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
- 变量DATAX和变量DATAY的定义如下:(3.2.2)
DATAX DW 0148H DW 2316H DATAY DW 0237H DW 4052H 按下述要求写出指令序列: (1)DATAX和DATAY中的两个字数据相加,和存放在DATAY及DATAY+2中。 (2)DATAX双字除以字DATAY。
- 下列指令序列有何错误?请改正,并指出AX,AL的内容。(3.2.2)
OPER1 DB 1,2 OPER2 DW 1234H,5678H MOV AX,OPER1+1 MOV AL,OPER2
- 单条执行如下程序,每一步有关寄存器的内容是什么?(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
- 试列出几种方法使汇编程序把5150H存入一个存储器字中。(3.2.2)
- 下面的语句中有数据0102H的字存储单元有多少?(3.2.2)
DB 10H DUP(1,2 DUP(2))
- 如要求把首地址为BLOCK的字数组的第6个字传送到DX寄存器,可用什么指令?(3.2.2)
- 下述程序段执行后,寄存器AX和BX的内容分别是多少?(3.2.2)
NUM EQU 945H ALPH=35*27 MOV AX,ALPH LE NUM MOV BX,ALPH GT NUM
- 下述程序段执行后,寄存器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
- 对于下面的数据定义,三条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
- 程序在数据段中定义的数组如下:(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]
- 假设数据段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
- 写出以下数据段中每个符号所对应的值。(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
- 用段伪操作定义一个数据段DATA_SEG,要求段界起始与字边界,连接时,该段将与同名逻辑段连接成一个物理段,类别为"DATA"。(3.2.3)
- 假设程序中的数据定义如下:(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域的实际长度。
- 给出等值语句如下:
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
- 对于下列指令写出汇编后的结果。(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
- 指出下列伪指令表达方式的错误,并改正之。(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
- 某一程序的数据段中有如下几条伪指令语句,试分析各变量的属性。(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
- 某程序中的数据段内容如下所示,请指出变量BUF和NUM的偏移地址为多少?(3.3)
DATA SEGMENT ORG 10 BUF DB 'ABCD' ORG ﹩+5 NUM DW 50 DATA ENDS
- 如数组ARRAY定义如下,试写出把数组长度(字数)存入CX寄存器的指令。(3.3)
ARRAY DW 1,2,3,4,5,6,7 END DW ?
- 请把40个字母a的字符串从源缓冲区传送到目的缓冲区。(3.3)
- 编一完整程序求两数14与-25和的绝对值。(3.3)
- 结构数据类型如何说明、结构变量如何定义、结构字段如何应用?(3.4)
- 记录数据类型如何说明,记录变量如何定义,WIDTH和MASK操作符是什么作用?(3.4)
第四章 汇编语言程序设计 习题
- 已知两个八位无符号数x和y,分别存放在BUF和BUF+1单元中,且x>y。请编程序计算x-y,结果存回BUF单元。(4.1)
- 已知DAT单元有一数x。现要求编程将x的低四位变为1010,最高位D7置为1,其它三位不变。(4.1)
- 已知有两个压缩BCD数BCD1和BCD2,其在内存存放形式为:
(BCD1)=34 (BCD1+1)=18 (BCD2)=89 (BCD2+1)=27 高位字节为高位数。要求编程将BCD1和BCD2相加,结果送BCD3开始的存储单元。(4.1)
- DAT单元的内容拆成高、低各四位,然后分别存于DAT+1及DAT+2的低四位。(4.1)
- 内存某一缓冲区中存放着十个单元的BCD码,每个单元中放两位BCD码(压缩BCD码)。要求把它们分别转换为ASCII码。高位BCD码转换后放在高地址单元。(4.1)
- 三个无符号数x,y,z,均小于等于255,分别存于DATA,DATA+1和DATA+2单元中。现要找出三个数中数值大小居中的一个,并将其存入BUF单元中。(4.2)
- 已知在DAT单元内有一带符号数x。试编一程序,根据x的具体情况进行如下处理:
若x为正奇数,则将x与BUF单元内容相加; 若x为正偶数,则将x与BUF单元内容相"与"; 若x为负奇数,则将x与BUF单元内容相"或"; 若x为负偶数,则将x与BUF单元内容相"异或"。 以上四种情况运算的结果都送回BUF单元。零作为正偶数处理。(4.2)
- 累加器AL中有一字符,用ASCII码表示。当其为"A"时,程序转移到LPA处;如为"B",则转移到LPB处;如为"E",则转移到LPE处,否则,均转向LPN处。(4.2)
- 在DATA单元有一个二进制数x,要求编程完成运算:(4.2)
- 数组A和B,各有20个数据,它们均已按升序排放。现要求将这两个数组合并为一个数组C,且要求其数据也按升序排放,试编程实现。(4.2)
- 编一程序,要求将BUF单元开始的100个存储单元全部清零。若不知所清单元长度,只知以0FFH作为结束标志,又该如何处理?(4.3)
- 有一数据块,长度为100字节,存放于DAT开始的存储单元。要求将此数据块中的负数的个数统计出来,并将统计结果存入MNUM单元中。(4.3)
- 有一个由八位数组成的数列,长度为三字节,存放地址始于DAT单元。求此数列的算术和并存于BUF和BUF+1单元。已知数列之和为十六位数。(4.3)
- 从NUMB单元起有100个数,其值在0~100之间。试编程实现以下数据统计:
(1) 有多少个大于等于60的数?统计结果存于COUNT单元。 (2) 有多少个为100的数?统计结果存于COUNT+1单元。 (3) 有多少个为0的数?统计结果存于 COUNT+2单元。 (4) 当小于60的数超过十个,则结束统计,同时置COUNT单元为0FFH。(4.3)
- 将ADAT单元起的100个字节数据,传送到BDAT开始的单元中去。已知数据区无覆盖问题,要求用三种方法实现。(4.3)
- 将BUF单元开始的50个字节数,区分出奇、偶数。将奇数在前,偶数在后,仍存回原数据区。(4.3)
- 对A址起的30个字节长的字符串,删除其中的数字符,后续字符向前递补,剩余字符补空格字符,编程实现。(4.3)
- 已知有三个八位无符号数x,y,z,分别存放于NUMB,NUMB+1和NUMB+2单元。要求编一程序实现2x+3y+5z,并要求将运算结果送RES单元和RES+1单元。(4.4)
- 将两个八位无符号数乘法的程序编为一个子程序。被乘数、乘数和乘积存放于自NUB开始的四个存储单元中。(4.4)
- 将CSTRN起的50个字符的串,统计相同字符的字符数,找出相同字符数最多字符,存于CMORE单元中。(4.4)
- 宏定义体内不仅可以使用宏调用,也可以包含宏定义。以下宏定义:
其中MACNAM是内层的宏定义名,但又是外层宏定义的哑元,当调用DEFMAC时,就形成一个宏定义。写出宏调用: DEFMAC ADDITION,ADD的宏展开。(4.5)
- 用宏定义及重复伪操作把TAB,TAB+1,TAB+2,……,TAB+16的内容存入堆栈。(4.5)
- 要求建立一个100D字的数组,其中每个字的内容是下一个字的地址,而最后一个字的内容是第一个字的地址。(4.5)
- 试定义宏指令MAX把三个变元中的最大值放在AX中,而且使变元数不同时产生不同的程序段。(4.5)
- 编一个程序模块完成轮流查询三个数据输入设备的功能。(4.6)
第五章 32位指令及其编程 习题
- 试述什么是实模式、保护模式和虚拟8086方式?(5.1.1)
- 在以BP、EBP、ESP作为基址寄存器访问存储器操作数时,其默认的段寄存器是______;但是,通常ESP作为________,不应该将它用于其他目的。(5.1.1)
- 为什么说32位通用寄存器比16位通用寄存器更通用?(5.1.1)
- 32位指令新增了哪些超越指令前缀,代码为66H和67H的超越前缀是什么作用?(5.1.1)
- 试述32位x86 CPU的标志寄存器EFLAGS相对于原来的16位FLAGS寄存器新增那些标志位,其说明其含义。(5.1.1)
- 试述16位存储器寻址与32位存储器寻址在计算有效地址上有哪些不同。(5.1.2)
- 指出下列传送指令中源操作数的寻址方式。(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]
- 8086/8088处理器和80286后的处理器在对PUSH指令的处理上有什么不同?(5.2.1)
- 试用一条LEA指令实现如下运算操作:
EAX<--EBX+ESI*2+1234H 能够保证该运算正确的条件是什么?(5.2.1)
- 写指令从端口03FCH送一个双字到EAX寄存器。(5.2.1)
- 说明下列指令的操作。(5.2.1)
(1) PUSH [BX] (2) PUSHAD (3) PUSH 4 (4) POP ESI
- 假设(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]
- 说明下面两条指令是否正确。(5.2.2)
(1) ADD ECX,AX (2) MOV AX,[EBX,ECX]
- 说明指令IMUL BX,DX,100H完成的操作。(5.2.2)
- 写一个程序段,求EAX、EBX、ECX的和。若有进位则将1存入EDX;否则EDX存入0,EAX为累加和。(5.2.2)
- 指出下列指令序列执行完后目的寄存器的内容。(5.2.2)
(1) MOV EAX,299FF94H ADD EAX,34FFFFH (2) MOV EAX,39393834H AND EAX,0F0F0F0FH
- 要求将EAX中的第0,1位取反,用什么指令?(5.2.3)
- 如(EAX)= 00001122H,(EBX)= 00003344H,要求把它们装配在一起形成
(EAX)= 11223344H,试编程实现。(5.2.3)
- 在实方式下(16位段)编程序段,把长度为CX字节的数据块从DS:SI指定的源存储区搬到ES:DI指定的目的存储区。(5.2.4)
- 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)此指令中AH与BX分别为8位和16位寄存器,所以类型不匹配。
(2)此指令中源地址和目的地址均为寄存器间接寻址的两个存储单元,而MOV指令不允许两存储单元间直接传送信息。
(3)源地址为基址变址寻址,则SI(或DI)应与BP或BX组合使用,而SI、DI不能一起使用。
(4)目的操作数地址在本指令中用伪操作PTR将字类型改变成了字节类型。因此源操作数1000只能是字节立即数,否则类型不匹配。但一字节宽度仅为一个8位的二进制数,能表达的最大数为28=256,显然1000超出了一个字节的范围。
(5)虽然MOV指令允许寄存器与段寄存器交换信息,但CS不能用作目的寄存器。
8、4条指令的目的操作数都是基址加变址寻址方式。第(1)、(3)两条指令选用了BX作基址寄存器,(2)、(4)两条指令选用了BP作基址寄存器,所以,AX、CX的内容将送往数据段中的相应单元,BX、DX的内容将送往堆栈段中的相应单元。
第(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)条指令送入
9、MOV BX,OFFSET TAB ;变量TAB的EA—>BX
MOV AL,4 ;TAB表中第五项的位移量4—>AL
XLAT TAB ;([BX+AL])=(TAB+4)=34H—>AL
10、MOV SI,OFFSET NUM ;将NUM的EA—>SI
LEA SI,NUM ;与上一条语句等效
MOV AX,[SI] ;([SI])—>AX
LEA AX,[SI] ;将SI所指的存储单元的EA—>AX
LEA DI,4[SI] ;取以NUM为首址的第三个字符存储单元的EA—>DI
LEA POIN,BUF ;错误语句,因为OPD不是寄存器
MOV POIN,OFFSET BUF ;将BUF的EA—>POIN
11、编程如下:
MOV AX,SUB1
SUB AX,SUB2
MOV DSUB,AX ;两低位字相减,结果—>DSUB
MOV AX,SUB1+2
SBB AX,SUB2+2 ;两高位字相减,并减去低位的借位CF
MOV DSUB+2,AX
12、AL=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 AX,4001H
CWD
MOV CX,4
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、首先列已知条件:
除数为非压缩的BCD数3,被除数为非压缩的BCD数53.被除数和除数的内存地址均未给出,我们可以随意给定,假设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、方法一:
用变址寻址方式来访问S1和S2。即用S1[SI]和S2[SI]来分别表示S1和S2中各字节的有效地址,其中[SI]表示距S1或S2的起始地址的字节数。用CX控制循环次数,则SI的取值应从0~29,每循环一次SI加1。
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,CX≠0则转NEXT
方法二:
使用MOVS指令,并采用重复前缀,于是有
MOV SI,OFFSET S1
MOV DI,OFFSET S2
MOV CX,30
CLD ;串地址正向增值
REP MOVSB
22、(1)这个程序段完成的动作是:将FIRST开始的10个字节数据传送到SECOND段中。(2)MOVSB和REP重复使用,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]补。
如果x≥0,则[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 ;比较AX与BX
JGE NEXT ;若AX≥BX则转NEXT
XCHG AX,BX ;若AX<BX则交换AX,BX内容
NEXT: CMP AX,CX ;比较AX与CX
JGE DONE ;若AX≥CX则转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,若AX≥0则还要继续判断;当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 ;SI增1
CMP AL,ASCII_STR[SI] ;进行比较
LOOPNE NEXT ;没找到且CX≠0时,继续循环
JNZ NOT_FOUND ;未找到则转入NOT_FOUND执行
.
.
.
NOT_FOUND:
第三章 汇编语言程序格式 答案习题
- 汇编语言源程序由语句序列构成。语句一般是由分隔符分成的四个部分组成,它们有两种格式。
(1) 执行性语句------由硬指令构成的语句,它通常对应一条机器指令,出现在程序的代码段中: 标号:硬指令助记符 操作数,操作数 ;注释 (2) 说明性语句--------由伪指令构成的语句,它通常指示汇编程序如何汇编源程序: 名字 伪指令助记符 参数,参数,… ;注释
- 汇编语言的开发过程为:
(1)首先调用一个文字编辑程序,送入已编写好的源程序,建立一个源文件。 (2)调用汇编程序,把源程序汇编成目标程序(.OBJ),在此过程中进行语法检查。 (3)通过连接程序LINK转换为一个可执行文件(.EXE)。 (4) 最后调试程序(DEBUG)把可执行文件装入内存,在此过程中对程序和数据进行适当的修改和调整,如此反复直到程序完全正确为止。
- 使用MASM6.0提供的集成开发平台PWB。PWB的功能特点:
全菜单方式操作:通过菜单选择执行编辑、编译、连接等。 集成编辑环境:完成源程序编辑。 多窗口: 同时显示源程序和信息编译、连接。 CodeView源程序调试工具: 全屏幕调试工具,源代码级、符号调试。 多窗口,可同时显示源程序、寄存器、数据等。 可单步、分段、设置断点执行程序,可监测变量。 支持32位指令调试。 支持8087调试。
- 两条语句中的X1与X2都被赋值1000H,但因为X1是用EQU伪指令赋值的,所以X1的值不能被重新赋值;而X2是用=伪指令定义的,因此X2的值可以被重新定义。
- 第二个AND是逻辑运算符,它在汇编时进行,计算表达式OPD1 AND OPD2后,产生一个立即数作为指令的操作数,而第一个AND是指令助记符,它在汇编以后执行AND指令时进行。
- 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中去。
- (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
- 汇编程序在汇编这段程序时会发现,两条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。
- 用注释形式在程序右边逐条给出执行结果如下:
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
- 可以用以下几种等价方法实现要求:
DW 5150H DB 50H,51H DB 'PQ'
- 0FH。
- 可用的指令如下:
MOV DX,BLOCK+(6-1)*2
- AX=0FFH BX=0。
- BX=0FFH CX=0FFH。
- MOV AX,10
MOV BL,10 MOV CL,1
- (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.
- 汇编时,汇编程序默认无标记数为十进制数;而运行时,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
- 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最后一个字节的地址值)
- DATA_SEG SEGMENT ;定义数据段
WORD ;段界为字 PUBIC ;该数据段为组合类型 'DATA' ;类别为"DATA" 故按题目要求,该段的定义语句应写为: DATA_SEG SEGMENT WORD PUBLIC 'DATA'
- (1)MOV AX,OFFSET LNAME
(2)MOV SI,WORD PTR CODE_LIST (3)CODE_LENGTH EQU $-CODE_LIST
- (1)10025 (2)25 (3)2548
(4)3 (5)103 (6)1 (7)1 (8)3
- 汇编后的结果如下:
(1) ADD SI,2 (2) MOV CX,100 (3) MOV CX,1
- 三组指令均有错误,现改正如下:
(1)STACK_SEG SEGMENT STACK 'STACK' (2)SEG_CODE SEGMENT 'CODE' (3)MAIN_PROC ENDP SEG_CODE ENDS END START
- 变量BUF为字节类型,所在段的段首地址为DATA,偏移地址为0。语句"DDBUF EQU THIS DWORD"将紧跟它后面的字节类型的变量BUF重新定义为双字类型,并命名为DDBUF。变量DDBUF与BUF具有相同的段属性和偏移地址属性。而语?quot;DWBUF EQU WORD PTR BUF"是将变量BUF重新定义为字类型,并命名为DWBUF,变量DWBUF也与BUF具有相同的段属性和偏移地址属性。由此可见,DDBUF、BUF、DWBUF为同一数据存储区的首址,只是类型分别为双字、字节、字。
- 分析以上数据段中各语句的功能,可知变量BUF的偏移地址为10,NUM的偏移地址为19。
- END是为计算数组长度而建立的符号地址,所需指令如下:
MOV CX,(END-ARRAY)/2 汇编程序在汇编期间将计算表达式而形成指令 MOV CX,7
- 源文件如下:
;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
- 两个有符号加数及和我们均可在数据段内为其进行定义和预置。当求得的和非负时存入结果单元;若和为负则求反后再存入结果单元。另外我们还可以用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)结构类型的说明:
结构名 STRUCT …… ;数据定义语句 结构名 ENDS (2)结构变量的定义: 变量名 结构名 <字段初值表> 注:结构说明只是定义了一个框架,并未分配主存空间,必须通过结构预置语句分配主存并初始化。 (3)用结构变量,只要直接书写结构变量名;要引用其中的某个字段,则采用圆点"."操作符,其格式是:结构变量名.结构字段名。
- (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码的主要操作过程为:
以下程序为实现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 K—1
IF K—2
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 ;是否可用
CALL FAR PTR PROC3 ;可用则从设备3输入
NO_INPUT:
第五章 32位指令及其编程 答案习题
- 实模式:寻址采用和8086相同的16位段和偏移量,最大寻址空间1MB,最大分段64KB。可以使用32位指令。32位的x86 CPU用做高速的8086。
保护模式:寻址采用32位段和偏移量,最大寻址空间4GB,最大分段4GB (Pentium Pre及以后为64GB)。在保护模式下CPU可以进入虚拟8086方式,这是在保护模式下的实模式程序运行环境。
- SS,保存堆栈指针的寄存器。
- 8个32位通用寄存器分别是:EAX,EBX,ECX,EDX,ESI,EDI,EBP,ESP。它们都可以保存数据,暂存运算结果,也都可以存放存储器地址用于基址/变址寻址。对比16位x86 CPU只有BX/BP/SI/DI可以实现寄存器间接寻址,可见,32位通用寄存器更具有通用性。
- 相对于原来16位指令代码格式,32位指令格式仅增加了两个关键的长度超越前缀指令。操作数长度超越和地址长度超越,指令代码分别为66H和67H。作用如下:
操作数长度超越--根据处理器所处的工作方式不同,一条指令会默认使用16位或32位的操作数,使用操作数长度前缀后,将默认使用16/32位操作数的指令分别转为使用32/16位操作数。 地址长度超越--地址长度决定了指令中位移量的长度和有效地址计算时产生的地址位移长度。处理器在不同的工作方式下,指令会默认使用原16位地址或新的32位地址寻址存储器,使用地址长度前缀后,将默认使用16/32位地址的指令分别转为使用32/16位地址。
- 新增的标志及其含义如下:
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。
- 支持原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位)。
- (1)立即数寻址
(2)直接寻址 (3)相对基址变址寻址 (4)带比例的变址寻址 (5)基址的带位移量的带比例的变址寻址
- 当用PUSH指令把堆栈指针(E)SP压入堆栈时,8086/8088是将SP减2后的值进栈,而80286后的处理器是将进栈前的(E)SP值进栈。
- 指令如下:
LEA EAX,[EBX+ESI*2+1234H] 要保证该运算的正确必须使这条指令在32位段中执行。
- 指令如下:
MOV DX,3FCH IN EAX,DX
- (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弹出堆栈。
- (1)有效地址为:00001000H + 00002000H = 00003000H。
(2)有效地址为:00001000H + 2*00002000H = 00005000H。 (3)有效地址为:4*00001000H + 00002000H + 1000H = 00007000H。
- (1)错误。AX是16位的,而ECX是32位的。
(2)正确。因为在32位存储器寻址中变址寄存器可以是除ESP之外的任何32位通用寄存器之一,而16位存储器寻址中变址寄存器只能是SI或DI。所以在这里ECX是可以做变址寄存器的。
- 此指令执行的操作是:DX*100H->BX。
DX与100H的乘积有可能溢出。如果溢出,那么高位部分被丢掉,并置CF=OF=1表示;如果没有溢出,则CF=OF=0。
- 程序段如下:
MOV EDX,0 ;将EDX置0 ADD EAX,EBX ;EAX和EBX累加和到EAX ADD EAX,ECX ;EAX和ECX累加和到EAX,则EAX中为累加和。 ADC EDX,0 ;将CF存入EDX
- (1)EAX = 2CEFF93H
(2)EAX = 09090804H
- 要使操作数的某些位变反,可以使用XOR指令,只要将源操作数的立即数字段的相应位置成1就可以达到目的。此题要求第0,1位变反,可用如下指令:
XOR EAX,3H
- 编制程序如下:
MOV CX,16 ROL EAX,CX ADD EAX,EBX
- 程序段如下:
ROR ECX,2 ;CX低2位移入了ECX的高2位 REP MOVSD ;使用CX为计数器,每次传送双字 ROL ECX,1 REP MOVSW ;传送可能余下的字 ROL ECX,1 REP MOVSB ;传送可能余下的字节
- 指令 JECXZ label 是当ECX=0时,转移到label指定的段内偏移地址处。但要注意的是它的偏移量只能是在-128 ~ +127范围内。
《汇编语言程序设计》试题A
一、 数制转换填空(10分)
十进制数 |
二进制数 |
十六进制数 |
119 |
|
|
|
11110010 |
|
|
|
DF |
|
00010111 |
|
|
|
5A |
120 |
|
|
|
二、 填空(20分)
- Intel 8086 CPU的段寄存器有______________________________________________。
- Intel 8086 CPU的SP寄存器的主要作用是____________________________________。
- (CS)=1000H,(DS)=2000H,(ES)=3000H,(SS)=4000H,(DI)=a100,操作数 [DI+1000H] 的寻址方式是____________________,物理地址是________________ 。
- 标志寄存器中OF标志位的主要作用是__________________________________。
- TEST指令的功能是__________________________________。
- 指令LEA__AX, [SI+100H]的具体操作是______________________________。
- 有符号二进制字节数可表示的数的范围是____________________________ 。
- 执行一条POP__AX指令后,SP的内容发生的变化是______________________。
- AL寄存器的内容为28H,执行指令OR__AL, 33H后,AL的值为____________。
- 测试寄存器AL和BL的值是否相等而不改变其值应使用指令__________________。
三、 判断以下各语句是否有错误,如有错误请说明错误原因(20分)
- MOV AX, 0
- MOV [1000H], 1000H
- MOV BL, AX
- MOV [0], AX
- PUSH PSW
- SHR DX, BL
- MUL AL, BL
- AND AX, [1000]
- XCHG CS, DS
- 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分)
- Intel 8086 CPU的通用寄存器有__________________________________________。
- Intel 8086 CPU的IP寄存器的作用是____________________________________ 。
- (CS)=1000H,(DS)=2000H,(ES)=3000H,(SS)=4000H,操作数[1000H]寻址方式是____________ ______ ,物理地址是________________ 。
- 标志寄存器中CF标志位的主要作用是__________________________________。
- NEG指令的功能是__________________________________。
- 指令MUL__CL的具体操作是______________________________。
- 无符号二进制字节数可表示的数的范围是____________________________ 。
- 执行一条PUSH__AX指令后,SP的内容发生的变化是______________________。
- AL寄存器的内容为28H,执行指令AND__AL, 33H后,AL的值为____________。
- 测试寄存器AL和BL的值是否相等而不改变其值应使用指令__________________。
三、 判断以下各语句是否有错误,如有错误请说明错误原因(20分)
- MOV CS, 100H
- MOV [1000H], 0
- MOV 1023H, AX
- MOV CS, AX
- PUSH AL
- SHR DX, 4
- MOV AL, 1234H
- MOV AL, AH+1
- XCHG 1000H, AX
- 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 |
|
二、 填空
- DS、CS、ES、SS
- 堆栈指针寄存器,用于记录堆栈区偏移量。
- 寻址方式:寄存器相对寻址,物理地址:21100H。
- 用于判断有符号数加减运算的结果是否溢出。
- "与"测试,对两个操作数作与操作,只影响标志,不产生结果。
- 将寄存器SI的内容与100H相加的和送AX寄存器。
- -128 ~ +127
- SP的值加2。
- 3BH。
- CMP AL, BL
三、 判断以下各语句是否有错误,如有错误请说明错误原因(20分)
- 正确。
- 错误,传送类型不明确。
- 错误,寄存器长度不相等。
- 正确。
- 错误,非法指令,应为PUSHF。
- 错误,第二个操作数必须为1或CL。
- 错误,MUL指令只能有一个操作数。
- 正确。
- 错误,CS不能参与交换。
- 错误,第一个操作数必须为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分)
- AX、BX、CX、DX、SI、DI、SP、BP
- 指令指针寄存器,指向下一条要执行的指令的地址。
- 寻址方式:直接寻址,物理地址:21000H。
- 进位/借位标志,加法中标志进位,减法中标志借位。
- 求补,即求反加1。
- 无符号乘:(CL)X(AL)→(AX)
- 0~255。
- SP的值减2。
- (AL) = 20H。
- 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
|