1 什么是标志?它有什么用途?状态标志和控制标志有什么区别?画出标志寄存器FLAGS,说明各个标志的位置和意义。
〔解答〕
标志用于反映指令执行结果或控制指令执行形式。它是汇编语言程序设计中必须特别注意的一个方面,状态用来记录运行的结果的状态信息,许多指令的执行都将相应地设置它,控制标志位可由程序根据需要用指令设置,用来控制处理器执行指令的方式
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
|
|
|
|
OF |
DF |
IF |
TF |
SF |
ZF |
|
AF |
|
SF |
|
CF |
CF是进位标志;ZF 是零标志;SF是符号标志;PF奇偶标志;OF溢出标志;AF辅助进位标志;DF方向标志;IF中断允许标志;TF陷阱标志。
〔解答〕
溢出标志OF和进位标志CF是两个意义不同的标志。
进位标志表示无符号数运算结果是否超出范围,运算结果仍然正确;溢出标志表示有符号数运算结果是否超出范围,运算结果已经不正确。
例1:3AH + 7CH=B6H
无符号数运算:58+124=182,范围内,无进位
有符号数运算: 58+124=182 ,范围外,有溢出
例2:AAH + 7CH=(1)26H
无符号数运算:170+124=294,范围外,有进位
有符号数运算:-86+124=28 ,范围内,无溢出
3 什么是8086中的逻辑地址和物理地址?逻辑地址如何转换成物理地址?请将如下逻辑地址用物理地址表达:
(1)FFFFh:0 (2)40h:17h (3)2000h:4500h (4)B821h:4567h
〔解答〕
在8086处理器中,对应每个物理存储单元都有一个唯一的20位编号,就是物理地址,从00000H~FFFFFH。
在8086内部和用户编程时,采用的段基地址 : 段内偏移地址形式称为逻辑地址。
将逻辑地址中的段地址左移二进制4位(对应16进制是一位,即乘以16),加上偏移地址就得到20位物理地址
如下逻辑地址用物理地址表达:
(1)FFFFh:0=FFFF0H
(2)40h:17h=00417H
(3)2000h:4500h=24500H
(4)B821h:4567h=BC777H
4数据的默认段是哪个,是否允许其他段存放数据?如果允许,如何实现,有什么要求?
〔解答〕
数据的默认段是安排在数据段,也经常安排在附加段,尤其是串操作的目的区必须是附加段,允许其它段存放数据,数据的存放比较灵活的,实际上可以存放在任何一种逻辑段中,这时,只要明确指明是哪个逻辑段就可以了。
5什么是有效地址EA?8086的操作数如果在主存中,有哪些寻址方式可以存取它?
〔解答〕
DS存放数据段的段地址,存储器中操作数的偏移地址则由各种主存方式得到,称之为有效地址EA。8086的操作数如果在主存中,可以存取它的寻址方式有直接寻址方式、寄存器间接寻址方式、寄存器相对寻址方式、基址变址寻址方式、相对基址变址寻址方式
6 什么是堆栈,它的工作原则是什么,它的基本操作有哪两个,对应哪两种指令?
〔解答〕
堆栈是一种按“先进后出”原则存取数据的存储区域,位于堆栈段中,使用SS段寄存器记录其段地址;它的工作原则是先进后出;堆栈的两种基本操作是压栈和出栈,对应的指令是PUSH和POP。
7 指令指针IP是通用寄存器还是专用寄存器?有指令能够直接它赋值吗?哪类指令的执行会改变它的值?
〔解答〕
指令指针IP不是通用寄存器,不可直接赋值,属于专用寄存器。有且仅有循环、转移、子程序调用和返回、中断类等指令可以改变它的值。
8 先提示输入数字“Input Number:0 ~ 9”,然后在下一行显示输入的数字,结束;如果不是键入了0 ~ 9数字,就提示错误“Error!”,继续等待输入数字。
〔解答〕
; 数据段
str1 db 'Input Number:0~9 : ',0dh,0ah,'$'
str2 db 'Error!',0dh,0ah,'$'
; 代码段
mov ah,09h ; 显示str1字符串
mov dx,offset str1
int 21h
getkey: mov ah,1 ; 调用DOS功能
int 21h
cmp al,'0'
jb error ; 小于0,出错处理
cmp al,'9'
ja error ; 大于9,出错处理
mov ah,02h ; 调用DOS显示字符功能,显示该数字
mov dl,al
int 21h
... ; 终止程序执行,返回DOS
error: mov ah,09h ; 出错,调用DOS 功能显示str2字符串
mov dx,offset str2
int 21h
jmp getkey ; 返回按键
9 从键盘输入一个字符串(不超过255个),将其中的小写字母转换成大写字母,然后按原来的顺序在屏幕上显示。
〔解答〕
思路:参考P67 例2.52用0ah号DOS系统功能调用,从键盘输入一个字符串,然后从键盘缓冲区逐个取字符,在“a”与“z”之间的字符为小写字母,需要转换为大写字母(减去20h),其他不变。
;xt237.asm
.model small
.stack
.data
array db 255
db 0
array1 db 255 dup('$')
array2 db 0dh,0ah,'$'
.code
.startup
mov ah,0ah ; 键盘输入字符串
mov dx,offset array
int 21h
mov dx,offset array2 ; 回车换行
mov ah,09h
int 21h
mov bx,offset array1
again: mov al,[bx]
cmp al,'$'
jz done
cmp al,'a' ; 小于a和大于z的字符不是小写字母
jb next
cmp al,'z'
ja next
sub al,20h ; 在a和z之间的字符才是小写字母,转换为大写
mov [bx],al ; 保存到原位置
next: inc bx
jmp again
done: mov dx,offset array1
mov ah,09h
int 21h
.exit 0
end
10 伪指令语句与硬指令语句的本质区别是什么?伪指令有什么主要作用?
〔解答〕
伪指令语句与硬指令语句的本质区别是能不能产生CPU动作;
伪指令的作用是完成对如存储模式、主存变量、子程序、宏及段定义等很多不产生CPU动作的说明,并在程序执行前由汇编程序完成处理。
11 汇编语言程序的开发有哪4个步骤,分别利用什么程序完成、产生什么输出文件。
〔解答〕
⒈ 编辑 文本编辑程序 汇编语言源程序.asm
⒉ 汇编 汇编程序 目标模块文件.obj
⒊ 连接 连接程序 可执行文件.exe或.com
⒋ 调试 调试程序 应用程序
12源程序中如何指明执行的起始点?源程序应该采用哪个DOS功能调用,实现程序返回DOS?
〔解答〕
源程序中运用STARTUP伪指令指明执行的起始点;源程序应该采用DOS功能调用的4CH子功能实现程序返回DOS的。
13 编写一个程序,把从键盘输入的一个小写字母用大写字母显示出来。
〔解答〕
getkey: mov ah, 1 ;从键盘输入,出口:al存键值
int 21h
cmp al, 'a' ;判键值是小写字母?
jb getkay
cmp al, 'z'
ja getkay
sub al,20h ;是小写字母转换为大写字母
mov dl,al
mov ah, 02h ;显示
int 21h
14 编写程序,将一个包含有20个有符号数据的数组arrayM分成两个数组:正数数组arrayP和负数数组arrayN,并分别把这两个数组中的数据个数显示出来。
〔解答〕
.model small
include io.inc
.stack
.data
arrayM db 1,2,3,4,5,6,0,-3,-5,-6,0,7,6,90,-18,-23,34,7,9,8 ;源数组
arrayP db 20 dup(?) ;正数数组
arrayN db 20 dup(?) ;负数数组
dispP db 'Plus Number: ','$'
dispN db 0dh,0ah,'Negs Number: ','$'
.code
.startup
mov cx, 20 ;源数组元素数
xor bx, bx ;设bh为正数个数,bl为负数个数,均清零
xor si, si ;源数组地址位移量
again: ;循环20次
mov ax, arrayM[si] ;取一个元素
cmp ax,0 ;判正数
jl Neg
inc bh ;是,正数个数加1
jmp next
Neg: inc bl ;否,负数个数加1
next: inc si ;修改位移量
loop again ;循环次数减1
mov ah,09h ;调用显示字符串功能
mov dx, offset dispP ;显示个数
int 21h
mov al,bh
call dispuib ; 调用I/O子程序库中的子程序
mov ah,09h ;调用显示字符串功能
mov dx, offset dispN ;显示个数
int 21h
mov al,bl
call dispuib ; 调用I/O子程序库中的子程序
.exit 0
End
15 编写计算100个正整数之和的程序。如果和不超过16位字的范围(65535),则保存其和到wordsum,如超过则显示‘overflow’。
〔解答〕
.model small
.stack
.data
num equ 100
wlist dw num dup(?)
wordsum dw ?
error db 'overflow. $'
.code
.startup
mov bx,offset wlist
mov cx,num
xor ax,ax
again: add ax,[bx]
jc next
inc bx
inc bx
loop again
mov [bx],ax
jmp done
next: mov dx,offset error
mov ah,9
int 21h
done: .exit 0
end