汇编语言知识点总结

汇编语言知识点总结汇编语言的一些知识点总结 huibian

大家好,欢迎来到IT知识分享网。

知识点

目录

一、基础知识

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

常用ASCII码

A 41H
a 61H
‘0’~‘9’ 30~39H
空格 20H
回车 0DH
换行 0AH

我们口头所说的回车是这里的“回车+换行”

二、80×86计算机组织

总结

这章主要介绍了寄存器和一些基本概念

1、汇编程序和汇编源程序有什么区别?

汇编程序类似于编译器,汇编源程序是用户编写的程序

2、通用寄存器有哪些?各有什么作用?

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) 状态寄存器

一个程序主要分为代码段、数据段、附加数据段和堆栈段,每个段小于64K

5、字节和字是什么关系,有哪些需要注意的点?

一个字节是8位,一个字是16位。(二进制数),字存放是高地址存放高字,低地址存放低字,也就是倒着放

6、什么是物理地址,如何求物理地址?

物理地址是每个字节单元唯一的编号,为无符号十六进制整数。

由于8086/8088处理器有20根地址总线,所以前16位被划为段地址、后16位被划为偏移地址,二者相加为物理地址(PA—Physical Address)。

偏移地址也可称为有效地址(EA—Effective Address)或偏移量(Offset)等。

三、80×86的指令系统和寻址方式

总结

这章主要讲解了寻址和诸多指令

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指令 
LEA BX, LIST MOV BX, OFFSET LIST ;可使用LEA指令和OFFSET 

需要注意的是,OFFSET 只能与简单的符号地址相连,而不能和诸如LIST[SI]或[SI]等复杂操作数相连

30、LDSLESLFSLGSLSS 指针送寄存器和段寄存器指令

LDS REG, SRC 

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 

36、CWD/CWDE 字转换为双字指令

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指令

42、XADD 交换并相加指令

ADD的基础上将二者交换

XADD DST, SRC 

43、标志位的设置

1 0
符号标志(SF) 结果为负
零标志(ZF) 结果为0
进位标志(CF) 最高有效位溢出
溢出标志(OF) 溢出
辅助进位标志(AF) 第三位产生进位
奇偶标志(PF) 结果中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是寄存器,它们是字或双字类型

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及其后继机型) 

在这里插入图片描述

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有: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] 

21、地址表达式

某些情况下带方括号表示寄存器值,不带表示地址

22、TYPE操作符

TYPE expression 

23、LENGTH操作符

LENGTH Variable 

表示为变量分配的单元数,如变量中使用DUP,则回送分配给该变量的单元数,否则,其回送值是1(字符串回送是1)

24、OFFSET操作符

OFFSET Variable 或 Label 

回送偏移地址值

25、SEG操作符

SEG Variable 或 Label 

回送段地址值

26、PTR操作符

type PTR expression 

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操作符

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、输入字符串

例:

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

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

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/127201.html

(0)
上一篇 2025-09-12 20:26
下一篇 2025-09-12 20:45

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信