⑤串扫描指令SCAS ⑥重复前缀指令REP; (6)处理机控制类指令 ①空操作指令NOP ②段超越前缀指令SEG ③封锁前缀指令LOCK ④暂停指令HLT ⑤交权指令ESC ⑥等待指令WAIT。
〔习题2.40〕总结8086指令系统所采用的各种寻址方式,包括一般的数据寻址、外设数据寻址、堆栈数
据寻址、串操作数据寻址、转移指令目的地址的寻址等,并举例说明。
〔解答〕 1. 一般的数据寻址
立即数寻址方式如:mov al,05h 寄存器寻址方式如:mov bx,ax
存储器寻址方式
(1)直接寻址方式如:mov ax,[2000h] (2)寄存器间接寻址方式如:mov ax,es:[2000h] (3)寄存器相对寻址方式如:mov ax,[di+06h] (4)基址变址寻址方式如:mov ax,[bx+si] (5)相对基址变址寻址方式如:mov ax,[bx+si+06h]
2. 外设数据寻址 输入指令IN,如:
in al,21h in ax,dx 输出指令OUT,如:
out dx,al 3. 堆栈数据寻址
进栈指令PUSH,如:PUSH [2000H] 出栈指令POP,如:POP [2000H]
4. 串操作数据寻址 5. 转移指令目的地址的寻址 直接寻址、间接寻址、相对寻址 第3章 汇编语言程序格式
〔习题3.1〕伪指令语句与硬指令语句的本质区别是什么?伪指令有什么主要作用?
〔解答〕
伪指令语句与硬指令语句的本质区别是能不能产生CPU动作;
伪指令的作用是完成对如存储模式、主存变量、子程序、宏及段定义等很多不产生CPU动作的说明,
并在程序执行前由汇编程序完成处理。
〔习题3.2〕什么是标识符,汇编程序中标识符怎样组成?
〔解答〕
为了某种需要,每种程序语言都规定了在程序里如何描述名字,程序语言的名字通常被称为标识符; 汇编语言中的标识符一般最多由31个字母、数字及规定的特殊符号(如-,$,?,@)组成,不能
以数字开头。
〔习题3.3〕 什么是保留字,汇编语言的保留字有哪些类型,并举例说明。
〔解答
保留字是在每种语言中规定了有特殊意义和功能的不允许再做其它用处的字符串;汇编语言的保留字主要有硬指令助记、伪指令助记符、运算符、寄存器名以及预定义符号等。汇编语言对大小写不敏感。
如定义字节数和字符串的DB就是伪指令助记符。
〔习题3.4〕汇编语句有哪两种,每个语句由哪4个部分组成?
〔解答〕
汇编语句有执行性语句和说明性语句;
执行性语句由标号、硬指令助记符、操作数和注释四部分组成; 说明性语句由名字、伪指令助记符、参数和注释四部分组成
〔习题3.5〕汇编语言程序的开发有哪4个步骤,分别利用什么程序完成、产生什么输出文件。
〔解答〕
⒈ 编辑 文本编辑程序 汇编语言源程序.asm ⒉ 汇编 汇编程序 目标模块文件.obj ⒊ 连接 连接程序 可执行文件.exe或.com
⒋ 调试 调试程序 应用程序
〔习题3.6〕将第2章习题2.36采用简化段定义格式编写成一个完整的源程序。
〔解答〕
;简化段定义格式
.model small ; 定义程序的存储模式(小模式) .stack ; 定义堆栈段(默认1024个字节)
.data ; 定义数据段 str1 db 'Input Number:0~9 : ',0dh,0ah,'$'
str2 db 'Error!',0dh,0ah,'$' .cade ; 定义代码段
.startup ; 说明程序的起始点,建立ds,ss的内容。
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
.exit 0 ; 终止程序执行,返回DOS
error: mov ah,09h ; 出错,调用DOS 功能显示str2字符串
mov dx,offset str2
int 21h
jmp getkey ; 返回按键 end ; 汇编结束
〔习题3.7〕将第2章习题2.37采用完整段定义格式编写成一个完整的源程序。
〔解答〕 ;xt307.asm stack segment dw 512 dup(?)
stack ends data segment array db 255 db 0 array1 db 255 dup('$') array2 db 0dh,0ah,'$'
data ends code segment 'code' assume cs:code, ds:data, ss:stack
start: mov ax,data mov ds,ax
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 mov ax,4c00h
int 21h code ends end start
〔习题3.8〕区分下列概念:
(1)变量和标号
(2)数值表达式和地址表达式 (3)符号常量和字符串常量
〔解答〕
(1)变量是在程序运行过程中,其值可以被改变的量;标号是由用户自定义的标识符,指向存储单
元,表示其存储内容的逻辑地址。
(2)数值表达式一般是由运算符连接的各种常数所构成的表达式,地址表达式是由名字、标号以及
利用各种的操作符形成的表达式。
(3)在程序中,为了使常量更便于使用和阅读,经常将一些常量用常量定义语句定义为符号常量,被
一对双引号括起来的若干个字符组成的字符序列被称为字符串常量。
〔习题3.9〕假设myword是一个字变量,mybyte1和mybyte2是两个字节变量,指出下列语句中的错误
原因。
(1) mov byte ptr [bx],1000 (2) mov bx,offset myword[si] (3) cmp mybyte1,mybyte2 (4) mov al,mybyte1+mybyte2
(5) sub al,myword (6) jnz myword
〔解答〕