汇编语言知识点总结

知识点

目录

一、基础知识

进制相关请查看数字逻辑第一章

常用ASCII码

A41H
a61H
‘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
  1. 将 AL 寄存器中的值看作是一个偏移量。
  2. 将 BX寄存器中的值看作是表的起始地址。
  3. 计算 AL+BX 得到表中的偏移地址。
  4. 从计算出的地址中读取一个字节的数据。
  5. 将读取的字节数据存放到 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、LDSLESLFSLGSLSS 指针送寄存器和段寄存器指令

LDS   REG, SRC

(REG)←(SRC)
(DS)←(SRC+2);REG为16位

LDS(Load DS with pointer): 将指定内存地址的内容加载到 DS 寄存器和通用寄存器中。例如:LDS SI, [MemAddress]

这将把 [MemAddress] 处的内容加载到 SI 寄存器,并将其段地址加载到 DS 寄存器。

  1. LES(Load ES with pointer): 将指定内存地址的内容加载到 ES 寄存器和通用寄存器中。用法类似于LDS
  2. LFS(Load FS with pointer): 将指定内存地址的内容加载到 FS 寄存器和通用寄存器中。用法类似于 LDS
  3. LGS(Load GS with pointer): 将指定内存地址的内容加载到 GS 寄存器和通用寄存器中。用法类似于 LDS
  4. 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、标志位的设置

10
符号标志(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、十进制调整指令(不考)

  1. DAA(Decimal Adjust for Addition):用于在进行BCD加法后,调整累加器AL的值,确保结果的十进制表示是正确的。
  2. DAS(Decimal Adjust for Subtraction):在进行BCD减法后,调整累加器AL的值,以确保结果的十进制表示是正确的。
  3. AAA(ASCII Adjust for Addition):用于在进行ASCII码表示的十进制加法后,调整AL的值,确保结果在ASCII码中的表示是正确的。
  4. AAS(ASCII Adjust for Subtraction):在进行ASCII码表示的十进制减法后,调整AL的值,以确保结果在ASCII码中的表示是正确的。
  5. AAM(ASCII Adjust for Multiplication):用于在进行ASCII码表示的十进制乘法后,调整AX的值,确保结果在ASCII码中的表示是正确的。
  6. 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 ;以这条代码为例
ALBL
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有:BYTEWORDDWORDFWORDQWORDTBYTE;为label_name定义的type有:NEARFAR,对于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、HIGHLOW操作符

HIGH取其后的常量或地址表达式的高位字节,LOW取其后的常量或地址表达式的低位字节

30、HIGHWORDLOWWORD操作符

MASM6.0具有的操作符
HIGHWORD取其后的常量或地址表达式的高位字
LOWWORD取其后的常量或地址表达式的低位字

31、SIZE操作符

SIZE 变量

返回的是LENTHTYPE的乘积

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        ;输出字符串功能调用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值