汇编程序注释版
- 格式:docx
- 大小:15.15 KB
- 文档页数:3
汇编语言程序设计第四版【课后习题答案】--囮裑為檤第3章汇编语言程序格式〔习题3.1〕伪指令语句与硬指令语句的本质区别是什么?伪指令有什么主要作用?〔解答〕伪指令语句与硬指令语句的本质区别是能不能产生CPU动作;伪指令的作用是完成对如存储模式、主存变量、子程序、宏及段定义等很多不产生CPU动作的说明,并在程序执行前由汇编程序完成处理。
〔习题3.2〕什么是标识符,汇编程序中标识符怎样组成?〔解答〕为了某种需要,每种程序语言都规定了在程序里如何描述名字,程序语言的名字通常被称为标识符;汇编语言中的标识符一般最多由31个字母、数字及规定的特殊符号(如-,$,?,@)组成,不能以数字开头。
〔习题3.3〕什么是保留字,汇编语言的保留字有哪些类型,并举例说明。
〔解答保留字是在每种语言中规定了有特殊意义和功能的不允许再做其它用处的字符串;汇编语言的保留字主要有硬指令助记、伪指令助记符、运算符、寄存器名以及预定义符号等。
汇编语言对大小写不敏感。
如定义字节数和字符串的DB就是伪指令助记符。
〔习题3.4〕汇编语句有哪两种,每个语句由哪4个部分组成?〔解答〕汇编语句有执行性语句和说明性语句;执行性语句由标号、硬指令助记符、操作数和注释四部分组成;说明性语句由名字、伪指令助记符、参数和注释四部分组成〔习题3.5〕汇编语言程序的开发有哪4个步骤,分别利用什么程序完成、产生什么输出文件。
〔解答〕⒈编辑文本编辑程序汇编语言源程序.asm⒉汇编汇编程序目标模块文件.obj⒊连接连接程序可执行文件.exe或.com⒋调试调试程序应用程序〔习题3.6〕区分下列概念:(1)变量和标号(2)数值表达式和地址表达式(3)符号常量和字符串常量〔解答〕(1)变量是在程序运行过程中,其值可以被改变的量;标号是由用户自定义的标识符,指向存储单元,表示其存储内容的逻辑地址。
(2)数值表达式一般是由运算符连接的各种常数所构成的表达式,地址表达式是由名字、标号以及利用各种的操作符形成的表达式。
汇编语言的所有指令数据传送指令集MOV功能: 把源操作数送给目的操作数语法: MOV 目的操作数,源操作数格式: MOV r1,r2MOV r,mMOV m,rMOV r,dataXCHG功能: 交换两个操作数的数据语法: XCHG格式: XCHG r1,r2 XCHG m,r XCHG r,mPUSH,POP功能: 把操作数压入或取出堆栈语法: PUSH 操作数POP 操作数格式: PUSH r PUSH M PUSH data POP r POP mPUSHF,POPF,PUSHA,POPA功能: 堆栈指令群格式: PUSHF POPF PUSHA POPALEA,LDS,LES功能: 取地址至寄存器语法: LEA r,m LDS r,m LES r,mXLAT(XLATB)功能: 查表指令语法: XLAT XLAT m算数运算指令ADD,ADC功能: 加法指令语法: ADD OP1,OP2 ADC OP1,OP2格式: ADD r1,r2 ADD r,m ADD m,r ADD r,data影响标志: C,P,A,Z,S,OSUB,SBB功能:减法指令语法: SUB OP1,OP2 SBB OP1,OP2格式: SUB r1,r2 SUB r,m SUB m,r SUB r,data SUB m,data影响标志: C,P,A,Z,S,OINC,DEC功能: 把OP的值加一或减一语法: INC OP DEC OP格式: INC r/m DEC r/m影响标志: P,A,Z,S,ONEG功能: 将OP的符号反相(取二进制补码)语法: NEG OP格式: NEG r/m影响标志: C,P,A,Z,S,OMUL,IMUL功能: 乘法指令语法: MUL OP IMUL OP格式: MUL r/m IMUL r/m影响标志: C,P,A,Z,S,O(仅IMUL会影响S标志)DIV,IDIV功能:除法指令语法: DIV OP IDIV OP格式: DIV r/m IDIV r/mCBW,CWD功能: 有符号数扩展指令语法: CBW CWDAAA,AAS,AAM,AAD功能: 非压BCD码运算调整指令语法: AAA AAS AAM AAD影响标志: A,C(AAA,AAS) S,Z,P(AAM,AAD)DAA,DAS功能: 压缩BCD码调整指令语法: DAA DAS影响标志: C,P,A,Z,S位运算指令集AND,OR,XOR,NOT,TEST功能: 执行BIT与BIT之间的逻辑运算语法: AND r/m,r/m/data OR r/m,r/m/data XOR r/m,r/m/data TEST r/m,r/m/data NOT r/m 影响标志: C,O,P,Z,S(其中C与O两个标志会被设为0) NOT指令不影响任何标志位SHR,SHL,SAR,SAL功能: 移位指令语法: SHR r/m,data/CL SHL r/m,data/CL SAR r/m,data/CL SAL r/m,data/CL影响标志: C,P,Z,S,OROR,ROL,RCR,RCL功能: 循环移位指令语法: ROR r/m,data/CL ROL r/m,data/CL RCR r/m,data/CL RCL r/m,data/CL 影响标志: C,P,Z,S,O程序流程控制指令集CLC,STC,CMC功能: 设定进位标志语法: CLC STC CMC标志位: CCLD,STD功能: 设定方向标志语法: CLD STD标志位: DCLI,STI功能: 设定中断标志语法: CLI STI标志位: ICMP功能: 比较OP1与OP2的值语法: CMP r/m,r/m/data标志位: C,P,A,Z,OJMP功能: 跳往指定地址执行语法: JMP 地址JXX功能: 当特定条件成立则跳往指定地址执行语法: JXX 地址注:A: ABOVE,当C=0,Z=0时成立B: BELOW,当C=1时成立C: CARRY,当弁时成立CXZ: CX寄存器的值为0(ZERO)时成立E: EQUAL,当Z=1时成立G: GREATER(大于),当Z=0且S=0时成立L: LESS(小于),当S不为零时成立N: NOT(相反条件),需和其它符号配合使用O: OVERFLOW,O=1时成立P: PARITY,P=1时成立PE: PARITY EVEN,P=1时成立PO: PARITY ODD,P=0时成立S: SIGN,S=1时成立Z: ZERO,Z=1时成立LOOP功能: 循环指令集语法: LOOP 地址LOOPE(Z)地址LOOPNE(Z) 地址标志位: 无CALL,RET功能: 子程序调用,返回指令语法: CALL 地址RET RET n标志位: 无INT,IRET功能: 中断调用及返回指令语法: INT n IRET标志位: 在执行INT时,CPU会自动将标志寄存器的值入栈,在执行IRET时则会将堆栈中的标志值弹回寄存器字符串操作指令集MOVSB,MOVSW,MOVSD功能: 字符串传送指令语法: MOVSB MOVSW MOVSD标志位: 无CMPSB,CMPSW,CMPSD功能: 字符串比较指令语法: CMPSB CMPSW CMPSD标志位: C,P,Z,S,OSCASB,SCASW功能: 字符串搜索指令语法: SCASB SCASW标志位: C,P,Z,S,OLODSB,LODSW,STOSB,STOSW功能: 字符串载入或存贮指令语法: LODSB LODSW STOSB STOSW标志位: 无REP,REPE,REPNE功能: 重复前缀指令集语法: REP 指令S REPE 指令S REPNE 指令S标志位: 依指令S而定对于IBM PC机它有它的指令系统,其中包括:数据传送指令、串处理指令、算术指令、控制移动指令、逻辑指令、处理机控制指令。
汇编语言程序设计第四版【课后习题答案】--囮裑為檤第2章8086的指令系统〔习题2.1〕已知DS=2000H、BX=0100H、SI=0002H,存储单元[20100H]~[20103H]依次存放12 34 56 78H,[21200H]~[21203H]依次存放2A 4C B7 65H,说明下列每条指令执行完后AX寄存器的内容。
(1)mov ax,1200h(2)mov ax,bx(3)mov ax,[1200h](4)mov ax,[bx](5)mov ax,[bx+1100h](6)mov ax,[bx+si](7)mov ax,[bx][si+1100h]〔解答〕(1)AX=1200H(2)AX=0100H(3)AX=4C2AH ;偏移地址=bx=0100h(4)AX=3412H ;偏移地址=bx=0100h(5)AX=4C2AH ;偏移地址=bx+1100h=1200h(6)AX=7856H ;偏移地址=bx+si=0100h+0002h=0102h(7)AX=65B7H ;偏移地址=bx+si+1100h=0100h+0002h+1100h=1202h〔习题2.2〕指出下列指令的错误(1)mov cx,dl(2)mov ip,ax(3)mov es,1234h(4)mov es,ds(5)mov al,300(6)mov [sp],ax(7)mov ax,bx+di(8)mov 20h,ah〔解答〕(1)两操作数类型不匹配(2)IP指令指针禁止用户访问(3)立即数不允许传给段寄存器(4)段寄存器之间不允许传送(5)两操作数类型不匹配(6)目的操作数应为[ SI ](7)源操作数应为[BX+DI](8)立即数不能作目的操作数〔习题2.3〕已知数字0 ~ 9对应的格雷码依次为:18H、34H、05H、06H、09H、0AH、0CH、11H、12H、14H,它存在于以table为首地址(设为200H)的连续区域中。
1. 请任意输入一个字符串,将该串倒序后在屏幕上显示。
DATA SEGMENT
BUF DB 0FFH
DB?
DB 0FFH DUP (?)
ANS DB 0DH,0AH,0FDH DUP (?);换行,回车
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX;固定格式
LEA DX,BUF; 这一步让等一会儿读的字符串的地址存储在DX中
MOV AH,0AH
INT 21H;dos调用,读字符串
LEA SI,BUF[2];送字符串首地址到源变址寄存器SI
MOV AL,BUF[1];送总字符串数到AL
XOR AH,AH;AH清零,相当于MOV AH,0
ADD SI,AX
DEC SI;SI内的内容变为字符串末尾地址
LEA DI,ANS[2];送ANS的首地址到目标变址寄存器DI
XOR CH,CH;清零
MOV CL,BUF[1];将字符串个数送至计数寄存器作为循环次数,以备loop使用,
AGAIN:
MOV AL,[SI]
MOV [DI],AL;将源变址寄存器所指内容送至目标寄存器所指位置(第一次就是末
尾到开头)
DEC SI;SI的地址指向字符串倒数的前一位
INC DI;DI指向下一位
LOOP AGAIN;循环上述内容,次数为CX内数,即字符串数
MOV BYTE PTR[DI],'$'
LEA DX,ANS;取ANS的EA到DX
MOV AH,09H;调用DOS功能输出ANS内容
INT 21H
MOV AH,4CH
INT 21H;固定
CODE ENDS
ENDSTART
8. 现有一组字符串为
data,name,time,file,code,path,user,exit,quit,text,请编写程
序从键盘输入4个字符的字符串,若存在将其修改为disk, 并在显
示器上显示。
DATA SEGMENT
BUF DB 05H
DB?
DB 05H DUP (?)
STROUT DB 0DH,0AH,'data'
DB 0DH,0AH,'name'
DB 0DH,0AH,'time'
DB 0DH,0AH,'file'
DB 0DH,0AH,'code'
DB 0DH,0AH,'path'
DB 0DH,0AH,'user'
DB 0DH,0AH,'exit'
DB 0DH,0AH,'quit'
DB 0DH,0AH,'text','$'
REPLACE DB'disk'
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ES:DATA
START:
MOV AX,DATA
MOV DS,AX
MOV ES,AX ;源操作数隐含的段寄存器是DS,目标操作数隐含的段寄存器ES
LEA DX,BUF ;取BUF的EA到DX,这样输入的字符存储到DX中
MOV AH,0AH
INT 21H ;0AH功能读字符串
LEA BX,STROUT[2] ;取预置字符串的首地址到BX(地址都是两个字节,
一个字,两个存储单元)
LEA SI,BUF[2] ;取输入字符串首地址到源变址寄存器SI
LEA DI,STROUT[2] ;取预置字符串首地址到目的变址寄存器DI
MOV CX,10 ;设置循环次数十次
AGAIN:
CLD ;置DF零(对应STD),DF为串操作方向标志,为1
时,每次字符串操作后SI,DI递减,反之递增
PUSH CX ;CX进栈
MOV CX,4 ;以上是进行字符串操作的准备,进行字符串操作
要把字符串长度(4)输入CX,也要设置SI,DI,DF
REPZ CMPSB ;字节形式比较字符串(SI,DI),REPZ为重复前缀,
相同时ZF=1,继续执行,不同时ZF=0,停止执行
POP CX ;CX出栈
JNZ NEXT ;JNZ/JNZ功能:ZF=0时(比较结果为不同)跳转至
标号处执行;
LEA SI,REPLACE ;取替换字符串(disk)地址(这一步的前提是上一步
的JNZ没有执行,即ZF=1,比较结果为相同)
MOV DI,BX ;取此时字符串的首地址地址到DI
MOV DX,4 ;DX=4
SUBAGAIN:
MOV AL,[SI]
MOV [DI],AL;这两步是取disk的首地址移动到此时DI所指的存储器单位(此
时的BX)
INC SI
INC DI;一位一位替换
DEC DX
JNZ SUBAGAIN ;DX为零时结束此循环,替换完成
JMP EXIT ;准备打印
NEXT:
LEA SI,BUF[2] ;取输入字符串的第二个字符的地址
ADD BX,6 ;加上存储的回车换行和下四个字符占用的地址
MOV DI,BX;把第二个字符串的首地址送到目的变址寄存器DI
LOOP AGAIN ;再比较,如果还不同就继续如此,直到CX=0,即循环十
次之后
EXIT:
LEA DX,STROUT
MOV AH,09H
INT 21H;调用09H功能输出DX内容
MOV AH,4CH
INT 21H
CODE ENDS
ENDSTART