知识点
目录
一、基础知识
进制相关请查看数字逻辑第一章
常用ASCII码
A | 41H |
---|---|
a | 61H |
‘0’~‘9’ | 30~39H |
空格 | 20H |
回车 | 0DH |
换行 | 0AH |
我们口头所说的回车是这里的“回车+换行”
二、80x86计算机组织
总结
这章主要介绍了寄存器和一些基本概念
1、汇编程序和汇编源程序有什么区别?
汇编程序类似于编译器,汇编源程序是用户编写的程序
2、通用寄存器有哪些?各有什么作用?
AX、BX、CX、DX为数据寄存器
SI、DI、BP、SP为指针或变址寄存器
AX(accumulateor) 作为累加器使用,在涉及算术运算时使用。
BX(base) 可以作为基址寄存器,在涉及基址的寻址方式中使用
CX(count) 可以作为隐含的计数器,如循环次数计数器。DX(data) 可以与AX组合在一起存放一个双字长数,DX用来存放高位字。也可用于存放端口地址
SP(stack pointer) 称为堆栈指针寄存器,用来指示段顶的偏移地址
BP(base pointer) 称为基址指针寄存器,它可以与堆栈段寄存器SS联用来确定堆栈段中某一存储单元的地址。SP用来指示段顶的偏移地址,BP可作为堆栈区中的一个基地址以便访问堆栈中的信息。
SI(source index) 源变址寄存器和
DI(destination index) 目的变址寄存器一般与数据段寄存器DS联用,用来确定数据段中某一存储单元的地址。
3、专用寄存器有哪些,各有什么作用?
IP(instruction pointer) 寄存器和 FLAGS(PSW) 状态寄存器
IP用于存放代码段偏移地址,其始终指向下一条指令的首地址,与CS寄存器联用确定下一条指令的物理地址
PSW用于存放程序标志位
4、段寄存器有哪些,各有什么作用?
CS、DS、ES、SS、FS、GS,其中FS和GS为80386及其后继机型才有的
CS:存放代码段的段基址或选择器
DS:存故数据段的段基址或选择器
ES:存放附加数据段的段基址或选择器
SS:存放堆栈段的段基址或选择器
FS:存放附加数据段的段基址或选择器
GS:存放附加教据段的段基址或选择器
一个程序主要分为代码段、数据段、附加数据段和堆栈段,每个段小于64K
5、字节和字是什么关系,有哪些需要注意的点?
一个字节是8位,一个字是16位。(二进制数),字存放是高地址存放高字,低地址存放低字,也就是倒着放
6、什么是物理地址,如何求物理地址?
物理地址是每个字节单元唯一的编号,为无符号十六进制整数。
由于8086/8088处理器有20根地址总线,所以前16位被划为段地址、后16位被划为偏移地址,二者相加为物理地址(PA—Physical Address)。
偏移地址也可称为有效地址(EA—Effective Address)或偏移量(Offset)等。
三、80x86的指令系统和寻址方式
总结
这章主要讲解了寻址和诸多指令
1、操作数
;以MOV为例
MOV BX,AX
;BX为目的操作数(DST),AX为源操作数(SRC)
;结果存目的操作数中
2、什么是寻址方式?为什么要采用寻址方式?
寻址方式是指令中用于说明操作数所在地址的方法,寻址是为了找到操作数,因为不可能在代码里面全部写上物理地址,所以要采用一些寻址方式
3、寻址方式有哪些分类?
4、什么是立即寻址?
直接把操作数写出来,这就是立即寻址方式
MOV AX, 3064H
5、什么是寄存器寻址?
操作数在寄存器里
MOV AX, BX
6、什么是直接寻址?
把EA写出来
MOV BX, [1234H];这里1234H是EA
7、什么是寄存器间接寻址?
EA在寄存器里面
MOV BX, [DI]
8、什么是寄存器相对寻址?
EA要用寄存器与一个数据进行合并得出
MOV BX, [SI+100H] 或 MOV BX, 100H[SI]
9、什么是基址变址寻址?
EA被拆开存在基址寄存器和变址寄存器中
MOV BX, [BX+SI] 或 MOV BX, [BX][SI]
10、什么是相对基址变址寻址?
EA被拆开存在基址寄存器、变址寄存器中以及一部分数据
MOV AX, [BX+SI+200H] 或 MOV AX, 200H[BX][SI]
11、什么是比例变址寻址?
EA一部分存在变址寄存器里,乘以比例因子再加上位移量才能得到EA
MOV SI, 2-1
MOV DX, BUF[SI*2];BUF为数组首地址,[SI]为数组元素下标=i-1
12、什么是基址比例变址寻址?
EA一部分存在基址寄存器,一部分与比例因子绑定存在变址寄存器
MOV BX, OFFSET BUF
MOV SI, 2-1
MOV DX, [BX][SI*2];[BX]为数组首地址,[SI]数组元素下标=i-1
13、什么是相对基址比例变址寻址?
EA一部分存在基址寄存器,一部分与比例因子绑定存在变址寄存器再加上位移量
MOV BX, (2-1)*4
MOV SI, 1-1
MOV DX, BUF[BX][SI*2];[BX]为数组首地址,[BX]数组行索引=(i-1)*4,[SI]数组列下标=j-1
14、什么是段内直接寻址?
知道转向地址的最简单的方法就是在指令当中直接给出转向地址的EA,这就是段内直接寻址
JMP NEAR PTR PROGIA;NEAR PTR近跳转:16位位移量,转移范围:-32768~+32767
JMP SHORT QUEST;SHORT短跳转:8位位移量,转移范围:-128~+127
15、什么是段内间接寻址?
间接取得EA
JMP BX
JMP WORD PTR [BP+TABLE] 或 JMP TABLE[BP];WORD PTR为字操作符,说明转移地址需取字
16、什么是段间直接寻址?
FAR PTR为远跳转,表示段间转移
JMP FAR PTR NEXTROUT
17、什么是段间间接寻址?
除立即寻址方式和寄存器寻址方式以外的任何一种
JMP DWORD PTR INTER[BX]
18、MOV
指令
(DST)←(SRC)
MOV DST, SRC
;MOV REG,REG
;MOV MEM,REG
;MOV REG,MEM
;MOV MEM,IMM
;MOV REG,IMM
19、MOVSX
带符号扩展传送指令
(386及其后继机型)
适用于从较小的有符号数扩展到较大的有符号数。也就是说源操作数的长度一定要小于目的操作数长度
20、MOVZX
带零扩展传送指令
(386及其后继机型)
属于上面情况的一种,只把扩展为设置为0
21、PUSH
进栈指令
SP-2
PUSH SRC
22、POP
出栈指令
SP+2
也就是说SP始终指向栈顶
POP DST
与PUSH连用记得先进后出,后进先出,在16位指令中必须以字为单位,不允许字节堆栈,32位可以为字或双字
286及其后继机型允许立即数进栈。
23、PUSHA/AD
所有寄存器进栈指令
PUSHA ;286及其后继机型
PUSHAD ; 386及其后继机型
顺序为AX,CX,DX,BX,SP,BP,SI,DI其中SP为执行前的SP
24、POPA/AD
所有寄存器出栈指令
与上面反过来,需要注意的是,执行过程中SP的出栈只是修改了指针使其后的BX能顺利出栈,而堆栈中原先有PUSHA指令存入的SP的原始内容被丢弃,并未真正送到SP寄存器中
25、XCHG
交换指令
交换,必须有一个是寄存器操作数
XCHG OPR1, OPR2
26、IN
输入指令
;长格式
IN AL, PORT(字节)
IN AX, PORT(字)
IN EAX, PORT(双字)
;短格式
IN AL, DX (字节)
IN AX, DX (字)
IN EAX, DX (双字)
27、OUT
输出指令
;长格式
OUT PORT, AL (字节)
OUT PORT, AX (字)
OUT PORT, EAX (双字)
;短格式
OUT DX, AL (字节)
OUT DX, AX (字)
OUT DX, EAX (双字)
PORT为端口地址——00H~0FFH;每个端口寄存器的大小为一个字节;当端口地址超过0FFH时,应预先将该地址存放在DX中,再使用“IN”或“OUT”指令;在“IN”或“OUT”指令中,只能用AL、AX或EAX累加器与端口传送数据;端口号或DX的内容均为地址,传送的是端口中的信息
28、XLAT
换码指令或查表转换指令
(AL)←((BX)+(AL))
XLAT OPR 或 XLAT
- 将 AL 寄存器中的值看作是一个偏移量。
- 将 BX寄存器中的值看作是表的起始地址。
- 计算 AL+BX 得到表中的偏移地址。
- 从计算出的地址中读取一个字节的数据。
- 将读取的字节数据存放到 AL 中。
29、LEA
有效地址送寄存器指令
把源操作数的有效地址送到指定寄存器中,即(REG)←SRC
LEA REG, SRC
目的操作数是一个16位或32位寄存器,不能是段寄存器,SRC是一个存储器操作数,不能是立即数和寄存器
LEA BX, [BX+SI+0F62H] ;[BX+SI+0F62H]→(BX)
MOV BX, [BX+SI+0F62H] ;([BX+SI+0F62H])→(BX)
;只能使用LEA指令
如指令执行前(BX)= 0400H,(SI)=003CH.
则指令执行后(BX)=0400+003C+0F62=139EH。
必须注意:在这里BX寄存器得到的是有效地址而不是该存储单元的内容。
如果指令为:MOV BX,[BX+SI+0F62H]
则BX中得到的是偏移地址为139EH单元的内容而不是其偏移地址。(二者“[]”的含义不一样)
LEA BX, LIST
MOV BX, OFFSET LIST
;可使用LEA指令和OFFSET
需要注意的是,OFFSET 只能与简单的符号地址相连,而不能和诸如LIST[SI]或[SI]等复杂操作数相连
30、LDS
、LES
、LFS
、LGS
和LSS
指针送寄存器和段寄存器指令
LDS REG, SRC
(REG)←(SRC)
(DS)←(SRC+2);REG为16位
LDS
(Load DS with pointer): 将指定内存地址的内容加载到 DS 寄存器和通用寄存器中。例如:LDS SI, [MemAddress]
这将把 [MemAddress] 处的内容加载到 SI 寄存器,并将其段地址加载到 DS 寄存器。
LES
(Load ES with pointer): 将指定内存地址的内容加载到 ES 寄存器和通用寄存器中。用法类似于LDS
。LFS
(Load FS with pointer): 将指定内存地址的内容加载到 FS 寄存器和通用寄存器中。用法类似于LDS
。LGS
(Load GS with pointer): 将指定内存地址的内容加载到 GS 寄存器和通用寄存器中。用法类似于LDS
。LSS
(Load SS with pointer): 将指定内存地址的内容加载到 SS 寄存器和通用寄存器中。用法类似于LDS
。
31、LAHF
标志送AH指令
将FLAGS的低字节传输到AH,即(AH)←(FLAGS的低字节)
LAHF
32、SAHF
AH送标志寄存器指令
上述指令的反向传输
33、PUSHF/PUSHFD
标志进栈指令
将标志寄存器中的内容复制到堆栈中。
PUSHF
PUSHFD
34、POPF/POPFD
标志出栈指令
从栈中弹出标志寄存器值,用于还原先前使用 PUSHF/PUSHFD 指令保存的标志寄存器的值
35、CBW
字节转换为字指令
将 AL 寄存器中的有符号字节扩展为 AX 寄存器中的有符号字
CBW
若(AL)的最高有效位=0,则(AH)=0;
若(AL)的最高有效位=1,则(AH)=0FFH
36、CWD/CWDE
字转换为双字指令
(AX)符号扩展到DX,形成DX:AX中的双字
若(AX)的最高有效位=0,则(DX)=0;
若(AX)的最高有效位=1,则(DX)=0FFFFH
CWD
(AX)符号扩展到EAX,形成EAX中的双字
CWDE
37、CDQ
双字转换为4字指令
(EAX)符号扩展到EDX,形成EDX:EAX中的4字
38、BSWAP
字节交换指令
使指令指定的32位寄存器的字节次序变倒序
BSWAP r32
39、ADD
加法指令
(DST)←(SRC)+(DST)
ADD DST, SRC
40、ADC
带进位加法指令
(DST)←(SRC) +(DST) +CF
41、INC
加1指令
(OPR)←(OPR)+1
INC
指令不影响CF条件标志位
42、XADD
交换并相加指令
ADD
的基础上将二者交换
XADD DST, SRC
43、标志位的设置
1 | 0 | |
---|---|---|
符号标志(SF) | 结果为负 | |
零标志(ZF) | 结果为0 | |
进位标志(CF) | 最高有效位溢出 | |
溢出标志(OF) | 溢出 | |
辅助进位标志(AF) | 第三位产生进位 | |
奇偶标志(PF) | 结果中1为偶数个 |
换句话说,CF=1代表无符号数溢出(当运算结果从最高有效位产生进位时),OF=1代表有符号数溢出
有符号数涉及到原码反码
44、SUB
减法指令
(DST)←(DST)-(SRC)
SUB DST, SRC
45、SBB
带借位减法指令
(DST)←(DST)-(SRC)-CF
46、NEC
减1指令
(OPR)←(OPR)-1
DEC
指令不影响CF条件标志位
47、NEG
求补指令
即用0减操作数,也就是取反加一,不管正数负数
该指令影响条件标志位AF、OF、CF、PF、SF、ZF;其中当(OPR)=0时,CF=0,其它情况均为1;当(OPR)=-128或-32768或-231时,OF=1,其它情况均为0;
48、CMP
比较指令
(OPR1)-(OPR2)
CMP OPR1, OPR2
与SUB
一样,但是不保存结果,后面往往跟一条转移指令,根据结果选择分支
49、CMPXCHG
比较并交换指令
将累加器里面的数字与目的操作数进行比较,相等则ZF=1,源操作数传递给目的操作数,否则ZF=0,把目的操作数传递给累加器
CMPXCHG DST, SRC
50、CMPXCHG8B
比较并交换8字节指令
与上面类似,只不过操作数是64位字。
EAX和EDX中四字与目的操作数相等则ZF=1并把ECX和EBX中的四字传输给目的操作数,否则ZF=0,并把目的操作数传给EDX和EAX中的四字
CMPXCHG8B DST
(该指令只能用于Pentium及其后继机型)
51、MUL
无符号数乘法指令
将源操作数与累加器中的数字相乘后放到扩展累加器里面
MUL SRC
52、IMUL
带符号数乘法指令
同上
二者都需要注意的是,SRC不能是立即数和段寄存器
对于MUL
指令,如果乘积的高一半为0,则CF=0、OF=0,否则CF=1、OF=1,对于IMUL指令,如果乘积的高一半是低一半的符号扩展,则CF=0、OF=0,否则CF=1、OF=1
53、80286之后的乘法指令
16位寄存器与源操作数相乘后结果存于16位寄存器,32位同理
IMUL REG, SRC
IMM与源操作数相乘后结果存于16位寄存器,32位同理
IMUL REG, SRC, IMM
目的操作数必须是16位或32位寄存器,IMM表示立即数
54、DIV
无符号数除法指令
与乘法指令反过来,被除数字长比除数大一倍,被除数放在累加器,高位存余数,低位存商
DIV SRC
55、IDIV
带符号数除法指令
同上
这两个指令需要注意的是,SRC不能是立即数和段寄存器,并对所有条件码位均无定义
56、十进制调整指令(不考)
DAA
(Decimal Adjust for Addition):用于在进行BCD加法后,调整累加器AL的值,确保结果的十进制表示是正确的。DAS
(Decimal Adjust for Subtraction):在进行BCD减法后,调整累加器AL的值,以确保结果的十进制表示是正确的。AAA
(ASCII Adjust for Addition):用于在进行ASCII码表示的十进制加法后,调整AL的值,确保结果在ASCII码中的表示是正确的。AAS
(ASCII Adjust for Subtraction):在进行ASCII码表示的十进制减法后,调整AL的值,以确保结果在ASCII码中的表示是正确的。AAM
(ASCII Adjust for Multiplication):用于在进行ASCII码表示的十进制乘法后,调整AX的值,确保结果在ASCII码中的表示是正确的。AAD
(ASCII Adjust for Division):在进行ASCII码表示的十进制除法后,调整AX的值,确保商在ASCII码中的表示是正确的。
这些指令通常用于处理BCD码和ASCII码表示的十进制数,以便进行算术运算后得到正确的结果。
57、AND
逻辑与指令
与运算,结果存在目的操作数
AND DST, SRC
使CF=0,OF=0
可以用一串数二进制数清零指定位
58、OR
逻辑或指令
或运算
该指令执行后,使CF=0,OF=0
可以用一串二进制数置一指定位
59、NOT
逻辑非指令
非运算,但是不能使用立即数,不影响标志位
60、XOR
逻辑异或指令
异或运算
该指令执行后,使CF=0,OF=0
61、TEST
测试指令
两个操作数进行与运算,但是结果不保存,仅作为后面跳转指令的参考依据
TEST OPR1, OPR2
该指令执行后,使CF=0,OF=0
62、BT
位测试指令
把DST中由SRC所指定位的值送往标志位CF
BT DST, SRC
63、BTS
位测试并置1指令
把DST中由SRC所指定位的值送往标志位CF,并将DST中的该位置1
64、BTR
位测试并置0指令
同上但置0
65、BTC
位测试并变反指令
同上但变反
这组指令中SRC可以使用寄存器或8位立即数,DST是字或双字
(本组指令属于386及其后继机型)
66、BSF
正向位扫描
指令从位0开始自右向左扫描SRC,如遇到第一个为1的位则将ZF位置0,并把该位位置装入目的REG中;如SRC为0,则将ZF=1,目的REG无定义
BSF REG, SRC
67、BSR
反向位扫描
同上但是从左向右
SRC是寄存器或存储器操作数,不能是立即数,DST是寄存器,它们是字或双字类型
(该组指令属于386及其后继机型)
68、SHL
逻辑左移指令
SHL OPR, CNT
;对于所有移位指令来说,位移次数是立即数或存CL里面
CNT为移动次数,OPR不能是立即数,逻辑左移n位等价于将一个无符号数或有符号数乘以2n,它的执行速度比乘法快,若CF=1,则表示无符号数溢出
逻辑移位是空出来的用0填充
69、SAL
算术左移指令
同上
算数移位是空出来的用符号位填充
某些情况下与逻辑移位一致
70、SHR
逻辑右移指令
71、SAR
算术右移指令
最高位保持不变
72、ROL
循环左移指令
移出的最高位复制到CF和最低位中
73、ROR
循环右移指令
移出的最高位复制到CF和最高位中
74、RCL
带进位循环左移指令
CF复制到最低位后,移出的最高位复制到CF中
75、RCR
带进位循环右移指令
CF复制到最高位后,移出的最低位复制到CF中
移位指令根据移位后的结果设置SF、ZF、PF和CF值;OF的设置情况:当CNT=1时,如移位后引起符号位改变则OF=1,否则OF=0;当CNT>1时OF位无定义;AF位无定义
76、SHLD
双精度左移指令
SHLD DST, REG, CNT
DST不能是立即数,DST和REG的类型必须一致
77、SHRD
双精度右移指令
同上
当CNT=0时,不影响标志位,否则,根据移位后的结果设置SF、ZF、PF和CF值;OF的设置情况:当CNT=1时,如移位后引起符号位改变则OF=1,否则OF=0;当CNT>1时OF位无定义
78、串指令中一些需要注意的地方
这里的串指的是字符串,源串存放在数据段,目的串存放在附加数据段,但源串允许使用段跨越前缀来修改。
SI存放源串在DS段的偏移地址,DI存放目的串在ES段内的偏移地址,CX存放串的长度,AX存放关键字
方向标志DF=0时,执行串指令对SI和DI进行加1/2/4操作,DF=1时,执行串指令对SI和DI进行减1/2/4操作
79、CLD
清除方向标志指令
CLD
使DF=0
80、STD
设置方向标志指令
使DF=1
81、REP
重复串操作直到计数寄存器的内容=0为止
执行其后的串指令并将CX-1,直到CX=0
REP String Primitive
82、MOVS
串传送指令
MOVS DST, SRC
MOVSB ; 字节串传送
MOVSW ; 字串传送
MOVSD ; 双字传送(386及其后继机型)
当方向标志DF=0时,是正向,用“+”;当方向标志DF=1时,是反向,用“-”
第一种格式应在操作数中表明是字节串、字串还是双字串操作
例如:MOVS ES:BYTE PTR [DI], [SI]
83、STOS
存入串指令
STOS DST
STOSB ; 存入字节串
STOSW ; 存入字串
STOSD ; 存入双字串(386及其后继机型)
基本同上
84、LODS
从串取指令
LODS SRC
LODSB ; 从字节串取
LODSW ; 从字串取
LODSD ; 从双字串取(386及其后继机型)
同上,不过该指令一般不与REP
连用
85、INS
串输入指令
INS DST, DX
INSB ; 从端口(DX)中输入一个字节
INSW ; 从端口(DX)中输入一个字
INSD ; 从端口(DX)中输入一个双字(386及其后继机型)
86、OUTS
串输出指令
OUTS DX, SRC
OUTSB ; 输出一个字节到端口(DX)中
OUTSW ;输出一个字到端口(DX)中
OUTSD ;输出一个双字到端口(DX)中(386及其后继机型)
87、REPE/REPZ
当相等/为零时重复串操作
REPE(或REPZ) String Primitive
88、REPNE/REPNZ
当不相等/不为零时重复串操作
与上面那个唯一不同在于ZF=1
89、CMPS
串比较指令
CMPS SRC, DST
CMPSB ; 字节串比较
CMPSW ; 字串比较
CMPSD ; 双字比较(386及其后继机型)
该指令把由源变址寄存器所指向的数据段中的一个字节、字或双字与由目的变址寄存器所指向的附加数据段中的一个字节、字或双字相减,但不保存结果,只根据结果设置条件码
90、SCAS
串扫描指令
SCAS DST
SCASB (字节)
SCASW (字)
SCASD (双字)(386及其后继机型)
该指令把由累加器中的一个字节、字或双字与由目的变址寄存器所指向的附加数据段中的一个字节、字或双字相减,但不保存结果,只根据结果设置条件码
91、JMP
无条件转移指令
不受任何条件影响,无论标志寄存器中的状态如何,都会执行跳转。
92、如何用CMP
来比较两个数的大小?
两数相等,则ZF=1
CMP AL,BL ;以这条代码为例
AL | BL | |
---|---|---|
CF=0 | 大 | |
CF=1 | 大 | |
OF⊕ SF=0 | 大 | |
OF⊕ SF=1 | 大 |
93、根据单个条件标志的设置情况转移
94、比较两个无符号数,根据比较结果转移
不满足条件顺序执行,满足条件就跳转
95、比较两个带符号数,根据比较结果转移
96、测试CX或ECX的值为0则转移指令
(CX)=0/(ECX)=0跳转
JCXZ OPR
;JECXZ OPR (386及其后继机型可用)
97、条件设置指令(?)
98、循环指令
LOOP ;循环,(CX)=0结束
LOOPZ/LOOPE ;当为零或相等时循环,(ZF)=0时或者(CX)=0,结束
LOOPNZ/LOOPNE ;当不为零或不相等时循环,(ZF)=1时或者(CX)=0,结束
(根据实验结果来看是或)
Label:
……
LOOP Label
简化循环设计,不影响条件码
99、CALL
调用指令
CALL DST;过程名
100、RET
返回指令
SAMPLE PROC
RET
SAMPLE ENDP
字符串
BUF 80,?,80 DUP(?)
BUF+1是字符个数,即80
四、汇编语言程序格式
总结
这一章主要介绍了一些伪操作
1、处理器选择伪操作。
“.”+处理器代号,放在代码最前面
2、完整的段定义伪操作
segment name SEGMENT [align_type] [combine_type] [use_type] [‘class’]
………
segment name ENDS
3、假定伪操作
ASSUME segment register name:segment name [ , segment register name:segment name]
4、段组定义伪操作
grpname GROUP segname[ , segname]
5、程序开始和结束伪操作
END [lable]
6、变量字节数
DB(字节)、DW(字)、DD(双字)、DF(三字)、DQ(四字)、DT(五字)
7、字符串定义
类型为DB时才能定义长度超过2个字符的字符串
8、操作数?
表示所定义的变量无确定初值
9、操作符DUP
n DUP(表达式)
10、变量作为操作数
低地址放偏移地址,偏移地址放完了高地址再放段地址,即变量名本身只是一个标签,实际上表示的是该变量的起始地址,而不是整个数据存储区的内容。
11、EQU
伪操作
Expression_name EQU Expression
12、等号伪操作
Expression_name = Expression
与EQU
语句类似,但是二者区别在于=
允许重复定义,EQU
不允许重复定义,同时,同一符号名不能同时用EQU
和=
伪指令来分别定义
13、LABEL
伪操作
variable_name/label_name LABEL type
为下一个存储单元定义一个指定类型的变量或标号,等价于variable_name/lable_name EQU THIS type
注:为variable_name定义的type有:BYTE
、WORD
、DWORD
、FWORD
、QWORD
、TBYTE
;为label_name定义的type有:NEAR
、FAR
,对于16位段,NEAR
为2字节,FAR
为4字节,对于32位段,NEAR
为4字节,FAR
为6字节
换句话说,这就是个定义其类型的伪操作,但是并没有赋值,只告诉了编译器这个变量的类型
14、地址计数器 $
当$
用在指令中时,表示本条指令的第一个字节的地址
当$
用在伪操作的参数字段时,表示地址计数器的当前值
15、ORG
伪操作
ORG constant expression
表达式的值是下一个存储单元的偏移地址
16、EVEN
伪操作
指定下一个变量或指令开始于偶数字节地址
17、ALIGN
伪操作
ALIGN boundary
功保证双字数组边界从4的倍数开始,其中boundary必须是2的幂,当它等于2时就等价于EVEN伪操作
18、基数控制伪操作
.RADIX expression
把默认的十进制改变为2~16范围内的任何基数,其中expression表示基数值(用十进制数表示)
19、名字项
[name] operation Operand [;Comments]
标号后有:,变量无
20、操作数项
[name] operation Operand [;Comments]
十六进制的第一位若是“A”~“F”,则在前面加“0”
双引号内的字符可能会被解释为 ASCII 值,而单引号内的字符表示字符本身。
常用字符 ASCⅡ码值
‘A’~‘Z’ 对应41H~5AH
‘a’~‘z’ 对应61H~7AH
‘0’~‘9’ 对应30H~39H
21、地址表达式
某些情况下带方括号表示寄存器值,不带表示地址
22、TYPE
操作符
TYPE expression
表示表达式的类型码
如表达式是变量,其回送值是1,2,4,6,8,10(字节)
如表达式是标号,其回送值是-1(NEAR),-2(FAR)
如表达式是常数,其回送值是0
23、LENGTH
操作符
LENGTH Variable
表示为变量分配的单元数,如变量中使用DUP,则回送分配给该变量的单元数,否则,其回送值是1(字符串回送是1)
24、OFFSET
操作符
OFFSET Variable 或 Label
回送偏移地址值
25、SEG
操作符
SEG Variable 或 Label
回送段地址值
26、PTR
操作符
type PTR expression
临时定义类型,表达式的段属性和偏移属性不变
(type)= BYTE、WORD、DWORD、FWORD、QWORD、TBYTE、FAR、NEAR
PTR与EQU连用,为同一个地址定义不同类型的变量
27、SHORT
操作符
表示JMP指令中转向地址的属性,是短跳转
28、THIS
操作符
variable_name/lable_name EQU THIS type
具有与PTR类似的功能,为下一个存储单元定义一个指定类型的变量或标号,等价于variable_name/lable_name LABLE type
29、HIGH
和 LOW
操作符
HIGH取其后的常量或地址表达式的高位字节,LOW取其后的常量或地址表达式的低位字节
30、HIGHWORD
和 LOWWORD
操作符
MASM6.0具有的操作符
HIGHWORD取其后的常量或地址表达式的高位字
LOWWORD取其后的常量或地址表达式的低位字
31、SIZE
操作符
SIZE 变量
返回的是LENTH
和TYPE
的乘积
32、关系操作符
有EQ
(相等)、NE
(不等)、LT
(小于)、GT
(大于)、LE
(小于或等于)、GE
(大于或等于)
结果为真则表示0FFFFH,结果为假则表示0
七、高级汇编语言技术
宏
宏名 MACRO [参数1,参数2…]
;代码
ENDM
九、BIOS和DOS中断
1、单字符输入
;1号功能,输入字符,输入字符的ascii码放在al中
mov ah, 1
int 21h
2、输入字符串
一定要在数据段定义输入缓冲区:
BUF DB 80;定义缓冲区长度
DB ? ;保留为填入实际输入的字符个数
DB 80 DUP(?);存放键入的字符,最后是0DH
例:
MOV AX, Seg BUF
MOV DS, AX
MOV DX, OFFSET BUF
MOV AH, 0AH
INT 21H
buffer db 50, ?, 50 dup('$')
lea dx, buffer ;送偏移地址
mov ah,0ah ;将0ah放入ah
int 21h ;输入字符串功能调用
db表示定义字节大小,第一个50表示想要定义一个50字节大小的变量(申请空间),?表示一个未定义的值,它会记录输入字符串的实际长度,
后面表示连续定义50个字节,用来存放输入的字符串的。至于为什么要定义为’$‘,这是因为’$'是字符串约定的结尾符号,输出的时候检测到这个符号就代表一个字符串结束。
上面完成了定义一个变量(申请空间),用来存放输入的字符,下面还需要把这个变量的偏移地址给dx寄存器,才可以调用0ah号功能,段地址默认为ds就不需要改了
3、单字符输出
;2号功能,输出字符,要输出的字符放在dl中
mov dl 31h ;31h,即1的ASCII码
mov ah 2
int 21h
4、输出字符串
设String是该串的首地址
MOV AX, Seg String
MOV DS, AX
MOV DX, OFFSET String
MOV AH, 9
INT 21H
注:输出显示的字符串一定是以$
结束
/*同样要有一个变量,将变量的地址放入ds:dx,然后调用09h号功能8*/
outputstr db 'hello world',0dh,0ah,'$'
//0dh,0ah分别是回车换行的ascii码,加到字符串后面表示换到下一行行首,'$'为结束标志
lea dx outputstr ;送偏移地址
mov ah, 09h ;将09h放入ah
int 21h ;输出字符串功能调用