汇编语言应该是我们现在学的最“低级”的语言了,因为现在不会再有人去学机器语言了。而汇编语言还在一些硬件或者嵌入式设备上使用并开发着。以下资料是为了大学的汇编考试整理的资料,现在与大家分享,希望能给大家提供帮助。
汇编语言程序设计汇总
计算机主要由运算器、控制器、存储器和输入输出设备五大部件构成。
字长word是指微处理器内部一次可以并行处理二进制代码的位数,它与微处理器内部寄存器以及CPU内部数据总线宽度是一致的,字长越长,所表示的数据精度就越高。
内存是由若干个存储单元组成,每个单元分配一个固定的地址并且存放一个字节的数据。
MIPS Millions of Instruction Per Second 每秒百万条指令
微机系统采用了多种系统总线标准,如ISA/EISA/VESA/PCI
系统总线分为数据总线、地址总线、控制总线。
Data Bus: DB
Address Bus: AB
讨论存储器容量时,以2的10次方即1024为基本单元,称为1K。1024K就是1M。
Control Bus : CB
CPU主频越高,其运算速度就越快。字长代表了CPU对数据处理的能力和精度。
OS的主要部分是常驻监督程序Monitor,只要一开机就存在于内存中,可以从用户接收命令,并使OS执行相应的动作。
汇编语言和机器语言一一对应。
汇编程序就是用来把由用户编制的汇编程序翻译成机器语言程序的一种系统程序。
高级语言的翻译程序有两种:
一种是先把高级语言程序翻译成机器语言,(或先翻译成汇编语言,然后又汇编程序再次翻译成机器语言)然后才能在机器上执行。——编译程序
直接把高级语言程序在机器上运行,一边解释一边执行。——解释程序
翻译程序包括汇编程序、解释程序、编译程序。
ALU :算术逻辑运算单元:用来进行算术和逻辑运算及其相应操作。
8086 CPU内部结构按功能分为:
总线接口单元 BIU:Bus Interface Unit
执行单元 EU: Executive Unit
8086对存储器和IO设备的所有操作都是由BIU完成的。
8086CPU的20位地址线可直接寻址1M存储器物理空间,但CPU内部寄存器均为16位的寄存器,16位寄存器如何实现20位地址寻址呢?
CPU是将有关寄存器内容左移4位,然后由专门地址加法器,与16位偏移地址相加,形成20位的物理地址,以便找到存储单元。
指令指针 IP : Instruction Pointer
IP 用来存放下一条要执行指令在代码中的偏移地址。
IP的内容由BIU自动修改,使它总是指向下一条要取的指令在现行代码段中的偏移地址。
由于BIU和EU是各自独立并行工作的。在EU执行指令的同时,BIU可预取下面一条或几条指令。
Flags:反映CPU运算中的状态特征和存放某些控制标志。
通用寄存器组:
包括4个16位的数据寄存器:AX/BX/CX/DX
和4个16位指针与变址寄存器:SP/BP/SI/DI
8086CPU的外部数据总线和内部数据总线都是16位的,是真正的16位机。
寄存器可以分为程序可见寄存器和程序不可见寄存器。
程序可见寄存器是指在汇编语言程序设计中用到的寄存器,可以由指令来指定。
程序不可见寄存器指一般程序设计中不用而由系统所用的寄存器。
程序可见寄存器可以分为通用寄存器、专用寄存器和段寄存器。
AX/BX/CX/DX是数据寄存器,用来暂时存放计算过程中用到的操作数,结果或其他信息。可以以字(16位),或字节(8位)形式访问。都是通用寄存器,但又有各自专用的功能。
AX: Accumulator,做累加器用,是算术运算的主要寄存器。
BX: Base,做通用寄存器使。在计算存储器地址时,常用作基址寄存器。
CX:Count,作为通用寄存器使用,常用来保存计数值。如在移位指令、循环和串处理指令中作隐含的计数器。
DX:Data:可做通用寄存器使用,在做双字长运算时把DX和AX组合在一起存放一个双字长数,DX存放高位字。
SP/BP/SI/DI四个16位寄存器可以像数据寄存器一样在运算中存放操作数。但只能以字(16位)为单位使用。
一般用在存储器寻址时,提供偏移地址。
SP:Stack Pointer:栈指针寄存器,用来指示栈顶的偏移地址。
BP:Base Pointer:基址指针寄存器。
SI:Source Index:源变址寄存器
DI: Destination Index:目的变址寄存器
CS:段寄存器
IP:Instruction Pointer 是指令指针寄存器,用来存放代码段中的偏移地址。在程序运行中,始终指向下一条指令的首地址。与CS连用确定下一条指令的物理地址。
Flags是标志寄存器,又称程序状态字寄存器PSW Program Status Word
条件码标志记录程序中运行结果的状态信息,是根据有关指令的运行结果由CPU自动设置的。这些状态信息作为后续条件转移指令的转移控制条件,所以称为条件码。
OF: Overflow Flag 溢出标志
SF: Sign Flag 符号标志
ZF: Zero flag 零标志
CF: Carry Flag 进位标志
AF: Auxiliary Carry Flag 辅助进位标志
PF: Parity Flag 奇偶标志
DF :Direction Flag 方向标志
IF: Interrupt Flag 中断标志
段寄存器也是一种专用寄存器,专用于存储器寻址,用来直接或间接存放段地址。
CS: Code Segment 代码段寄存器
DS: Data Segment 数据段寄存器
SS: Stack Segment 堆栈段寄存器
ES: Extra Segment 附加段寄存器
一个存储单元中存放的信息称为该存储单元的内容。
在存储单元里以字节为单位存储信息。
如果机器字长为8位时,则地址为0004H单元中存放的信息为78H。也就是说,该单元的内容为78H。(0004H)=78H
一个字存入存储器要占有连续的两个字节单元。存放时低位字节存入低地址,高位字节存入高地址。这样两个字节单元就构成了一个字单元。 字单元的地址用它的低地址表示。(0004H)=5678H
双字单元的存放方式与字单元类似,他被存放在相继的4个字节中,低位字存入低地址区,高位字存入高地址区。双字单元的地址有其最低字节的地址指定。(0004H)=12345678H。
1字=2字节
同一个地址既可以作为字节单元的地址,又可看做字单元,双字单元或四字单元的地址。
如果用X表示某存储单元的地址,则X单元的内容可以表示为(X);假如X单元中存放着Y,而Y又是一个地址,则可用(Y)=((X))表示Y单元的内容。
eg:(0004H)=5678H,5678H又是一个存储单元地址,(5678H)=2F1EH,2F1EH才是真正的内容。
即((0004H))=2F1EH。
在1M的存储器里,每一个存储单元都有一个唯一的20位地址,称为该存储单元的物理地址。
段地址是指每一段的起始地址(又称段基地址),由于他必须是段的首地址,所以低四位一定是0,可以规定段地址只取段起始地址的高16位值。
偏移地址指在段内相对于段起始地址的偏移值。
把段地址左移四位再加上偏移地址就形成物理地址。
物理地址=段地址*16D+偏移地址
等价于
物理地址=段地址*10H+偏移地址
专门存放段地址的寄存器,称为段寄存器。
CS:代码段
DS:数据段
SS:堆栈段
ES:附加段
每个段寄存器可以确定一个段的起始地址。
MOV AX,ES:[BX]
ES作段寄存器,BX作间接寄存器寻址的单元送入AX寄存器。
MOV BX,ES:[SI]
ES作段寄存器,SI作间址寄存器的寻址单元内容送入BX寄存器。
MOV EAX,DS:[BP]
DS作段寄存器,BP作间址寄存器寻址的单元内容送入EAX寄存器。
一个计算机的指令集合,就是该计算机的指令系统。
每条指令有两部分组成,操作码字段和地址码字段。
操作码字段:说明该指令所要完成的操作,即该条指令的性质。
地址码字段:描述该指令的操作对象。
一般地址码字段一般是直接给出操作数;或者给出操作数存放的寄存器编号;或者给出操作数存放的存储单元的地址或有关的地址的信息。
根据地址码字段所给出的地址的个数,指令格式可分为零地址、一地址、二地址、三地址、多地址指令。
指令中用于确定操作数存放地址的方法,称为寻址方式。
如果地址码字段直接给出了操作数,这种寻址方式是立即寻址。
如果地址码字段指出了操作数所在的寄存器编号,叫寄存器寻址。
如果操作数存放在存储器中,则地址码字段通过各种方式给出了存储器地址,叫存储器寻址。
寻找和获得操作数或操作数存放地址或指令转移地址的方法称为寻址方式。
操作数及操作结果存放的地址有三处:存放在指令的地址码字段中;存放在寄存器中;存放在存储器的数据段(DS)、堆栈段(SS)或附加数据段(ES)中。
其对应有三种操作数:立即操作数、寄存器操作数、存储器操作数
要寻找这些操作数就有三种基本寻址方式:立即寻址方式、寄存器寻址方式、存储器寻址方式。
立即寻址方式寻找的操作数紧跟在指令操作码之后。
格式:操作码 数字表达式
MOV AX,267
MOV AL,10010011B AND 0FEH
MOV AL,PORT1
MOV AX,DATA1
“267”是数字,“10010011B AND 0FEH”是数字表达式,PORT1是一个符号名,属于常数。DATA1是定义的段名,就是段地址,属于常数。
汇编立即寻址方式时,汇编程序首先计算数字表达式的值,然后写入指令的地址码字段,称为立即数。
寄存器寻址是指要寻找的操作数在某个寄存器中。
格式:操作码 寄存器名
MOV AX,BX
MOV AL,BL
汇编程序将寄存器的地址编号写入指令的地址码字段,当机器执行含有这种寻址方式的指令时,根据地址码字段的编号访问到寄存器,继而访问到操作数。
存储器寻址方式:当操作数放在存储器中的某个单元时,CPU要访问存储器才能获得该操作数。如果存储器的存储单元是20位,通过各种方法算出段内偏移地址(有效地址),结合段地址形成20位物理地址,找到操作数,称为存储器寻址。
直接寻址方式是指要寻找的操作数的地址在指令中直接给出。
格式:
操作码 地址表达式
操作码 [地址表达式]
操作码 [数字表达式]
如:假设TABLE是在数据段定义的一个字节数组的首地址标号,偏移地址为1000H
MOV AL,TABLE
MOV AL,[TABLE]
MOV AL,[1000H]
是等价的。
直接寻址方式默认的段地址是DS。
若允许在汇编指令中指定除DS寄存器以外的段寄存器作为操作数的段地址,这就是段超越。
用段超越前缀表示:
段寄存器名:地址表达式
段寄存器名:[地址表达式]
段寄存器名:数字表达式
段寄存器名:[数字表达式]
如:
设TABLE是在附加数据段定义的一个字节数组的首地址标号,其偏移地址为1000H,则
MOV AL,ES:TABLE
MOV AL,ES:[TABLE]
MOV AL,ES:1000H
MOV AL,ES:[1000H]
表示将字节数组的第一个数组元素送入AL寄存器中。
寄存器间接寻址方式:通常将BX,BP称为基址寄存器,SI,DI称为变址寄存器,寻址时操作数的地址被放在这些寄存器中。
格式:
操作码 [基址寄存器名或变址寄存器名]
MOV AX,[BX]
MOV AX,[SI]
也允许指定段超越前缀来取得其他段中的数据:
MOV AX,ES:[BX]
寄存器相对寻址:
操作数的偏移地址是指定寄存器的值与一个整数之和。
格式:
操作码 变量名[机制寄存器名或变址寄存器名]
操作码 [变量名+基址寄存器名或变址寄存器名]
操作码 符号名[机制寄存器名或变址寄存器名]
操作码 [符号名+基址寄存器名或变址寄存器名]
操作码 机制寄存器名或变址寄存器名+/-数字表达式
如:
MOV SI,5
MOV AL,TABLE[SI] == MOV AL,[TABLE+SI]
基址变址寻址方式:操作数的偏移地址是两个指定寄存器的值之和。
格式:
操作码 [基址寄存器名][变址寄存器名]
操作码 [基址寄存器名+变址寄存器名]
如:
MOV AX,[BX][SI]
MOV AX,[BX+SI]
当机器执行含有这种寻址方式的指令时,依据地址码字段的值得到基址寄存器和变址寄存器的值,将其相加,和作为操作数的偏移地址。
可以用段超越前缀重新指定段寄存器:
MOV AL,ES:[BX][SI]
相对基址变址寻址:操作数偏移地址是指定寄存器的值与相对偏移量之和。
MOV AL,TABLE[BX][SI]
MOV AL,TABLE[BX+SI]
MOV AL,[TABLE+BX+SI]
格式:
操作码 变量名[基址寄存器名][变址寄存器名]
操作码 变量名[基址寄存器名+变址寄存器名]
操作码 [变量名+基址寄存器名+变址寄存器名]
符号名 变量名[基址寄存器名][变址寄存器名]
符号名 变量名[基址寄存器名+变址寄存器名]
符号名 [变量名+基址寄存器名+变址寄存器名]
操作码 [基址寄存器名+变址寄存器名+/-数字表达式]
四类传送指令:通用传送指令、累加器专用传送指令、地址传送指令、标志传送指令
DST:目的操作数
SRC:源操作数
REG:寄存器
SEGREG:段寄存器
MEM:存储器
DATA:立即数
PUSHF:标志入栈指令
POPF:标志出栈指令
XCHG:交换指令
MOV:可实现寄存器之间、寄存器和存储器之间传送数据,还可实现立即数送寄存器或存储单元的操作。
MOV:原操作数与目的操作数不能同时为存储器寻址方式,即两个内存单元之间不能直接传送指令。
MOV:两个段寄存器之间不允许直接传送数据。
把CPU内部的寄存器细分为段寄存器和寄存器。MOV有9种指令。
MOV的9种传送方式:
从寄存器到寄存器
MOV REG1,REG2
如:
MOV AX,BX
MOV AH,CL
MOV BX,SI
MOV DI,DX
从寄存器到段寄存器
MOV SEGREG1,REG
如:
MOV DS,AX
MOV ES,DX
MOV SS,DI
从寄存器到存储器
MOV MEM,REG
MEN指以下五种存储器寻址方式:直接、寄存器间接、寄存器相对、基址变址、相对基址变址。
如:
TABLE是定义的字变量
MOV TABLE,AX
MOV [BX],BX
MOV TABLE[BX],CX
MOV [BX][SI],DX
MOV TABLE[BX][SI],AX
从段寄存器到寄存器
MOV REG,SEGREG
格式:
MOV AX,CS
MOV BX,ES
MOV DI,SS
MOV SI,DS
从存储器到寄存器
MOV REG,MEM
格式:
MOV AX,TABLE
MOV BX,[BX]
MOV CX,TABLE[BX]
MOV DX,[BX][SI]
MOV AX,TABLE[BX][SI]
从段寄存器到存储器
MOV MEM,SEGREG
格式:
MOV TABLE,CS
MOV [BX],ES
MOV TABLE[DI],SS
MOV [BX][SI],DS
MOV TABLE[BX][SI],ES
从存储器到段寄存器
MOV SEGREG,MEM
格式:
MOV ES,[BX]
MOV SS,TABLE[DI]
MOV DS,[BX][SI]
从立即数到寄存器
MOV REG,DATA
格式:
MOV AX,OOH
MOV BX,12H
MOV CX,34H
MOV SI,56H
从立即数到存储器
MOV MEM,DATA
格式:
MOV TABLE,DATA
MOV WORD RTR[BX],0FFSET TABLE
MOV TABLE[DI],ABC
MOV [BX][SI],ABC+2
MOV TABLE[BP][SI],0FFH
ABC是符号名,相当于一个常数,TABLE是变量名。
PUSH指令
格式:
PUSH SRC
将16位寄存器、段寄存器、16位存储单元数据压入堆栈。
POP指令
格式:
POP DST
将堆栈中的16位数据送入16位寄存器、段寄存器、16位存储单元中。
堆栈中数据的压入弹出必须以字为单位进行。
PUSHF指令
格式:
PUSHF
将标志寄存器内容压入堆栈
POPF
格式:
POPF
将16位堆栈数据弹入标志寄存器中。
XCHG指令
XCHG指令可实现字互换和字节互换。
互换可以在寄存器之间进行,也可以在寄存器和存储单元之间进行。
格式:
XCHG DST,SRC
互换源、目的两个操作数的存放位置。
XCHG指令源、目的操作数的寻址方式不允许是立即寻址方式,两个存储单元之间不能直接互换数据。
地址传送指令:将地址送到指定的寄存器中
LEA:偏移地址送寄存器
LDS:指针送指定寄存器和DS
LES:指针送指定寄存器和ES
格式:LEA REG,SRC
操作:(REG)SRC的偏移地址
功能:把源操作数的偏移地址送到指定的寄存器
LDS:指针送指定寄存器和DS寄存器
格式:LDS REG,SRC
操作:(REG)(SRC)
(DS)(SRC+2)
功能:将源操作数寻址到的存储单元的第一个源操作数(字)送16位寄存器,第二个源操作数(字)送DS寄存器。
LES:指针送指定寄存器和ES寄存器指令
格式:LES REG,SEC
操作:(REG)(SRC)
(ES)(SRC+2)
功能:将源操作数寻址到的存储单元的第一个源操作数(字)送16位寄存器,第二个源操作数(字)送ES寄存器。
LEA BX,TABLE
TABLE是数据段中定义的地址标号,指令执行前,如果(BX)=0000H,(DS)=2000H,TABLE=20020H,执行后,(BX)=0020H
加法指令ADD
格式:ADD DST,SRC
操作:(DST)(SRC)+(DST)
功能:完成源操作数和目的操作数的加法运算,并把运算结果保存在目的操作数中。
带进位加法指令ADC
格式:ADC DST,SRC
操作:(DST)(SRC)+(DST)+CF
功能:完成带进位的源操作数和目的操作数的加法运算,并把结果保存在目的操作数中。
增量指令 INC
格式:INC DST
操作:(DST)(DST)+1
功能:完成目的操作数的自加运算
ADD和ADC指令两个操作数不能同时为存储器寻址方式,并且目的操作数不能为立即数寻址方式。
INC指令的操作数不能为立即数寻址方式。
完成双字长相加,被加数存放在DX和AX中,加数放在BX和CX中,和放在DX和AX中,
ADD AX,CX
ADC DX,BX
SUB减法指令
格式:SUB DST,SRC
操作:(DST)(DST)-(SRC)
功能:完成源操作数和目的操作数的减法运算,把结果保存在目的操作数中。
SBB 带借位减法指令
格式:SBB DST,SRC
操作:(DST)(DST)-(SRC)-CF
功能:完成带借位的源操作数和目的操作数的减法运算,并把运算结果保存在目的操作数中。
DEC 减量指令
格式:DEC DST
操作:(DST)(DST)-1
功能:完成目的操作数的自减运算。
NEG 求补指令
格式:NEG DST
操作:(DST)0-(DST)
0-操作数=-操作数
CF表示机器的最高有效位向更高有效位的进位。
减数>被减数,此时有借位,则CF=1,否则CF=0.
完成双字长相减操作,被减数存放在DX和AX中,减数存放在BX与CX中,差放在DX和AX中,
SUB AX,CX
SBB DX,BX
乘法指令
乘法指令可对字节、字、双字进行操作,且可对有符号数整数或无符号整数进行操作。
两个8位数相乘,结果为16位数。
两个16位数相乘,结果为32位数。
无符号数指令MUL
格式:MUL SRC
操作:
字节操作:(AX)(AL)*SRC
字操作:(DX-AX)(AX)*SRC
有符号数乘法指令IMUL
格式:IMUL SRC
在乘法指令中,被乘数也即目的操作数隐含在AX(字运算)或AL(字节运算)中,乘数也即源操作数。
两个8位数相乘是16位,存放在AX中。
两个16位数相乘是32位,存放在DX,AX中。
其中DX存放高位字,AX存放低位字。
MUL CL ;AL的内容乘以CL的内容,无符号数存于AX。
IMUL DL ;AL的内容乘以DL的内容,有符号数存于AX。
MUL BYTE PTR[BX] ;AL内容乘以数据段中由BX寻址的字节存储单元的内容,无符号积存于AX。
120. IMUL WORD PTR[BP] ;AX内容乘以堆栈段中由BP寻址的字存储单元的内容,带符号的积存于DX,AX。
121. 逻辑运算指令:可对8位数或16位数进行逻辑运算,是按位操作的。
122.AND逻辑与指令
格式:AND DST,SRC
操作:(DST)(DST)(SRC)
本指令的功能用于使某个操作数中的若干位维持不变,而使另外若干位位0的操作,也称屏蔽某些位。
要维持不变的位必须和1相与,而要置零的位必须和0相与。
123.屏蔽AL中的高四位
AND AL,00001111B
124.AND AL,AL
指令执行前后,AL无变化,但执行后使标志位发生了变化,即CF=0,OF=0.
125.OR逻辑或指令
格式:OR DST,SRC
操作:(DST)(DST)(SRC)
本指令用于使某个操作数中的若干位维持不变,使另外若干位置1的场合。要维持不变的必须和0相或,而置为1的位必须和1相或。
126.OR AL,10000000B
若执行前(AL)=OFH,则执行后(AL)=8FH.
127.OR AL,AL
指令执行前后,(AL)不变,但执行后标志位发生了变化,即CF=0,OF=0.
128.XOR 逻辑异或指令
格式:XOR DST,SRC
操作:(DST)(DST)异或(SRC)
用于判断两个数是否相等;也可用于操作数中的若干位维持不变,而使另外若干位取反的操作,维持不变的位与0相异或,取反的位与1相异或。
129.XOR AL,AL
执行后,使(AL)=0,CF=0,OF=0.
130.测试AL是否等于33H
XOR AL,33H
JZ MATCH
131.使AL中最高位和最低位取反,其他位保持不变
XOR AL,10000001B
132.TEST测试指令
格式:TEST DST,SRC
操作:(DST) (SRC)
用于不改变原有操作数的情况下,用来检测某一位或某几位的条件是否满足,用于条件转移指令的先行指令。
不检测的那些位与0相与,即屏蔽掉。
检测的那些位与1相与,即保持不变。
133.检测(AL)的最高位是否为1,若为1则转移,否则顺序执行。
TEST AL,10000000B
JNZ AA
…..
AA:…
134.NOT逻辑非指令
格式:NOT DST
寻址方式不允许为立即寻址方式及段寄存器。
135.指令寻址方式是确定下一条要执行指令的地址的方法。
136.段内直接寻址
这种寻址方式的汇编格式有三种:
指令名 SHORT 转移目标地址标号
指令名 转移目标地址标号
指令名 NEAR PTR 转移目标地址标号
指令中直接指明了要转移的目标地址,因此叫直接寻址。又因为这种指令只改变了IP寄存器的值而不改变CS寄存器的值,因此又叫段内寻址。
当执行这种寻址方式的转移指令时,机器取出位移量,与当前IP相加,和送入IP寄存器中,CS寄存器内容保持不变,从而实现转移。
位移量不同,转移范围不同。当位移量位8位,只允许转移到与本条指令的下一条指令相距-128~127范围内的存储单元中。当位移量位16位时,允许转移到当前代码段内任何地方。
137.位移量可以是一个带符号的8位数,也可以是一个带符号的16位数。表示了转移地址偏移本条指令的下一条指令的字节数。负数表明要向当前指令的后面跳转,整数要向当前指令的前面跳转。
138.条件转移指令的位移量只能是8位,而无条件转移指令可以是8位或16位。
139.转移指令是一种主要的程序控制指令,其中无条件转移指令使汇编者能跳过程序某些部分转移到任何分支中去。
140.条件转移指令可使编程者根据结果来决定转到何处。测试的结果保存在标志位中,然后又被条件转移指令检测。
141.比较两个数,若两数相等则转移,否则顺序执行
CMP AX,BX
JZ SS2
…
SS1:…
SS2:…
142.两个无符号数比较大小时,机器根据CF标志位来判断大小,即两无符号数相减,若不够减,则最高位有借位,CF=1;否则CF=0。
当CF=1时,说明被减数低于减数;
当CF=0且ZF=0时,说明被减数高于减数;
当CF=0且ZF=1时,说明被减数等于减数。
143.变量TABLE中存放了一个偏移地址,当无符号数X小于、等于或大于此偏移地址时,应去执行三个不同的程序段。
MOV BX,TABLE
MOV AX,X
CMP AX,BX
JA SS3
JZ SS2
…
SS1:… ;低于程序段
SS2:… 等于程序段
SS3:… 高于程序段
144.比较两个数,相等则转移,否则顺序执行
CMP AX,BX
JZ SS2
…
SS1:…
SS2:…
145.中断:Interrupt
146.NOP:无操作指令,不执行任何操作
HLT:停机指令,使CPU处于暂停状态。
147.段间直接寻址
(1)指令名 FAR PTR 转移地址标号
(2)指令名 段地址:段内偏移地址
指令中直接指明了要转移的目标地址,此转移地址或用地址标号或用数值地址表示,因此叫直接寻址。
又因为这种指令不仅改变IP寄存器的值而且改变CS寄存器的值,因此又叫段间寻址。
148.段内间接寻址
(1)指令名 16位寄存器名
(2)指令名 WORD PTR 存储器寻址方式
转移的目标地址放在寄存器或存储器中,因此叫寄存器间接寻址。指令只改变IP寄存器的值而不改变CS寄存器的值,因此又叫段内寻址。
149.段间间接寻址
指令名 DWORD PTR 存储器寻址方式
转移的目标地址放在存储器中,称作间接寻址。
又因为指令不仅改变IP寄存器的值而且改变CS寄存器的值,因此又叫段间寻址。
150.控制转移指令通过改变CS,IP来控制程序的指令流程。
151.JMP段内直接寻址
(1)段内直接短转移
格式:JMP SHORT 转移地址标号
操作:IP(当前IP)+8位偏移量
转移范围:转到本条指令的下一条指令的-128~127个字节范围内。
段内直接近转移
格式1:JMP NEAR PTR 转移地址标号
格式2:JMP 数值偏移地址
可转移到当前代码段中任何地方。
152.JMP 段内间接转移
(1)格式:JMP 16位寄存器名
功能:无条件转移到当前段的指定偏移地址处
(2)格式:JMP 存储器寻址方式
功能:无条件转移到当前段的指定偏移地址处
153.段间直接转移
(1)格式:JMP FAR PTR 转移地址标号
操作:IP转移地址标号的偏移地址
CS转移地址标号的段地址
功能:无条件转移到指定标号地址处往下执行。
(2)格式:JMP 段地址值:偏移地址
操作:IP偏移地址值
CS段地址值
功能:无条件转移到指定段的地址往下执行。
154.段间间接转移
格式:JMP DWORD PTR 存储器寻址方式
操作:IP寻址到存储单元的第一个字
CS寻址到存储单元的第二个字
功能:无条件转移到指定段的指定偏移地址处。
155.所有JMP指令都不影响状态标志位。
156.CALL调用指令
(1)段内直接调用
格式:CALL NEAR PTR 子程序名
CALL 子程序名
(2)段内间接调用
格式:CALL 16位寄存器名
CALL WORD PTR 存储器寻址方式
(3)段间直接调用
格式:CALL FAR PTR 子程序名
段间间接调用
格式:CALL DWORD PTR 存储器寻址方式
157.RET返回指令
(1)段内返回
格式:RET
(2)段间返回
格式:RET
(3)段内带立即数返回
格式:RET 表达式
(4)段间带立即数返回
格式:RET 表达式
158.循环控制指令:LOOP/LOOPZ/LOOPE/LOOPNZ/LOOPNE
格式:
指令名 循环入口的地址标号
操作:判断测试条件,若条件成立,则IP(IP)+8;若条件不成立,则IP保持不变。
循环指令用的是段内直接寻址法,是相对转移指令。
159.从寄存器里取数据比从存储器里取数据快得多从而提高了指令执行速度。
160.假设TABLE是在数据段定义的一个字节数组的首地址标号,其偏移地址为1000H,则:
MOV AL,TABLE = MOV AL,[TABLE] = MOV AL,[1000H]
MOV AL,TABLE+2 = MOV AL,[TABLE+2] = MOV AL,[1000H+2]
160.段超越前缀
假设TABLE是在附加数据段定义的一个字节数组的首地址标号,其偏移地址为1000H,则
MOV AL,ES:TABLE
MOV AL,ES:[TABLE]
MOV AL,ES:1000H
MOV AL,ES:[1000H]
161.BX,BP称为基址寄存器
SI,DI称为变址寄存器
MOV AX,[BX]
MOV AX,[SI]
MOV AX,[基址寄存器名或变址寄存器名]
162.注意寄存器间接寻址和相对寻址的区别
163.寄存器相对寻址:操作数的偏移地址是指定寄存器的值与一个整数之和。
164.LEA 取偏移指令
ABC EQU 5
LEA SI,TABLE
MOV AL,ABC[SI]
165.[BX+6] [BP-1000H] [SI+OFFSET TABLE] 都是寄存器相对寻址。
166.基址变址寻址:操作数的偏移地址是两个指定寄存器的值之和。
如:
[基址寄存器名][变址寄存器名]
[基址寄存器名+变址寄存器名]
167.相对基址变址寻址
MOV AL,TABLE[BX][SI]
MOV AL,TABLE[BX+SI]
MOV AL,[TABLE+BX+SI]
168.两个段寄存器之间不允许直接传送数据。
如:
DATA是用户定义的一个数据段的段名
则:
MOV AX,DATA
MOV DS,AX
错误:MOV DS,DATA
169.MOV AX,1234H
PUSH AX
执行前 (SS)=2000H,(SP)=00FEH
执行后 (SS)=2000H,(SP)=00FCH
注意:入栈时,SP-2
170.XCHG BX,[BP+SI]
指令执行前:
(BX)=1234H,(BP)=0100H,(SI)=0020H,(SS)=1F00H,(1F120H)=0000H
则 源操作数物理地址=1F00H*10H+0100H+0020H=1F120H
执行后:
(BX)=0000H
(1F120H)=1234H
171.有两个5字节变量X(789623A789H),Y(2375937B60H),求ZX+Y
解:
DATA SEGMENT
X DB 89H,0A7H,23H,96H,78H
Y DB 60H,7BH,93H,75H,23H
Z DB 5 DUP(0)
DATA ENDS
CODE SEGMENT
ASSUME DS:DATA,CS:CODE
START:
MOV AX,DATA
MOV DS,AX
MOV CX,5
MOV SI,0
PO:
MOV AL,X[SI]
ADC AL,Y[SI]
MOV Z[SI],AL
INC SI
DEC CX
JNZ PO
MOV AH,4CH
INT 21H
CODE ENDS
END START
172.
DB :DEFINE BYTE 定义字节 一个字节长
DW:DEFINE WORD 定义字 两个字节长
DD:DEFINE DWORD 定义双字 四个字节长
173.AX1+2+3+…+100
CODE SEGMENT
ASSUME CS:CODE
START:
MOV AX,0
MOV SI,1
MOV CX,100
PO:
ADD AX,SI
INC SI
DEC CX
JNZ PO
CODE ENDS
END START
174.X,Y串长度为N,X=Y显示Z,X!=Y显示Y
解:
DATA SEGMENT
N EQU 20
X DB N DUP(0)
Y DB N DUP(0)
DATA ENDS
CODE SEGMENT
ASSUME DS:DATA,ES:DATA,CS:CODE
START:
MOV AX,DATA
MOV DS,AX
MOV ES,AX
MOV CX,N
LEA SI,X
LEA DI,Y
CLD DF=0
PO:
MOV AL,[SI]
CMP AL,[DI]
JNZ NP
INC SI
INC DI
DEC CX
JNZ PO
MOV DL,’Z’
MOV AH,02H
INT 21H
JMP DP
NP:
MOV DL,’Y’
MOV AH,02H
INT 21H
DP:
MOV AH,4CH
INT 21H
CODE ENDS
END START
175.完成两个字节数据相加
解:
DATA SEGMENT
BUF1 DB 34H
BUF2 DB 2AH
SUM DB ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
MOV AL,BUF1
ADD AL,BUF2
MOV SUM,AL
MOV AH,4CH
INT 21H
CODE ENDS
END START
176.伪指令语句也叫指示性语句,只是用来指示、引导汇编程序在汇编过程中做一些操作,为汇编程序在翻译时提供有关信息,并不翻译机器代码的语句。
177.一条宏指令语句的功能相当于若干条指令语句的功能。
178. ;注释
179.操作码用来指明操作的性质或功能。指令中的助记符都是操作码。MOV、ADD都是操作码。
180.CLC 操作数默认在CF中。
181.对于十六进制数,当以A~F开头,前面加数字0,以避免和名字混淆,如十六进制A6H,应该写成0A6H,否则容易和名字A6H混淆。
182.常数用符号名来代替就是符号常数。
用COUNT EQU 3或COUNT=3定以后COUNT就是一个符号常数,与数值常数3等价。
183.两个地址相加、相乘、相除是没有意义的。
184.MOV AL,4*8+5 ;数值表达式
MOV SI,OFFSET BUF+12 ;D地址表达式
185.逻辑运算符只能用于数值表达式中,不能用于地址表达式中。
186.关系运算符
EQ 相等
LT 小于
LE 小于等于
GT 大于
GE 大于等于
NE 不等于
运算结果为真时,表示为0FFFFH,运算结果为假时,为0000H
MOV BX,32 EQ 45 等价于 MOV BX,0000H
MOV BX,56 GT 30 等价于 MOV BX,0FFFFH
187.一条语句可以写在多行上,续行符是&
188.分离运算符
(1)LOW 运算符
格式:LOW 表达式
功能:取表达式的低字节部分
(2)HIGH运算符
格式:HIGH 表达式
功能:取表达式的高字节部分
188.CONSTANT EQU 256
DATA EQU HEIGHT+12 ;HEIGHT是标号,地址表达式赋以符号名DATA
ALPHA EQU 7
BETA EQU ALPHA-2
ADDR EAU VAR+BETA
B EQU [BP+8]
P8 EQU DS:[BP+8]
189.EQU伪操作中的表达式是不允许重复定义的,而=伪操作允许重复定义。
190.解除定义伪指令 PURGE
Y1 EQU 7
PURGE Y1
Y1 EQU 88
191.DB :伪指令用来定义字节,其后的每一个操作数都占有一个字节(8位)的存储单元。
DW:伪操作定义字,其后的每个操作数占有一个字(16位),低位字节在第一个字节地址中,高位字节在第二个字节地址中。
DD:定义双字。
191.操作数“?”可以保留存储空间。但不存入数据。待到程序运行时存放中间或最终结果。
192.汇编源程序定义:
DATA_SEG1 SEGMENT ;定义数据段
…
DATA_SEG1 ENDS
DATA_SEG2 SEGMENT ;定义附加段
…
DATA_SEG2 ENDS
CODE_SEG SEGMRNT
ASSUME CS:CODE_SEG,DS:DATA_SEG1,ES:DATA_SEG2
START: ;开始执行的入口地址
MOV AX,DATA_SEG1
MOV DS,AX
MOV AX,DATA_SEG2
MOV ES,AX
CODE_SEG ENDS ;代码段定义结束
END START ;源程序结束
193.实现两个32位数的乘法程序
解:
DATA SEGMENT
NUM1 DD 12345678H
NUM2 DD 5A4BEF06H
RESULT DD 2 DUP(?)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
MOV EAX,NUM1
MUL EAX,NUM2
MOV RESULT,EAX
MOV RESULT+4,EDX
MOV AH,4CH
INT 21H
CODE ENDS
END START
194.将一个字节压缩BCD码转化成两个ASCII码
分析:一个字节的压缩BCD码就是用一个字节的二进制数表示两位十进制数,如十进制96表示成压缩BCD码就是96H,转化成ASCII码就是把压缩BCD码表示的十进制数的高位和低位分开,并以ASCII码表示,即装化成39H,36H
解:
DATA SEGMENT
BCDBUF DB 96H
ASCBUF DB 2 DUP(?)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
MOV AL,BCDBUF ;取出BCD码
MOV BL,AL ;送BL暂存
MOV CL,4
SHR AL,CL ;高四位变低四位,高四位补零(96H09H)
ADD AL,30H ;变成ASCII码(39H)
MOV ASCBUF,AL ;存储第一个ASCII码
AND BL,0FH ;屏蔽高四位,只保留低四位(96H06H)
ADD BL,30H ;变成BCD码(36H)
MOV ASCBUF+1,BL ;存储第二个码
MOV AH,4CH
INT 21H
CODE ENDS
END START
195.利用直接查表法完成将键盘输入的一位十进制数(0~9)转换成对应的平方值,并存放在SQRBUF中。
分析:0~9的平方值分别为0,1,4,9,16,25,36,49,64,81.把平方值放在一起形成一个平方值表,根据输入的值和对应平方值所在单元地址之间的关系(表首地址加上输入的值),查出相应的平方值。
解:
DATA SEGMENT
SQRTAB DB 0,1,4,9,16,25,36,49,64,81
SQRBUF DB ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
MOV BX,OFFSET SQRTAB ;平方表首地址
MOV AL,1
INT 21H ;由键盘输入一个数,得到其ASCII码
SUB AL,30H ;由ASCII码得到相应的数
XLAT ;查表
MOV SQRBUF,AL ;存储结果
MOV AH,4CH
INT 21H
CODE ENDS
END START
196.从键盘输入一个小写字母,将其转化成大写字母在屏幕上显示出来。
分析:用DOS功能调用来实现 ASCII-32
解:
STACK SEGMENT STACK
DB 200 DUP(?)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,SS:STACK
BEGIN:
MOV AH,01H ;一号调用,从键盘输入字符存入AL
INT 21H
SUB AL,20H ;十六进制20就是十进制的32
MOV DL,AL
MOV AH,02H ;二号调用,在屏幕上显示DL中的内容
INT 21H
MOV AH,4CH
INT 21H
CODE ENDS
END BEGIN
197.在内存中有一个字节单元NUM,存有带符号数据,要求计算绝对值,放入RESULT单元中。
分析:NEG 求反
解:
DATA SEGMENT
X DB -25
RESULT DB ?
DATA ENDS
CODE SEGMENT
ASSUME DS:DATA,CS:CODE
START:
MOV AX,DATA
MOV DS,AX
MOV AL,X
TEST AL,80H ;测试AL的正负
JZ NEXT ;为正,转NEXT
NEG AL ;否则,求反
NEXT:
MOV RESULT,AL
MOV AH,4CH
INT 21H
CODE ENDS
END START
198.多分支结构实现方法:条件选择法,跳跃表法,地址表法
199.求:Y=1,X>0
Y=0,X=0
Y=-1,X<0
输入数据为X,输出数据为Y,都是字节变量。
解:
DATA SEGMENT
X DB -25
Y DB ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
MOV AL,X
CMP AL,0 ;AL中内容和0比较
JGE BIG ;>=0,转BIG
MOV BL,-1 ;否则为负数,-1送BL
JMP EXIT ;结束
BIG:JE EE ;AL中内容是否为0,为零转EE
MOV AL,1 ;否则为大于零,1送BL
JMP EXIT
EE:MOV BL,0
EXIT:
MOV Y,BL
MOV AH,4CH
INT 21H
CODE ENDS
END START
200.SHL:将操作数逻辑左移指定次数
SHR:将操作数逻辑右移指定次数
201.除法指令要求被除数的长度必须是除数的两倍。
字节除法是用16位数除以8位数,字除法是用32位数除以16位数。
DIV:无符号数除法
IDIV:带符号数除法
202.格式:DIV SRC
操作:
字节操作:
(AL)(AX)/(SRC)的商
(AH) (AX)/(SRC)的余数
字操作
(AX)(DX,AX)/(SRC)的商
(DX) (DX,AX)/(SRC)的余数
在除法中,被除数也即目的操作数隐含在AX(字节运算)或DX-AX(字运算)中,除数即源操作数。
203.
(1)DIV CL ;AX的内容除以CL的内容,无符号商存于AL,余数存于AH
(2)IDIV DL
(3)DIV BYTE PTR[BP] ;AX的内容除以堆栈段中由BP寻址的字节存储单元的内容。无符号的商存于AL中,余数存储AH中。
204.CS 指令寻址
SS 堆栈寻址
DS 数据寻址
205.OF 是否溢出标识符
DF 方向标识符
IF 中断标志符
SF 符号标识符
ZF 是否为零标识符
AF 辅助进位标识符
PF 奇偶标识符
CF 进位标识符
206.AX,BX,CX,DX 16位数据寄存器,2字节
SP,BP,SI,DI 16位指针与变址寄存器 2字节
AX可以分别访问高位字节AH和低位字节AL。
AX,BX,CX,DX可以以字(16位)形式访问,也可以以字节(8位)访问,都是通用寄存器。
SP,BP,SI,DI只能以字(16位)访问。
207.使用ASSUME伪操作来明确段和段寄存器的关系。
其中段寄存器名必须是CS,DS,ES,SS,而段名必须是由SEGMENT定义的段中的段名。
208.ASSUME伪操作只是指定某个段分配给哪一个段寄存器,并不能把段地址装入段寄存器。
数据段和堆栈段需要这样做,CS不需要这样做,这是在程序初始化时完成的。
209.从CISC体系结构转变为RISC体系结构后,在同样的工艺水平(即同样的主频,同样的工艺尺寸,同样的芯片面积下),使CPU的速度和性能有了很大的提高。
210.microprocessor 微处理器
Microcomputer 微型计算机
211.操作码:指明要完成操作的性质
地址码:指明规定操作的数据存放地址或操作数
212.assemble language 汇编语言
汇编语言程序翻译成机器语言程序的过程称为汇编。
213.汇编语言依赖于某一具体计算机,是面向机器的语言。
214.八进制表示 O Q
十进制表示 D
二进制表示 B
十六进制表示 H
215.反码的特点:
(1)“0”有两种表示法
(2)8位二进制反码所能表示的范围-128~127
(3)当一个带符号数由反码表示时,最高位为符号位。当符号位为0时,后面的7位为数值部分;当符号位为1时,一定要按位取反,才能得到数值。
216.补码特点:
(1)[+0]补=[-0]补=00000000
(2)8位二进制补码表示的数值为-128~127
(3)用补码表示的二进制数,最高位为符号位,当符号位为0时,其余7位是此数的二进制值;当符号位为1时,数值获取方法是按位取反加1.
217.数字0~9的ASCII码值用十进制数表示是48~57
用十六进制表示是30H~39H
218.双字是任何字节地址开始的两个相邻字,其中每个字节都有自己的地址,最小字节地址就是双字的地址。
219.非压缩BCD码是用一个字节只表示一位0~9的十进制数,这些数作为无符号字节值存放,数的大小由低字节确定。
220.压缩BCD码是用一个字节来表示两个十进制数(0~9),每半个字节保存一个0~9的数字。
221.结果的显示或打印,可使用DOS功能调用02号功能来实现。是把要显示字符的ASCII码送入DL寄存器,功能调用02号送入AH寄存器,通过指令INT 21H即可实现结果的显示与打印。
222.
MOV DL,’?’
MOV AH,02H
INT 21H
‘?’原先放在何处并不重要,但一定是要送入DL寄存器才能显示。
223.显示字符串
将在缓冲区中的字符串送屏幕显示或打印。使用9号功能调用。要显示的字符串应该存入由数据段定义的缓冲区中。且以‘$’为结束标志。
解:
DATA SEGMENT
BUF DB ‘HOW ARE YOU!$’
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
MOV AX,DATA
MOV DS,AX
…
MOV DX,OFFSET BUF
MOV AX,09H
INT 21H
CODE ENDS
224.
225.IP是指向下一次要取出的指令,与CS寄存器配合才能形成真正的物理地址。
226.通用寄存器共有8个:
EAX/EBX/ECX/EDX可作为8位,16位或32位寄存器使用。
ESI/SDI/EBP/ESP可作为16位或32位寄存器使用。
227.AF:Auxitiary Carry Flag 辅助进位标志
在字节操作时,由低半字节向高半字节进位或借位;在字操作时,低位字节向高位字节有进位或借位,则AF=1,否则为0.
228.CF:Carry Flag 进位标志
当结果的最高位产生一个进位或借位,则CF=1,否则CF=0.
229.OF :Overflow Flag 带符号数的运算结果超出了8位或16位,即在字节运算时大于+127或小于-128,在字运算时大于32767或小于-32768,置1.
230.CF和OF没有必然关系。
231.奇偶标志PF:Parity Flag ,若操作结果中“1”的个数为偶数,则PF=1,否则PF=0.
可用于校验。
232.零标志 ZF:(Zero Flag)若运算结果为0,则ZF=1,否则ZF=0.
233.IF Interrupt-enable Flag 中断允许标志
若指令中置IF=1,则允许CPU去接收外部的可屏蔽中断请求。若IF=0,则屏蔽上述的中断请求。
234.CLC:Clear Carry Flag 标志CF清零。即CF0
235.CLD:Clear Direction Flag 标志DF清零,即DF0,则在串操作时,使地址增量。
236.方向标志 DF(Direction Flag)
若DF=1,则引起串操作指令为自动减量指令,也就是从高地址到低地址处理字符串。
若DF=0,则引起串操作指令为自动增量指令,也就是从低地址到高地址处理字符串。
237.1个字节8位,1个字16位,1个双字32位。
Word Double Word
238.字节是微型计算机中存取信息的基本单位(存储单元)。
一个双字占用4个存储单元(字节)。
239.对于字,双字,四字数据类型,由于他们每个数据都要占用多个单元,访问时只需给出最低单元的地址号即可,然后依次存取后继字节。
低地址中存放低位字节数据,高地址中存放高位字节数据。
240.在内存中
地址: 0 1 2 3 4 5
数据:12H 34H 45H 67H 89H 0AH
则
(1)字节=34H
(1)字=4534H
(1)双字=89674534H
241.物理地址计算:
10H*段基址+偏移量
注:10H=16D
就是二进制数向左移动4位。
段基址和偏移量一般用十六进制数表示,简便的计算方法是在段基址的最低位补以0H,再加上偏移量。
242.某内存单元的地址用十六进制数表示为1234:5678,则物理地址是:
10H*1234H+5678H=179B8H
注:
1234:5678中,1234是段基址,5678是段内偏移量,就是偏移地址。
243.若(CS)=1234H,(DS)=2000H,(IP)=0010H,(SS)=4000H,则下一条要执行指令的地址是:
10H*(CS)+(IP)=12340H+0010H=12350H
244.每个存储单元在存储器中所具有的地址称为存储单元的物理地址。段基地址是每一段的起始地址,单元与段基地址的距离称为段内偏移地址,也叫偏移量。
245.
(1)MOV AL,20H
(2)MOV BX.2568H
(3)MOV ECX 25685678H
三条指令中的立即数依次是8位,16位,32位,对应的寄存器也分别是8位的AL,16位的BX和32位的ECX
246.MOV AX,im 立即数im,低8位字节iml存储在低地址字节中,高8位字节imh存储在高地址字节单元中。
247.寄存器寻址操作数直接存放在寄存器中,由指令指定的寄存器进行寻址,即操作数包含在指令规定的8位,16位,或32位寄存器中。
INC DL
MOV DS,AX
MOV EBX,ECX
三条指令操作数分别存于8位DL,16位AX和32位ECX中。
248.直接寻址
物理地址=10H*(DS)+有效地址 或
物理地址=16D*(DS)+有效地址
249.设操作数存放在DS所指向的数据段中,(DS)=2000H,(21000H)=34H,(21001H)=12H,(BX)=5678H,执行MOV BX,[1000H]
则
物理地址=10H*(DS)+1000H=21000H
(BX)=1234H
低位字节在低地址存储单元中,
高位字节在高地址存储单元中。
250.默认情况下,认为操作数有效地址的作用域是DS所指向的数据段,但允许使用段超越前缀指定为其他段,即对于寻找操作数来说,还允许操作数在以代码段、堆栈段或附加段为基准的区域中,只要在指令中指明是段超越的。16位地址偏移量可以与CS,SS,ES相加,作为操作数的地址。如MOV AX,ES:[2000H]
251.寄存器间接寻址可以是16位或32位的
使用BX,SI,DI,BP,则为16位寻址。
使用EAX,EBX,ECX,EDX,ESI,ESP,EDI,EBP,为32位寻址。
252.以BX/SI/DI/EAX/EBX/ECX/EDX/ESI/EDI间接寻址时,则默认操作数在DS段中。以BP/EBP/ESP间接寻址,则默认操作数在SS段。
253.以SI/DI/BX间接寻址,通常操作数在现行数据段中,即数据段寄存器DS左移4位后加上SI/DI/BX中的16位偏移地址作为操作数的地址。
254.设(DS)=2000H,(SI)=1000H,21000H单元的内容为34H,21001H单元的内容为12H,执行MOV AX,[SI]后,(AX)=1234H
254.若是以寄存器BP间接寻址,则操作数在堆栈段中,SS左移4位后与BP相加作为操作数的地址。
如:
(SS)=3000H,(BP)=2000H,32000H单元的内容为34H,32001H单元的内容为12H,执行MOV AX,[BP]后,(AX)=1234H.
255.通用寄存器EAX,EBX,ECX,EDX,ESI,EDI默认段寄存器为DS。
通用寄存器ESP,EBP默认段寄存器位SS。
256.
(1)MOV EBX,[EAX] ;默认DS为段基址,传送双字给EBX
(2)MOV DX,[EBX] ;默认DS为段基址,传送字给DX
(3)MOV CH,[EAX] ;默认DS为段基址,传送字节给CH
257.如果操作数在默认段之外,指令中必须加段超越前缀。
如:
(1)MOV AX,ES:[SI] ;操作数在附加段寄存器ES中,不在默认段DS中。
(2)MOV AX,DS:[BP] ;操作数在数据段寄存器DS中,不在默认段SS中。
“ES”和“DS”分别是两指令的段超越前缀。
258.若在指令中规定是段超越的,则BP也可以与其他的段寄存器相加,形成操作数地址,如:
MOV AX,DS:[BP] ;BP不是与SS段寄存器形成操作数地址,而是与DS段寄存器形成操作数地址。
259.设(DS)=2000H,(SI)=1200H,(21200H)=56H,执行指令MOV AH,[SI]的结果是:
(AH)=56H
260.设(DS)=2000H,(DI)=2100H,(22100H)=68H,(22101H)=41H,执行指令MOV BX,[DI]后,
(BX)=4168H
261.EA :Effective Address 有效地址 或偏移地址 偏移量
262.基址寻址:由指定的基址寄存器内容,加上指令中给定的偏移量(要由一个段寄存器作为地址基准)作为操作数的地址的寻址方式称为基址寻址。
263.在基址寻址方式下,EA=[基址寄存器]+位移量,位移量是常数且紧跟在操作码之后,与操作码一起放在代码段中。
264.在16位寻址情况下,BX和BP作为基址寄存器。在缺省段超越前缀时,BX以DS作为默认段寄存器,BP以SS作为默认段寄存器。位移量为8位或16位。
265.基址寻址适用于对一维数组的数组元素进行检索操作。位移量表示数组起始地址偏移量,基址表示可以变化的数组元素下标。
266.EA的格式:
[基址寄存器]+位移量
位移量[基址寄存器]
267.
(1)MOV EAX,[BX+24] 或 MOV EAX,24[BX]
(2)MOV ECX,[EBP+50] 或 MOV ECX,50[EBP]
(3)MOV DX,[EAX+1500] 或 MOV DX,1500[EAX]
268.设(DS)=2000H,(SI)=1200H,(21206)=56H,执行MOV AH,[SI+6],结果为:
(AH)=56H
269.基址变址寻址:由指令中的基址寄存器内容和变址寄存器内容相加得到操作数的有效地址EA的寻址方式。
EA=[基址寄存器]+[变址寄存器]
如:
MOV AX,[BX+SI] 或 MOV AX,[BX][SI]
MOV EAX,[EDX][EBP] 或 MOV EAX,[EDX+EBP]
一般规定由基址寄存器来决定默认哪一个段寄存器作段基址指针。若使用BP、ESP或EBP,则默认操作数在SS中;若使用其他基址或变址寄存器,则默认操作数在DS中。
270.MOV AX,[BX][SI] ;基址寄存器是BX,默认DS为段基址寄存器。
MOV EAX,[EBP][ECX] ;基址寄存器是EBP,默认SS为段基址寄存器。
271.设(DS)=2000H,(SI)=200H,(BX)=1000H,(21200H)=21H,执行MOV AL,[SI+BX],结果:
(AL)=21H.
272.执行MOV BX,[EDI+EAX]的结果是将内存中DS:[EDI+EAX]处开始的连续两个单元内容送BX中。
273.相对基址变址寻址:由变址寄存器、基址寄存器内容和位移量一同相加而得到操作数有效地址的寻址方式。
EA=[基址寄存器]+[变址寄存器]+位移量
如:
MOV AX,[BX+DI+MASK] 或 MOV AX,MASK[BX][DI]
ADD EDX,[ESI][EBP+0FFFF000H] 或 ADD EDX,0FFFF000H[ESI][EBP]
274.汇编语言对指令的大小写是不敏感的。
275.传送100个数据,写出程序。
分析:使用循环,每次循环都要修改原地址和目标地址,这就要把源、目的地址分别放在两个寄存器中,用寄存器间接寻址来寻找操作数,修改了寄存器的内容。
解:
MOV SI,OFFSET AREA1
MOV DI,OFFSET AREA2
MOV CX,100
AGAIN:
MOV AL,[DI]
MOV [SI],AL
INC SI
INC DI
DEC CX
JNZ AGAIN
276.OFFSET AREA1 是指地址单元AREA1在段内的地址偏移量。寻找内存操作数时,必须以段地址(在某个段寄存器中)加上此单元的段内地址偏移量,才能确定某一内存单元的物理地址。
277.地址传送指令主要用于传送操作数的地址。
LEA,装入有效地址指令
Load Effective Address
LDS:装入DS指令
LES:装入ES指令
LSS:装入SS指令
278.装入有效地址指令 LEA
格式:LEA reg,mem
功能:将有效地址(偏移地址)mem而不是mem的内容装入到一指定寄存器reg中。
说明:源操作数必须是一个内存操作数,目的操作数必须是一个16位的通用寄存器。
279.LEA BX,LIST
将变量LIST的地址偏移量送到BX
280.若BX寄存器的内容是0400H,SI寄存器的内容是003CH,执行指令LEA BX,[BX+SI+0F62H]后,BX的内容是什么?
解:
将0400H+003CH+0F62H=139EH送BX,所以结果(BX)=139EH.
与MOV BX,[BX+SI+0F62H]区别是MOV将139EH表示的单元内容送BX。
281.LEA指令可以用相应的源操作数为立即数的MOV指令代替。
如:
MOV BX,OFFSET VARWORD 等价于 LEA BX,VARWORD
282.LDS reg,mem
LES reg,mem
LSS reg,mem
功能:将一个32位或48位的全地址指针(包括一个16位段选择符和一个16位或32位偏移值)装入一个段寄存器和一个通用寄存器。段寄存器由指令操作码LDS、LES、LSS分别指定为DS,ES,SS.通用寄存器由目的操作数reg指定。
283.XCHG reg,reg
XCHG mem,reg
XCHG reg,mem
reg是寄存器操作数,mem是存储器操作数。
如:
XCHG AL,CL
XCHG AX,DI
XCHG BX,SI
XCHG AX,BUFFER
XCHG BX,DATA[SI]
XCHG BL,[1000H]
284.查表转换指令XLAT
格式:XLAT
功能:完成一个字节的查表转换。在DS:EBX外,建立一个256字节的表,用寄存器EBX作为基址。寄存器AL作为表的无符号下标(即表指针)将AL指向的那个字节的内容送回AL,即
((EBX)+(AL))AL
说明:
(1)在使用该指令之前,存储器内需有一个代码转换表,表首地址送到EBX,相对于表首的位移量送到AL中,则转换后数据的有效地址为:
有效地址=表首地址+位移量
即以EBX寄存器内容作为表首,AL寄存器内容作为位移量所对应的表中数据送入寄存器AL中,并替换掉AL原先的内容。
(2)该指令无显式操作数,操作数是隐含的。指令默认段的数据段DS,而偏移量总是从寄存器EBX中得到。
(3)指令执行前AL是下标,执行后AL是查表的结果。若要在其他段中查表,可加段前缀。
285.通过查表转换指令,求0~9中任意一个数的平方
TAB DB 1,4,9,16,25,36,49,64,81
MOV AX,SEG TAB
MOV DS,AX
MOV BX,OFFSET TAB
MOV AL,5
XLAT
执行后:(AL)=25
286.实现存储器操作数与立即数相加/减,与累加器或别的寄存器相加/减,和/差放到该存储单元中。
ADD BETA[SI],100
ADD BETA[SI],AX
ADD BETA[SI],DX
SUB BUF[SI],200
SUB BUF[SI],AX
SUB BUF[SI],DX
287.指令SBB [DI],100 实现的功能是用DS:[DI]所指单元的内容减去100再减去CF,结果送到DS:[DI]指向的字节单元中。
288.求补指令 NEG
格式:NEG OPRD
功能:对OPRD取补,相当于执行“OPRD0-OPRD”
如:
若(AH)=13H,执行NEG AH指令后,(AH)=0EDH;若(BX)=03H,执行NEG BX指令后,(BX)=0FFFDH.
说明:是求补,而不是求反。
289.CMP AX,BX
根据CMP指令的功能,应做AX-BX的操作。若结果没有产生借位(CF=0),则AX>=BX;若产生借位(CF=1),则AX<BX.
290.求最大值
MOV BX,OFFSET BLOCK
MOV AX,[BX]
INC BX
INC BX
MOV CX,99
AGAIN:
CMP AX,[BX]
JG NEXT
MOV AX,[BX]
NEXT:
INC BX
INC BX
DEC CX
JNE AGAIN
MOV MAX,AX
HLT
说明:JG为判断带符号数的大小,若大,则转移到后面的标号。
291.MUL OPRD
IMUL OPRD
IMUL OPRD1,OPRD2
IMUL OPRD1,OPRD2,OPRD3
MUL:实现两个无符号数相乘,AL,AX或EAX的内容和OPRD的内容是两个无符号数,且如果OPRD长度为8位,则与AL内容相乘,相乘结果送到AX中;
如果OPRD长度为16位,则与AX内容相乘,相乘结果送到DX:AX中;
如果OPRD长度为32位,则与EAX内容相乘,相乘结果送到EDS:EAX中;
292.MUL CL ;AX(AL)*(CL)
MUL BX ;DX:AX(AX)*(BX)
MUL DWORD[ESI] ;EAX中32位数与[ESI]所指双字单元中的32位数相乘,结果在EDX:EAX中。
293.IMUL OPRD
被乘数是累加器(AL,AX或EAX),乘以指定的操作数;字节运算时乘积返回到AX,字运算时乘积返回到DX:AX,双字运算时乘积返回到EDX:EAX
294.IMUL OPRD1,OPRD2
在双字操作数格式下,用OPRD1乘以OPRD2,积存放在OPRD1指定的寄存器中。
295.IMUL OPRD1,OPRD2,OPRD3
用OPRD2乘以OPRD3,积放到OPRD1
296.格式:
DIV OPRD
IDIV OPRD
功能:
DIV无符号数除法,OPRD内容作为除数,如果OPRD长度为8位,则AX内容作为被除数,运算后商送到AL中,余数送到AH中。
297.DIV CL
(AX)/(CX) ,商在AL中,余数在AH中。
298.DIV WORD PTR[SI]
(DX:AX)中的32位数,除以(SI)所指单元中的16位数,商在AX中,余数在DX中。
299.某个操作数,自己和自己相“与”,操作数不变,可以使CF=0.
某个操作数,自己和自己相“或”,操作数不变,可以使CF=0.
某个操作数,自己和自己相“异或”,操作数置零,使CF=0.
300.检测AL中的最低位是否为1,为1则转移。
TEST AL,01H
JNZ THERE
…
THERE:
301.在实地址方式下,段寄存器的内容左移4位而得到段基地址。
302.NAME MAIN_PROGMODULE
NAME是保留字,用于定义程序模块的名称,MAIN_PROGMODULE是程序名称,可用任意标识符为程序命名。
303.显示一行字符串
NAME SIMPLE_EXAMPLE
FIRST_DATA SEGMENT
STRING_DA DB ‘This is my program$’
FIRST_DATA ENDS
FIRST_STACK SEGMENT PARA STACK ‘STACK’
DB 100 DUP(?)
FIRST_STACK ENDS
FIRST CODE SEGMENT
ASSUME DS:FIRST_DATA,SS:FIRST_STACK,CS:FIRST_CODE
START:
MOV AX,FIRST_DATA
MOV DS,AX
LEA DX,STRING_DA
MOV AH,09H
INT 21H
MOV AH,4CH
INT 21H
FIRST_CODE ENDS
END START
304.根据程序的实际情况,SS,DS,ES也可以没有,只有CS是必不可少的。每个程序至少必须有一个。
305.每个源程序在其代码段中都必须有返回到DOS的指令语句,以保证程序执行完后能自动返回DOS,可继续向计算机键入命令。
306.作为存储器操作数的标号和变量有三种共同属性:
(1)段值:段基址,可用SEG运算符求得。
(2)偏移值:段内偏移地址,可用OFFSET运算符求得。
(3)类型。。。
307.“?”表示不确定值,只表示预留规定长度的存储空间。
308.DUP:建立单个值的多次拷贝。
309.
(1)VAR1 DB ? ;变量VAR1分配一个字节,但不赋初值。
(2)VAR2 DD ? ; 变量VAR1分配四个字节,但不赋初值。
(3)STR1 DB ‘ABCDE’ ;给字符串分配5个字节,并赋初值。
(4)ARRAY DW 20 DUP(1) ;给数组ARRAY分配20个字,初值均为1
(5)BUFF DB 6 DUP(?) ;相当于 DB ?,?,?,?,?,?
(6)COUNT DB 25,35,45 ;给变量COUNT分配3个字节,并赋初值
310.操作数是字符串时,内存中存放的是每个字符的ASCII码
STR1 DB ‘ABCDE’
STR1 DB ‘A’,’B’,’C’,’D’,’E’
STR1 DB 41H,42H,43H,44H,45H
三者等价。
311.复制操作符DUP,表示操作数重复若干次。
(1)BUFFER1 DB 2 DUP(2,3,4)
等价于
BUFFER1 DB 2,3,4,2,3,4
BUFFER2 DW 1,2,3 DUP(6)
等价于
BUFFER2 DW 1,2,6,6,6
BUFFER3 DB 2 DUP(5,6,3 DUP(7))
等价于
BUFFER3 DB 5,6,7,7,7,5,6,7,7,7
312.指令单元 NEAR 和FAR
若一个单元的类型是NEAR,汇编程序产生一个段内JMP或CALL指令
若一个单元的类型是FAR,汇编程序产生一个段间JMP或CALL指令
313.DATA EQU 7
PURGE DATA
DATA EQU 28
314.MOV AX,SEG DATA
功能:把DATA的段地址存入AX寄存器中。
315.MOV SI,OFFSET DATA
功能:把DATA的偏移地址存入SI寄存器中。
等价于
LEA SI,DATA
316.PTR操作符
格式:类型 PTR 表达式
类型:BYTE,WORD,DWORD,NEAR,FAR
功能:给表达式(变量或标号)指定类型,不管有无类型或是什么类型,均以PTR前的类型为准。(有没有像C语言中的强制类型转换呢,嘿嘿)
对于变量,可以指定的类型是BYTE,WORD,DWORD
对于标号,可以指定的类型是NEAR(段内引用型),FAR(段间引用型)。
317.MASM:Microsoft Macro Assembler 汇编器,汇编开发环境
318.ASSUME:段寄存器说明语句
格式:ASSUME 段寄存器:段名/组名
功能:说明源程序中定义的段或组由哪个段寄存器去寻址。指出了段与段寄存器的关系。
319.三个数相加把结果放在SUM单元中。
解:
DATA SEGMENT
BUF DB 35H,78H,0A5H
SUM DB ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
MOV AL,0
MOV SI,OFFSET BUF
ADD AL,[SI]
INC SI
ADD AL,[SI]
INC SI
ADD AL,[SI]
MOV SUM,AL
MOV AH,4CH
INT 21H
CODE ENDS
END START
320.子程序定义
子程序名 PROC FAR /NEAR
…
RET
子程序名 ENDP
321.调用
CALL [NEAR/FAR PTR] 子程序名
322.宏定义
宏名 MACRO 形参
…
宏名 ENDM
调用:
宏名 实参
323.宏调用展开在编译处,在EXE文件中有N份。
子程序展开在执行处,在EXE文件中有1份。
324.同一个变量可以在两行定义
如:
X DB 12H,34H
DB 78H,96H
325.
错误:
INC [SI]
正确:
INC WORD PTR [SI]
INC BYTE PTR [SI]
326.在汇编中字符就和字符串一样,是同一个概念,都用单引号。字符就是长度为1的字符串。
327.AND AL,78H AND 0FH
第一个AND是指令,在执行时起作用。
第二个AND是运算符,在编译时起作用。
328.ADD AX,5+3
第一个ADD是指令,在执行时处理。
第二个“+”是一个表达式,编译时处理。
329.MOV AX,WORD PTR X
X是其他类型的,AX是WORD类型的,用WORD PTR进行类型转换。
330.DB可以定义:
(1)单字节数据
(2)字符串(按顺序放)
以下是内存单元:
MESSAGE DB ‘HELLO’
331.DW可以定义:
(1)双字节数据
(2)只能为长度为2的字符串
(3)地址表达式 EA
以下是内存单元:
332.DD可以定义:
(1)双字数据
(2)只能放长度为4的字符串
(3)地址表达式
以下是内存单元:
333.子程序结束 ENDP
源程序结束 END
334.$表示当前地址
335.汇编上机过程:
(1)用编辑程序建立ASM源文件;
(2)用MASM程序把ASM文件汇编成OBJ文件;
(3)用LINK程序把OBJ文件连接成EXE文件;
(4)用DOS命令直接键入文件名就可执行该程序;
336.汇编程序的主要功能:
(1)检查源程序语法是否正确;
(2)测出源程序中的语法错误,并给出错误信息;
(3)产生目标程序;
(4)展开宏指令
337.OBJ是二进制文件。
338.汇编过程生成3个文件,
EXAM.OBJ :一定需要
EXAM.LST :可有可无
EXAM.CRF :可有可无
339.警告错误:WARNING ERRORS
严重错误: SEVERE ERRORS
340..ASM (MASM汇编).OBJ(LINK 连接).EXE
341.DEBUG命令
A命令(汇编命令),逐行输入汇编程序
—A 回车
2A7D : 0100 MOV AX,0201 ;地址自动给出
2A7D : 0103 MOV BX,0200
2A7D : 0106 MOV CX,0001
2A7D : 0109 MOV DX,0000
2A7D : 010C INT 13
2A7D : 010E INT 3
2A7D : 010F ;结束输入
段地址:偏移地址 自动给出
342.G命令 执行
—G=100 回车 ;从地址100H处开始执行
343.T命令 跟踪执行
每条指令执行后,都要暂停并显示各寄存器的内容。实际上是单步执行。
—T=0100 3 ;从地址0100H开始执行,执行3条命令
344.U命令 反汇编
—U 100 回车 ;从地址100H处开始反汇编
可以看到源代码的段地址和偏移地址。
345.D命令 显示内存
将调入内存的程序以十六进制形式以及对应的ASCII形式显示出来。
—D 100,200 回车
显示内存地址从100至200这一段的内容。
346.地址计数器 $
JNZ $+6 ;JNZ指令的首地址加上6
当$用在指令中,表示本条指令的第一个字节的地址。$+6必须是另一条指令的首地址。
$用在伪操作的参数字段时,表示的是地址计数器的当前值。
347.ORG伪操作:用来设置当前地址计数器的值。
格式:
ORG 常数表达式
如常数表达式的值为N,则ORG伪操作可以使下一个字节的地址成为常数表达式的值N。
VECTORS SEGMENT
ORG 10
VECT1 DW 47A5H
ORG 20
VECT DW 0C596H
VECTORS ENDS
348.ORG $+8 ;表示跳过8个字节的存储区,亦即建立起8字节的未初始化的数据缓冲区。
349.TYPE运算符:返回变量或标号的类型值(属性值)
350.LENGTH运算符:返回变量数据区分配的数据项总数
351.SIZE运算符:返回变量数据区分配的字节个数
352. 8086CPU在基址变址寻址方式中,基址寄存器可以是(B)
A.AX或CX B.BX或BP C.SI或BX D.DX或DI
353下列传送指令中有语法错误的是(A)
A.MOV CS,AX B.MOV DS,AX C.MOV SS,AX D.MOV ES,AX
解:不允许给CS/IP/PSW三个寄存器传送数据,即这三个寄存器的值用户无法改变。
354.逻辑移位指令SHR用于:D
A.带符号数乘2 B.带符号数除2
C.无符号数乘2 D.无符号数除2
355.逻辑移位指令
(1)SHL
(2)SHR
都用于无符号数
356.算数移位指令
(1)SAL
(2)SAR
用于有符号数
357.
STR1 DW ‘AB’
STR2 DB 14 DUP(?)
CNT EQU $-STR1
MOV CX,CNT
MOV AX,STR1
则寄存器CL的值是(A)
A.10H B.12H C.0EH D.0FH
J寄存器AX的值是(C)
A.00ABH B.00BAH C.4142H D.4241H
358.简述汇编语言的上机过程:
(1)用编辑软件编辑扩展名为.ASM的源程序;
(2)用汇编程序MASM汇编源程序产生目标文件.OBJ;
(3)用连接程序LINK连接目标程序产生可执行文件 .EXE;
(4)用DOS直接键入文件名运行可执行程序,或进入DEBUG调试;
259.执行段内返回RET指令时,执行的操作是:
IP((SP)+1,(SP))
SP(SP)+2
260.执行段间返回RET指令时,执行的操作是:
IP((SP)+1,(SP))
SP(SP)+2
CS((SP)+1,(SP))
SP(SP)+2
261.当中断发生时,由中断机构自动完成哪些动作?(中断过程)
(1)取中断类型号,标志寄存器内容入栈;
(2)当前代码段寄存器入栈,当前指令计数器入栈;
(3)禁止硬件中断和单步中断,从中断向量表取4N的字内容送IP及4N+2的字内容送CS,转中断处理程序;
262.
DATA SEGMENT
ORG 0020H
BUFF DB 6,5,’78’
ARRAY DW 5,67,8
BASUB EQU ARRAY-BUFF
DATA ENDS
该数据段已占有的存储字节数是:10字节
BASUB的值:4
263.
A1 DB 10 DUP(?)
A2 DB 0,1,2,3,4,5,6,7,8,9
…
MOV CX,LENGTH A1
MOV SI,SIZE A1-TYPE A1
LOP:MOV AL,A2[SI]
MOV A1[SI],AL
SUB SI,TYPE A1
DEC CX
JNZ LOP
执行后,A1单元开始的10个字节的内容:0,1,2,3,4,5,6,7,8,9
功能:将A2中的10个数据传送到A1中的10个字节单元。
264.当执行指令ADD AX,BX 后,若AX的内容为2BA0H,设置的奇偶标志位PF=1,则正确的是(D) ???不懂
A.表示结果中含1的个数为偶数
B.表示结果中含1的个数为奇数
C.表示该数为偶数
D.表示结果中低8位含1的个数为偶数
265.串重复前缀指令
REP : (CX)=0,则退出本条指令的执行,否则继续执行。
REPZ/REPE: 当(CX)=0即数据串比较完成或ZF=0即某次比较结果不相等时退出。
266.在串操作指令前使用重复前缀指令REPE,终止串的重复操作条件是(C)
A.CX=0且ZF=0
B.CX=0且ZF=1
C.CX=0或ZF=0
D.CX=0或ZF=1
267.下面指令中,合理而有意义的指令是(D)
A.REP LODSB
B.REP SCASB
C.REP CMPSB
D.REP MOVSB
MOVS是串传送指令,MOVSB传送一个字节
268.下面的数据传送指令中,错误的操作是(D)
A.MOV SS:[BX+DI],1000H
B.MOV DX,1000H
C.MOV WORD PTR[BX],1000H
D.MOV DS,2000H
立即数不能直接送段寄存器,即段寄存器只能通过寄存器或存储单元传送数据。
269.执行下列指令后,正确的结果是(B)
MOV AL,100
MOV BL,-2
A.AL=100H,BL=02H
B.AL=64H,BL=0FEH
C.AL=64H,BL=82H
D.AL=100H,BL=0FEH
270.
根据某一个标志位的值来决定是否转移。测试的标志位有S/Z/C/P/O五个。适用于测试某一次运算的结果并根据不同的结果做不同的处理。
(1)JZ ;条件ZF=1时转移。结果为零则转移。
(2)JNZ ;条件ZF=0时转移。结果不为零则转移。
(3)JS ;条件SF=1时转移。结果为负则转移。
(4)JNS ;条件SF=0时转移。结果为正则转移。
(5)JO ;条件OF=1时转移。结果为溢出则转移。
(6)JNO ;条件OF=0时转移。结果无溢出则转移。
(7)JP ;条件PF=1时转移。奇偶位为1则转移。
(8)JNP ;条件PF=0时转移。奇偶位为0则转移。
(9)JC ;条件CF=1时转移。有进位则转移。
(10)JNC ;条件CF=0时转移。无进位则转移。
JZ 同JE
JNZ 同JNE
JMP是无条件转移。
271.测试BL寄存器内容是否与4FH相等,若相等则转NEXT处执行,代码为(B)
A.TEST BL,4FH
JZ NEXT
B.XOR BL,4FH
JZ NEXT
C.AND BL,4FH
JZ NEXT
D.OR BL,4FH
JZ NEXT
272.
D1 DB 20H DUP(?)
D2 DW D1
用一条指令实现取D1的偏移地址放到SI 3种方法
MOV SI,OFFSET D1
LEA SI,D1
MOV SI,D2
273.PSW寄存器共有6位条件状态位,3位控制状态位。
274.ADD/ADC/INC除INC不会影响CF外,其他都会影响CF/ZF/SF/OF
275.SHL/SHR/SAL/SAR 对标志位的影响是一样的。
276.注意NEG是求补,而不是求反。
277.假定(DX)=10111001B,(CL)=3,(CF)=1,试确定下列各条指令单独执行后DX中的值。
(1)SHR DX,1
(2)RCR DL,1
(3)RCL DX,CL
解
DX:0000 0000 1011 1001
移动后:
DX:0000 0000 0101 1100
所以:
(DX)=005CH
RCR:带进位循环右移指令
操作:操作数循环右移指定次数
RCL:带进位循环左移指令
操作:操作数循环左移指定次数
DX:0000 0000 1011 1001
移动后:
DX:0000 0000 1101 1100
所以:
(DX)=00DCH
执行后:
DX:0000 0101 1100 1000
所以
(DX)=05C8H
278.
MOV AL,25H
SHL AL,1
MOV BL,15H
MUL BL
执行后,AX的内容为?
解:
25H*2*15H=1554D
全都化成十进制计算。
279.程序:
DATA SEGMENT
ORG 0020H
DA1 DW 12H,23H
DA2 DB 11H,21H
DA3 EQU 1234H
DA4 EQU $-DA2
DA5 DB 31H,32H
DATA ENDS
该程序段已占有的存储字节数是多少?
DA4的值? DA5的值?
解:
(1)8
(2)2 0026H
注意:EQU定义的符号名不占存储空间。
280.
ORG 1221H
NUM DW 12H
…
MOV CH,TYPE NUM
MOV AX,NUM
MOV BX,OFFSET NUM
MOV CL,BYTE PTR NUM+1
HLT
所以:
(AX)=0012H,(BX)=1221H,(CX)=0200H
ORG是设置该程序段的偏移地址。
281.程序
ADRR DB XXH,XXH,…,XXH
NUM EQU $-ADRR
RETT DB ?
…
MOV CX,NUM
MOV BX,-1
DON:INC BX
CMP ADRR[BX],0
LOOPZ DON
JNZ NEXT
MOV BL,0FFH
NEXT:MOV RETT,BL
HLT
功能?
RETT的内容是什么?
解:
在以ADRR为起始地址的数组中,查找第一个非零数据。
若找到则将第一个非零数据在数组中的偏移量送入RETT单元中。若无非零数据,则将0FFH送入RETT单元中。
282.循环控制指令测试条件
283.循环控制指令LOOPNZ/LOOPNE控制循环继续执行的条件是(B)
A.CX≠0且ZF=1
B.CX≠0且ZF=0
C.CX≠0或ZF=1
D.CX≠0或ZF=0
284.压缩BCD码指每个字节存储两个BCD码
非压缩BCD码指每个字节存储一个BCD码,其中低4位存储数字的BCD码,高4位为0.
285.使计算机执行某种操作的命令是(B)
A.伪指令
B.指令
C.标号
D.助记符
286.将数据5618H存放在存储单元中的伪指令是(B)
A.DATA1 DW 1856H
B.DATA1 DB 18H,56H
C.DATA1 EQU 5618H
D.DATA1 DB 18H,00H,56H,00H
287.设DS=2200H,BX=1000H,SI=0100H,偏移量D=0A2B1H,计算出下列各种寻址方式的有效地址:
(1)使用D的直接寻址:0A2B1H
(2)使用BX的寄存器间接寻址:1000H
(3)使用BX和D的寄存器相对寻址:0B2B1H
(4)使用BX、SI和D的相对基址变址寻址:0B3B1H
(5)使用BX、SI的基址变址寻址:1100H
288.如TABLE为数据段中0100单元的符号名,其中存放的内容为0FF00H,以下两条指令有什么区别?AX寄存器的内容分别是什么?
(1)MOV AX,TABLE
(2)MOV AX,OFFSET TABLE
是传送TABLE中的内容,(AX)=0FF00H
是传送TABLE的地址,(AX)=0100H
289.对于下面的数据定义,三条MOV指令分别汇编成什么?
TAB1 DW 10 DUP(?)
TAB2 DB 10 DUP(?)
TAB3 DB ‘1234’
MOV AX,LENGTH TAB1
汇编成:
MOV AX,10
MOV BL,LENGTH TAB2
汇编成:
MOV BL,10
MOV CL,LENGTH TAB3
汇编成:
MOV CL,1
290.MOV CX,DATA[SI] ;寄存器相对寻址
注意:没有存储器间接寻址!!!也没有存储器相对寻址!!!
立即寻址
寄存器寻址(寄存器直接寻址)
寄存器间接寻址
直接寻址(存储器直接寻址)
寄存器相对寻址
基址变址寻址
相对基址变址寻址
291.无符号数比较时,用“高于”或“低于”来做判断依据。
有符号数比较时,用“大于”或“小于”来做判断依据。
低于 Below
高于 Above
大于 Greater
小于 Less
转移指令中,大部分指令可以用两种不同的助记符来表示。比如,一个数低于另一个数和一个数不高于也不等于另一个数是等同的。
即JB和JNAE是等同的。
292.比较两个无符号数的大小
两个无符号数比较大小时,机器根据CF标志位来判断大小。若两无符号数相减,若不够减,则最高位有借位,CF=1,否则CF=0.
所以
当CF=1时,说明被减数低于减数;
当CF=0且ZF=0时,说明被减数高于减数;
当CF=0且ZF=1时,说明被减数等于减数
293.
无符号数比较条件转移指令表
294.变量TABLE中存放了一个偏移地址,当无符号数X小于、等于或大于此偏移地址时,应去执行三个不同的程序段。
MOV BX,TABLE
MOV AX,X
CMP AX,BX
JA SS3
JZ SS2
SS1:… ;低于程序段
SS2:… ;等于程序段
SS3:… ;高于程序段
295.比较两个有符号数
两个有符号数比较大小时,机器根据SF标志位来判断大小。
无溢出时,OF=0.若被减数小于减数,差值为负,则SF=1;否则SF=0.
溢出时,OF=1,此时SF标志位显示的正负性与应该得的正确结果值的正负性相反。SF=0表示被减数小于减数;SF=1表示被减数大于减数。
当OF=0且SF=1或OF=1且SF=0时,即SF∨OF=1,表示被减数一定小于减数。
当OF=0且SF=0且ZF=0或OF=1且SF=1时,(此时ZF=0),前数一定大于后数。
有符号数比较条件转移指令
296.试分析下面程序段的功能是什么?
CMP AL,’A’
JC OTHER
CMP AL,’Z’
JNZ OTHER
JMP LETTER
…
OTHER:…
LETTER:…
判断AL的内容,若为‘A’~‘Z’的大写字母时,程序段 LETTER处理,否则转OTHER处理。
297.计算机中为便于存储及计算机的物理实现,采用(A)。
A.二进制数 B.十进制数 C.八进制数 D.十六进制数
298.在86系列的CPU中,访问IO设备采用(B)方式。
A.统一地址 B.独立地址 C.混合地址 D.直接地址
299.机器指令是在程序运行期间由计算机来执行的。
伪指令是汇编程序对源程序进行汇编时处理的,只提供有关信息,不产生机器代码。
300.伪指令在程序(B)阶段被处理。
A.编写 B.汇编 C.连接 D.运行
301.在程序的开始可以用NAME或TITLE作为模块的名字。但NAME和TITLE伪指令不是必要的。
302.一个完整、独立的汇编语言源程序可以没有(C)伪指令。
A.段定义 B.存储模式定义 C.程序开始 D.程序结束
303.JMP NEAR PTR [BX]使用(A)段寄存器。
A.CS,DS B.DS,ES C.ES,SS D.DS,SS
304.响铃符的ASCII编码为(D)
A.0DH B.OAH C.20H D.07H
305. 0~9的ASCII值为30H~39H
而字母A的ASCII值为41H
306.从微处理器的角度来看,计算机结构可分为CPU、内存、和IO子系统三个主要部分。
307.汇编语言源程序中的每个语句由4部分组成,分别是:名字、操作码助记符、操作数、和注释。
308.指令MOV DL,1000H[SI]中,源操作数的地址是SI+1000H.
309.汇编语言程序的最后一条指令是汇编结束伪指令。
310.可以修改其值的定义符号常量的伪指令是等号(=)伪指令。
311.MOV AX,@DATA 中AX的值是由操作系统在程序运行之前传过来的。
312. .STACK伪指令默认分配1024字节的栈空间。
313.在8086中,一个逻辑段最长为64K字节。
314.8086CPU加电后执行的第一条指令的物理地址为FFFF:0000 或写成 FFFF0。
315.DB ‘AB’定义了2个字节,在内存中的16进制代码按顺序为41H,42H。
316.将寄存器AX置零:
MOV AX,0
或者
XOR AX,AX
317.将寄存器AL的内容乘以BL的内容,结果送到BX寄存器中。
MUL BL
MOV BX,AX
318.若AX为零则转向短标号LABLE
CMP AX,0
JZ LABEL
或者
OR AX,AX
JZ LABEL
319.将AX的一个字输出到端口3D9H
MOV DX,3D9H
OUT DX,AX
320.操作系统1号功能调用(输入一个字符)
MOV AH,01H
INT 21H
321.已知在内存中有一个字节单元NUM,存有带符号数据,要求计算它的绝对值后,放入RESULT单元中。
解:
DATA SEGMENT
X DB,?
DATA ENDS
CODE SEGMENT
ASSUME DS:DATA,CS:CODE
START:
MOV AX,DATA
MOV DS,AX
MOV AL,X
CMP AL,0
JGE NEXT
NEG AL
NEXT:
MOV RESULT,AL
MOV AH,4CH
INT 21H
CODE ENDS
END START
322.编写计算下面函数值的程序:
Y=1,X>0
=0,X=0
=-1,X<0
设输入数据为X,输出数据为Y,且都是字节变量。
解:
DATA SEGMENT
X DB -25
Y DB ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
MOV AL,X
CMP AL,0
JGE BIG
MOV BL,-1
JMP EXIT
BIG:JE EE
MOV BL,1
JMP EXIT
EE:MOV BL,0
EXIT:MOV Y,BL
MOV AH,4CH
INT 21H
CODE ENDS
END START
323.程序:把BX寄存器内的二进制数用十六进制数的形式在屏幕上显示。
解:
CODE SEGMENT
MAIN PROC FAR
ASSUME CS:CODE
START:PUSH DS
SUB AX,AX
PUSH AX
MOV CH,H ;CH存放循环计数值
LP:MOV CL,4
ROL BX,CL
MOV AL,BL
AND AL,0FH
ADD AL,30H
CMP AL,3AH
JL PRINTA
ADD AL,07H
PRINTA:MOV DL,AL
MOV AH,2
INT 21H
DEC CH
JNZ LP
RET
MAIN ENDP
CODE ENDS
END START
324.程序:在ADDR单元中存放着数Y的地址,编一程序把Y中1的个数存入COUNT单元中。
解:要测出Y中1的个数,就应逐位测试。可以根据最高有效位是否为1来计数,然后用移位的方法把各位数逐次移到最高位去。
TITLE 数1程序
DATA SEGMENT
ADDR DW NUMBER
NUMBER DW Y
COUNT DW ?
DATA ENDS
CODE SEGMENT
MAIN PROC FAR
ASSUME CS:CODE,DS:DATA
START:PUSH DS
SUB AX,AX
PUSH AX
MOV AX,DATA
MOV DS,AX
MOV CX,0
MOV BX,ADDR
MOV AX,[BX]
REPEAT:CMP AX,0
JZ EXIT
JNS SHIFT
INC CX
SHIFT:SHL AX,1
JMP REPEAT:REPEAT
EXIT:MOV COUNT,CX
RET
MAIN ENDP
CODE ENDS
END START
325.JS SF=1 ;结果为负则转移
JNS SF=0 ;结果为正则转移
326.冒泡排序
解:
DATA SEGMENT
A DW N DUP(?)
DATA ENDS
PROGRAM SEGMENT
MAIN PROC FAR
ASSUME CS:PROGRAM,DS:DATA
START:PUSH DS
SUB AX,AX
PUSH AX
MOV AX,DATA
MOV DS,AX
MOV CX,N
DEC CX
LOOP1:MOV DI,CX
MOV BX,0
LOOP2:MOV AX,A[BX]
CMP AX,A[BX+2]
JGE CONTINUE
XCHG AX,A[BX+2]
MOV A[BX],AX
CONTINUE:ADD BX,2
LOOP LOOP2
MOV CX,DI
LOOP LOOP1
RET
MAIN ENDP
PROGRAM ENDS
END START
327.偏移量=偏移地址=有效地址=段内地址
328.程序:在数组中有50个单字节有符号数,分别统计0,负数,正数个数。
解:
DATA SEGMENT
X DB 50 DUP(?)
N0 DB 0
N1 DB 0
N2 DB 0
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX
MOV CX,50
MOV SI,0
PO:CMP X[SI],0
JNZ P1
INC N0
JMP P5
P1:JL P3
INC N2
JMP P5
P3:INC N1
P5:INC SI
DEC CX
JNZ P0
MOV AH,4CH
INT 21H
CODE ENDS
END START
注意:
DEC CX
JNZ P0
等价于
LOOP P0
329.过程定义伪指令
可把具有独立功能的程序段定义为过程,供其他程序调用。
<过程名> PROC NEAR/FAR
…
RET
<过程名> ENDP
调用:
CALL [NEAR/FAR PTR] 子程序名
330.标志设置指令
331.字长为n
(1)无符号数范围:
(2)有符号数范围:
补码:
原码、反码:
332.BCD都是无符号数。
333. 17D
(1)压缩BCD码:0001 0111B 17H
(2)非压缩BCD码:0000 0001 0000 0111B 0107H
334. 235D
(1)压缩BCD码:0010 0011 0101B 235H
(2)非压缩BCD码:。。。。。。。。。 020305H
335. 14个寄存器
(1)通用寄存器:
AX,BX,CX,DX
变址:SI,DI,BP,SP
段寄存器:CS,DS,SS,ES
控制寄存器:
IP
FLAG(PSW)
336.H计算机刚一启动时,物理地址是多少?
CS:FFFF 其他寄存器全为0
物理地址=(CS)*10H+(IP)=FFFF0H
337.代码段:(CS)*10H+IP
数据段:(DS)*10H+EA
堆栈段:(SS)*10H+SP
338.复习端口号指令: IN OUT
IN AL,78H ;78H是地址,是把78H端口的内容送AL
IN AL,DX ;DX是地址,用DX去找外设的地址,然后取出内容送AL
339.实模式就是一般模式,就是我们常用的模式。
340.宏定义:
宏名 MACRO 形参
…
宏名 ENDM
调用:
宏名 实参
341.8086微处理器由哪几部分组成?
EU BIU
342.80X86中,存储器为什么采用分段管理?
(1)内部16位,外部20位,所以要把20位地址分为不超过16位的段,便于访问。
(2)便于模块化编程。
343.IN输入指令
格式:IN AL,IO地址表达式
或 IN AX,IO地址表达式
操作:
AL(IO地址表达式)
或
AL(IO地址表达式+1),(IO地址表达式)
功能:完成IO端口对累加器的数据输入。
344.OUT输出指令
格式:OUT IO地址表达式,AL
或
OUT IO地址表达式,AX
操作:(IO地址表达式)AL
或
(IO地址表达式+1),(IO地址表达式)AL
功能:完成累加器对IO端口的数据输出。
345.AND AL,
TEST AL,
对标志位的影响一样,AND最后结果送AL,TEST最后结果不送AL。
类比:
SUB AX,
CMP AX,
346.空格的ASCII码是:20H
347.显示字符代码:
MOV DL,’字符’
MOV AH,02H
INT 21H
348.输入字符代码:
MOV AH,01H
INT 21H
等待用户输入
349.试编制一程序:从键盘输入一行字符,要求第一个键入的字符必须是空格符,如不是,则退出程序;如是,则开始接收键入的字符并顺序存放在首地址为BUFFER的缓冲区中(空格符不存放),直到接收到第二个空格符时退出程序。
分析:这一程序要求接收的字符从空格符开始又以空格符结束,因此程序中必须区分所接收的字符是否是第一个字符。所以,设立作为标志的存储单元FLAG。一开始将其置为0,接收第一个字符后可将其置1.
解:
DATA SEGMENT
BUFFER DB 80 DUP(?)
FLAG DB ?
DATA ENDS
CODES SEGMENT
MAIN PROC FAR
ASSUME CS:CODES,DS:DATA1
START:PUSH DS
SUB AX,AX
PUSH AX
MOV AX,DATA1
MOV DS,AX
LEA BX,BUFFER
MOV FLAG,0
NEXT:MOV AH,01H
INT 21H
TEST FLAG,01H
JNZ FOLLOW
CMP AL,20H
JNZ EXIT
MOV FLAG,1
JMP NEXT
FOLLOW:CMP AL,20H
JZ EXIT
MOV [BX],AL
INC BX
JMP NEXT
EXIT:RET
MAIN ENDP
CODES ENDS
END START
350.NEAR调用改变IP,不改变CS;
FAR调用改变IP,改变CS;
351.调用程序和子程序在同一代码段中
SEGX SEGMENT
…
MAIN PROC FAR ;主程序
…
CALL SUBR1 ;子程序调用
…
RET
MAIN ENDP
SUBR1 PROC NEAR ;子程序定义
…
RET
SUBR1 ENDP
…
SEGX ENDS
352.调用程序和子程序不在同一个代码段中
SEGX SEGMENT
…
SUBT PROC FAR ;子程序定义
…
RET
SUBT ENDP
…
CALL SUBT ;子程序调用(同一个段中调用)
SEGX ENDS
SEGY SEGMENT
…
CALL SUBT ;子程序调用(不同段中调用)
…
SEGY ENDS
353.普通子程序
CODE SEGMENT
ASSUME CS:CODE
START:
…
CALL 子程序1
…
MOV AH,4CH
INT 21H
子程序1 PROC NEAR
…
RET
子程序1 ENDP
CODE ENDS
END START
354.子程序作主程序
CODE SEGMENT
ASSUME CS:CODE
MAIN PROC FAR
START:PUSH DS
XOR AX,AX
PUSH AX
CALL 子程序1
…
RET
MAIN ENDP
子程序1 PROC NEAR
…
RET
子程序1 ENDP
355.状态标志位
0011 1101
+1101 1011
0001 1000
356.各种DEBUG命令
A命令——汇编
G命令——执行
T命令——跟踪执行
U命令——反汇编
D命令——显示内存
E命令——将内容写入内存
R命令——修改寄存器
357.寻址方式
(1)立即寻址:MOV AX,7896H
(2)寄存器寻址:MOV AX,BX
(3)存储器直接寻址:MOV AX,[3792H]
(4)寄存器间接:MOV AX,[BX]
358.不考:
(1)串操作指令
(2)BCD调整失灵·指令
(3)折半查找
359. P73 中断 要保护PSW
360.
ORG 200H
X DB 78H,96H,’ABCD’,2 DUP(?)
Y DW 78H,’AB’,X+5,$
361.
选择 2’*10
填空 1’*20
读程序 5’*6
判断 1’*5
编程 25’
必考冒泡排序
362.RET返回指令
(1)段内返回
操作:
IP((SP)+1,(SP))
SP(SP)+2
(2)段间返回
操作:
IP((SP)+1,(SP))
SP(SP)+2
CS((SP+1),(SP))
SP(SP)+2
363.
MOV AX,1234H 立即寻址
MOV AX,BX 寄存器直接寻址
MOV AX,[BX] 寄存器间接寻址
MOV AX,TABLE TABLE是一个变量名,存储器直接寻址
MOV AX,[1234H] 存储器直接寻址
MOV AX,[BX+1234H] 寄存器相对寻址
MOV AX,[BP][SI] 基址变址寻址
MOV AX,[BX+SI-1234H] 相对基址变址寻址
364.求AL中的内容
ABC EQU 2
DATA1 DB 20H
DATA2 DW 1000H
…
START:MOV AL,DATA1+ABC
所以:(AL)=10H
365.MOV CS,AX ;错误
因为:
不能直接向段寄存器传送数据;
CS的值不能由人为修改;
366.在8086/8088微处理器中,PUSH和POP指令在堆栈与寄存器或存储单元之间传送数据时,一次总是传送2个字节。
367.INC [BX] ;错误
因为:[BX]所指单元中的内容类型不确定,不知道是字节类型还是字类型,不同类型自加的大小不一样。字节类型自加1,字类型自加2
368.ENDS
ENDP
ENDM
369.做P106 4.3
P107 4.12
370.子程序作主程序,必须用FAR
371.如何进行宏展开
INOUT MACRO X,Y ;X,Y是形参
MOV AH,X
LEA DX,Y
INT 21H
ENDM
程序中遇到:
INPUT 9,INPUT ;9,INPUT是实参
则展开为
+ MOV AH,9
+ LEA DX,INPUT
+ INT 21H
372.期中考试2个编程。
373.XLAT换码指令
格式:XLAT
或
XLAT 地址标号
操作:(AL)((BX)+(AL))
说明:(1)XLAT指令是将AL的内容替换成存储单元中的一个数,往往用于代码转换,例如把字符的扫描码转换成ASCII码或者把十六进制数0~F转换成七段数码管显示代码。
使用该指令前,先在数据段建立一个表格,表格首地址存入BX寄存器中,欲取代码的表内位移量存入AL寄存器。
374.(期中)
-64D的补码是C0H。
375.(期中)
执行CALL指令,寄存器IP的内容一定改变。
376.下列指令中哪条是正确的(D)
A.MOV DS,0200H B.MOV AX,[SI][DI]
C.MOV BP,AX D.MOV BYTE PTR [BX],1000
A错:立即数不能直接送段寄存器,即段寄存器只能通过寄存器或存储单元传送。
B错:源操作数都是变址寄存器。
C错:普通寄存器不能向变址寄存器传数据。
377.使8086/88的标志寄存器F中的中断标志I置为关中断的命令是CLI。
378.指令LOOPZ标号转移到标号(循环)的条件是 CX!=0且ZF=1.
379.SUB AX,[BX]目的操作数的寻址方式是寄存器直接寻址,源操作数采用的寻址方式是寄存器间接寻址。
380. 8086CPU内部按功能分为两大部分即EU和BIU。
381. 8088微处理器段内直接寻址64KB字节空间。若寻址1MB字节空间必须通过段寄存器管理实现。
382.设(SS)=2000H,(SP)=0486H,若在堆栈中取出3个数据,则栈顶的物理地址为2048CH。如果又在堆栈中存入3个数据,则栈顶的物理地址是20486H。
注意:堆栈中数据的压入弹出必须以字节为单位,所以PUSH和POP指令只能作字操作。
383.中断系统的中断矢量表用来存放中断类型号,共预留了1KB个字节空间。
384.A、B两数相等的条件可以用FR中的ZF标志位为1来判断。
385.15D的原码是00001111,反码是00001111,补码是00001111,压缩BCD码是15H。
386.MOV AX,9876H
MOV DL,0
MOV CX,16
AGAIN:SHL AX,1
JNC NEXT
INC DL
NEXT:LOOP AGAIN
MOV SUM,DL
程序的功能是:数AX中1的个数。
SUM的值是:8
387.已知AL=3,分析下列程序段:
SHL AL,1
MOV BL,AL
SHL AL,1
SHL AL,1
ADD AL,BL
SHL AL,1
程序完成的功能是AL扩大20倍,执行后结果是AL=60.
388.画图说明下列语句所分配的存储空间及初始化的数据值。
(1)BYTE_VAR DB ‘BYTE’,12,-12H,3 DUP(0,?,2 DUP(1,2),?)
(2)WORD_VAR DW 5 DUP(0,1,2),?,-5,’BY’,’TE’,256H
389.
DATA_BYTE DB 10,4,10H
DATA_WORD DW 100,100H,-5
DATA_DW DD 3C,0FFFDH
390.
391.操作数?可以保留存储空间,但不存入数据。得到程序运行时存放中间或最终结果。
ABC DB 0,?,?,0
DEF DW ?,52,?
392.ARRAY1 DB 2 DUP(0,1,2,?)
ARRAY2 DB 100 DUP(?)
393.ARRAY3 DB 100 DUP(0,2 DUP(1,2),0,3)
394.根据伪指令代码写内存情况是难点和必考点。应该再次复习。尤其搞懂关于字符串的存放问题,DB和DW是不一样的,应再次学习。
395.BP、SP可称为指针寄存器
SI、DI可称为变址寄存器
396.一般在作双字长运算时把DX和AX组合在一起存放一个双字长数,DX用来存放高位字。
397.
第7位 第0位
398.段寄存器也是一种专用寄存器,专用于存储器寻址,用来直接或间接的存放地址。段寄存器的长度为16位。
注:SP/BP/SI/DI也是16位。
399.在存储器里以字节为单位存储信息。
400.为了正确的存放或取得信息,每一个字节单元给出一个唯一的存储器地址,称为物理地址。地址从0开始编号,顺序的每次加1,因此存储器的物理地址空间是线性增长的,在机器里,地址是用二进制表示的,是无符号整数,书写格式使用十六进制数形式。
401.地址编号的范围用十六进制数表示为0000H~FFFFH。
402.存储器特性:内容是可以反复读取的,只有当存入新的信息后,原来的内容就自动被覆盖了。
403.8080/8088只能在实模式下工作,只需了解实模式。
404.80X86存储器在实模式下允许的最大寻址空间为1MB,因为地址总线宽度为20位。
405.每个段的大小可达64KB,因为地址寄存器是16位的,这样段内地址可用16位表示。
406.在1MB的存储器里,每一个存储单元都有一个唯一的20位地址,称为该存储单元的物理地址。
407.CS存放当前正在运行的程序;
DS存放当前运行程序的数据;
SS定义了堆栈所在区域;
ES是附加数据段;
408.段寄存器和偏移地址的默认组合
409.寻址方式分为:数据寻址和指令寻址
410.如果指令中指定的寄存器是BX/SI/DI,则操作数默认在DS中,如果指定的寄存器是BP,则操作数默认在SS中。
411.立即数不能直接送段寄存器,即段寄存器只能通过寄存器或存储单元传送数据。
412.两个段寄存器之间不能直接传送数据。
413.PUSH:
(SP)(SP)-2
((SP)+1,(SP))(SRC) //理解
414.POP:
(DST)((SP)+1,(SP))
(SP)(SP)+2
415.XCHG指令
(1)源、目的操作数的寻址方式不允许是立即寻址方式;
(2)两个寻址方式中,必须有一个是寄存器寻址,两个存储单元之间不能直接互换数据;
416.NEG指令
0-操作数=-操作数。在微型计算机中,带符号的二进制数都采用补码表示。所以此处的操作数是补码,所以求 –操作数 就是求补操作。
417.将(AX)乘以10
分析:十进制数10的二进制形式为1010,即权为2和权为8的位为1,故采用2*(AX)+8*(AX),结果为10*(AX)
SHL AX,1
MOV BX,AX
SHL AX,1
SHL AX,1
ADD AX,BX
418.
419.有符号数比较大小:机器根据SF标志位来判断大小,即若被减数小于减数,差值为负,则SF=1;否则SF=0;前提是无溢出 OF=0.
420.语句格式:
[标号:] 助记符 [操作数] [;注释]
即汇编语句由4部分组成:标号,助记符,操作数,注释
421.名字的定义规则:
(1)数字不能作为名字的第一个符号;
(2)单独的问号(?)不能作为名字;
(3)一个名字的最大有效长度为31,超过31的部分计算机不再识别;
(4)特定含义的保留字,操作码,寄存器名,不能作为名字;
422.汇编字符串用单引号,如:‘ABC’
423.逻辑运算符和逻辑运算指令是有区别的。
逻辑运算符的功能在汇编阶段完成,逻辑运算指令的功能在执行时完成。
424.
AND AL,78H AND 0FH
汇编后,等价于:
AND AL,08H
第一个AND是逻辑运算指令,第二个AND是逻辑运算符
425.在汇编阶段处理:伪指令、宏指令、运算符
426.为什么说程序开始伪指令是可以省略的?
答:因为程序开始是用NAME或TITLE作为模块的名字,并不是必须的。
而结束伪指令 END则是必须的。
427.对于下面的数据定义,各条MOV指令单独执行后,有关寄存器的内容是什么?
FLDB DB ?
TABLEA DW 20 DUP(?)
TABLEB DB ‘ABCD’
MOV AX,TYPE FLDB
MOV AX,TYPE TABLEA
MOV CX,LENGTH TABLEA
MOV DX,SIZE TABLEA
MOV CX,LENGTH TABLEB
428.某系列微机对存储器分段,如果每一个段最多的字存储单元(16位二进制)是32K,那么表示段内字节单元偏移地址的二进制位数应是(B)
A.20位 B.16位 C.15位 D.12位
429.
ORG 0030H
DA1 DB 0,’0’,30H
DW DA1
数据为3000H字存储单元的偏移地址是(A)
A.0030H B.0031H C.0032H D.0033H
430.NUM1 DB (12 OR 6 AND 2) GE 0EH
NUM2 DB (12 XOR 6 AND 2) LE OEH
上述数据定义中,NUM1和NUM2字节单元的内容分别是(B)
NUM1=0,NUM2=0
NUM1=0,NUM2=0FFH
NUM1=0FFH , NUM2=0
NUM1=0FFH , NUM2=0FFH
431.MOV指令中目的操作数不能为立即数和CS。
432.R命令:显示寄存器的内容,然后修改其值。
433.8086/8088 CPU可访问2个独立的地址空间,一个为存储器地址空间,大小为1MB个字节;另一个为IO端口,大小为64KB字节。
434.执行下列指令后,AX寄存器中的内容是什么?
START DW 10H,20H,30H,40H,50H
EE1 DW 3
…
MOV BX,OFFSET START
ADD BX,EE1
MOV AX,[BX]
解:(AX)=3000H
435.指令的操作数中,允许出现表达式,例如BUF1与BUF2均为变量名,下面指令中语法正确的是(D)
A.MOV AX,BUF1*BUF2
B.MOV AX,BUF1/BUF2
C.MOV AX,BUF1+ES:BUF2
D.MOV AX,BUF2-BUF1
436.在8086/8088的立即数寻址方式中,对寄存器的使用下列说法正确的是(D)
A.使用AX,BX,CX,DX
B.使用SI,DI,BP,SP
C.使用任一个通用寄存器
D.不使用任何寄存器
437.在DEBUG中,为查看或修改内存单元的内容,使用的命令是(A)
A. D或E B. D或R C. R或E D. D或U
E命令:将内容写入内存
R命令:显示寄存器的内容,然后修改其值
438.对CS段寄存器赋段地址的方法是(B)
A.MOV AX,CODE
MOV CS,AX
B.ASSUME CS:CODE
C.END起始地址
D.MOV CS,2050H
439.设SP=4AH,执行段内返回指令RET 4后,SP的值是(A)
A.50H B.48H C.4CH D.44H
解:
(1)段内带立即数返回
格式:RET 表达式
执行的操作:
IP((SP+1),(SP))
SP(SP)+2
SP(SP)+16位表达式的值
(2)段间带立即数返回
格式:RET 表达式
执行的操作:
IP((SP)+1,(SP))
SP(SP)+2
CS((SP)+1,(SP))
SP(SP)+2
SP(SP)+16位表达式的值
440.8086CPU中,一个段最大可定义的字节数是(C)
A.61K B.32K C.64K D.1M
441.软中断指令INT 21H执行,若AH=9时则完成的功能是显示字符串。
442.8086存储器地址分段时,每个段起始地址的特征是段首地址能被16整除。
443.JMP NEAR LAB ;错误
改成:
JMP NEAR PTR LAB
444.编写指令将附加段中的一个字节变量COUNT送给AL寄存器。
MOV BX,OFFSET COUNT
MOV AL,ES:[BX]
445.CMP [SI][DI] ;错误 ,源、目的操作数不能同时为变量
446.最后移位指令吐血总结:
(1)SAL/SHL:作用一样,最低位补0;
(2)SAR:算术右移,最高位补原先的那个最高位的数值;
SHR:逻辑右移,最高位补0;
ROL:循环左移,依次移到最低位
ROR: 循环右移,依次移到最高位
RCL:带进位的循环左移,每一位先加上CF的值,然后循环左移到最低位,原来的CF移到最低位;
RCR:带进位的循环右移,每一位先加上CF的值,然后依次右移到最高位,原来的CF移到最高位;
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/chenyufeng1991/article/details/47094329