微 机 原 理 及 应 用 B 作 业
ADD AL,AL ;2*AL ADD AL、AL ;4*AL MOV BL,AL ;AL→BL SAL BL,1 ;8*AL ADD AL,BL ;12*AL HLT
(1)该程序段的功能是什么? 答:把AL中的内容乘以12
(2)设AL的初值为0AH,执行该程序段后,AL为多少? 答:AL=78H
4.21已知有程序段如下:(与12题重) (1)该程序段的功能是什么? 答:将BCD码转换成二进制
(2)执行该程序段后,AL= 23H
4.22、下列程序段要求在内存40000H开始的顺序30个单元中存放着8位无符号数,将它们的和放在DX中,试填空完成该程序(并加入必要的注释)或自行编制一段程序完成上述功能。
MOV AX,4000H ; MOV DS,AX ; 送段首地址 MOV SI,0000H ; 送偏移量 MOV CX, 30 ; 送循环次数 XOR AX,AX ; 清零 GOON: ADD AL, [SI] ; 两数相加 ADC AH,00H ; 加进位位 INC SI ; 修改地址 DEC CX ; 计数器减1 JNZ GOON ; 不为零循环
MOV DX ,AX ; 结果送DX 4.23在AL中有一个十六进制数的ASCII码,完成下面程序段在每一空白处填上一条适当指令(并加入必要的注释),实现将AL中的ASCII码转换成二进制数。
CMP AL,3AH ; 与3AH 比较 JC DONE ; 小于转移到DONE SUB AL,7 ; 大于减7 DONE:SUB AL,30H ; AL减30H HLT
4.24已知附加段中有一块长50个字的数据区,首址为DEST。欲编程将它们全部初始化为0FFFFH值,试在下面程序段的空白处填上适当的指令或操作数(并加入必要的注释),以实现上述功能。
LEA MOV
DI,DEST ; 取DEST偏移量
CX, 100 ; 送计数值
CLD ; 清方向标志位,DF=0
11
微 机 原 理 及 应 用 B 作 业
MOV
AL,0FFH ; 将AL←0FFH REP STOSB ; 将送100个字节FFH到首址为DEST区域 4.25已知附加段中有一块长50个字的数据区,首址为DEST。欲编程将它们全部初始化为0FFFFH值,试在下面程序段的空白处填上适当的指令或操作数(并加入必要的注释),以实现上述功能。(与24题重)
DI,DEST ; MOV CX, ; CLD ; MOV AL,0FFH ; ; 4.26附加段中有某字符串首址为BLOCK,长17个字节。欲查找其中第一次出现字符“e”的位置,并将该位置所在的偏移量入栈保护。试在下面程序段的空白处填上适当的指令(并加入必要的注释)或操作数以实现上述功能。
MOV DI, OFFSET BLOCK ; 送BLOCK 的偏移量 MOV AL, 65H ; 送eASCII码 MOV CX, 17 ; 送计数值
CLD ; 方向标志位清零 REPNZ SCASB ; 寻找e JNE OTHER ; 找到e转到OTHER DEC DI ; 修改地址 PUSH DI ; 偏移量入栈保护 OTHER:……(略)
4.27已知有某字串BUF1的首址为0000H,BUF2的首址为0010H,数据段与附加段重合。欲从BUF1处开始将10个字数据顺序传送至BUF2处,试在下面程序段的空白处填上适当的指令或操作数以实现上述功能。
LEA SI,BUF1 ; 送BUF1的偏移量 ADD SI, 12H ; 地址移动到字符串最后 LEA DI,BUF2 ; 送BUF2的偏移量 ADD DI, 12H ; 地址移动到字符串最后 STD ; 方向标志位清零 MOV CX, 10 ; 送计数值 REP MOVSW ; 进行串操作 4.28在DAT和DAT1两个字节变量单元中有两个十进制数的ASCII码,编程实现将这两个ASCII码转换为两个BCD码,并以压缩形式存放在REST字节变量单元中。试填写该程序划线部分,并加入必要的注释。
MOV AL,DAT ;取第一个数
SUB AL,30H ;将ASCII码转为BCD码 MOV CL,4 ; 送移位数 SHL AL,CL ;将BCD码放在AL高四位中
12
微 机 原 理 及 应 用 B 作 业
MOV BL,DAT1 ;取第二个数
SUB BL,30H ;将DAT1中的ASCII码转为BCD码 OR AL,BL ;将两个BCD码合并在AL寄存器中 MOV REST,AL ;将压缩形式的BCD码存人REST中 HLT
第 五 章 汇编语言程序设计
5.1 答:标号在指令性指令的名字,写在指令前面,标号后必须有冒号。变量在伪指令前是定义某一数据区所起的名字,它后面不带冒号。标号和变量都有段、偏移量的属性,标号的类型是远和近型,变量的类型是字节、字、双字等。
5.2 答:指令性指令是给CPU的命令,它是由
07H ←0100H ADD1
汇编程序翻译成机器语言指令,在程序运行时由CPU
00H
来执行,每条指令都对应CPU一种特定的操作。伪
00H
指令不汇编成机器语言,仅仅在汇编过程中告诉汇编
00H
程序应如何汇编。
01H
5.3 答:ADD1、ADD2、ADD3的段基址为1000H;00H
00H ADD1、偏移量为2000H、类型为双字;ADD2、
00H 偏移量为2018H、类型为字节;ADD3、偏移量为
2068H、类型为字。
…… 5.4
01H 2018H ADD2 答:分配情况如右图
04H 5.5答:(定义了堆栈段[81字节]、数据段(17
05H 字节)和代码段)
…… 02H 12H 9AH 56H 42H 41H
1006H ADD1
1009H ADD2 题5.4图
05H 05H 05H 07H 01H …… …… 05H 05H
2068H ADD3 题5.3图
←0100H ADD1
13
微 机 原 理 及 应 用 B 作 业
5.6答:ADD1占有多少个字节 5.7答: 1.依据设计任务,抽象出描述问题的数 学模型。2.确定实现数学模型的算法或求解的具体 …… 步骤和方法。3.绘制出程序流程框图。 4.分配存05 储空间及工作单元(包括寄存器)。确定数据段、堆 栈段、代码段及附加段在内存中的位置。 5.依 0127H题5.6图 据流程图编写程序。6.静态检查。7.上机调试。8.程序运行,结果分析。
5.8 答: 源程序结构一般包括4个段,它们是代码段、数据段、附加段和堆栈段。其中代码段是必须存在的,其余段视具体情况而定。
一般用到四种程序结构:顺序结构,分支结构,循环结构,子程序结构。 5.9 答: XOR AX, AX MOV DX , 0
MOV AH,45H MOV DL,AH AND DL,0FH ADD DL, 30H AND AH,0F0H MOV CL,4 SHR AH,CL ADD DL, 30H ADD AX,DX HLT
5.10 答: MOV AL , A MOV BL , B
…… IMUL BL
94H ← DATA1
MOV CX , C
16H
ADD AX , CX
26H
SUB AX , 18
89H
HLT
30H ← DATA2
(1)从DATA1单元开始,将8个组合BCD
55H 码累加起来,其和(超过1字节)存入以RES
为首址的单元中(低位在前)。 04H
74H 图5-1 5.11题图
← RES …… (2)将它们看作2个分别以DATA1、DATA2
为首址的4位十进制数(低位在前),求此两数
之差并存入以RES为首址的单元中。
答: 1、 LEA SI , DATA1 2、LEA SI , DATA1 LEA DI , DATA2 LEA DI , DATA2 LEA BX , RES LEA BX , RES
14
微 机 原 理 及 应 用 B 作 业
MOV CX ,7 XOR AX , AX
XOR AX , AX MOV AX , WORD PTR [SI] MOV AL , BYTE PTR [SI] ADD AX , WORD PTR [DI] AA1:INC SI MOV DX , WORD PTR [SI+2] ADD AL , BYTE PTR [SI] ADC DX , WORD PTR [DI+2] ADC AH , 0 MOV WORD PTR [BX] , AX LOOP AA1 MOV WORD PTR [DI+2] , DX MOV WORD PTR [BX] , AX HLT HLT
5.12 答:根据各种条件判断和比较进行操作,满足条件去做一种操作,不满足条件去做另一种操作。每一种操作程序称为一个分支,一次判断产生两个分支,只有一次判断的称为单重分支程序。多次判断产生多个分支,称为多重分支程序。
5.13 答:MOV AL,DAT AND AL,DAT
JNS POSI ;若为正数转POS1 TEST AL,01H ;测试负数的奇偶性 JZ M ;若为负偶数转M
OR AL,BUF ;若为负奇数进行‘或’运算
JMP DONE
M:XOR AL,BUF ;负偶数进行‘异或’运算 JMP DONE
POSI:TEST AL,01H ;判断正数的奇偶性
JZ N ;为正偶数,转N
ADD AL,BUF ;为正奇数进行‘加’运算 JMP DONE
N:AND AL,BUF ;正偶数进行‘与’运算 DONE:MOV BUF,AL
HLT
5.14 答:实现的方法仍是两两进行比较判断。其步骤是:先取出X,Y,Z,假设
15