汇编语言(2)

本文详细介绍了汇编语言程序的格式,包括命令符、指令集、标号与名字、助记符、操作数和参数、注释和分隔符。其中,指令集涵盖了算术运算、数据传送、逻辑运算、移位、串操作、条件转移、无条件转移和控制指令。文章还讲解了各指令的功能、语法和影响的标志位,帮助读者深入理解汇编语言的编程规范。
摘要由CSDN通过智能技术生成

汇编语言程序的格式


前言

提示:这里可以添加本文要记录的大概内容:
例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。


提示:以下是本篇文章正文内容,下面案例可供参考

一、命令符

示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。

二、指令集

指令==操作码 + 操作数

指令语句格式:(标号)指令助记符(操作数(,操作数))(;注释)

伪指令语句格式:(名字)伪指令定义符(参数,…,参数)(;注释)

1.基本的结构

代码如下(示例):

DATAS SEGMENT	;数据段
    ;此处输入数据段代码  
DATAS ENDS
 
CODES SEGMENT	;代码段
    ASSUME CS:CODES,DS:DATAS		;数据段给DS,代码段给CS
START:			;开始代码
    MOV AX,DATAS	;需要先把DATA给AX寄存器,然后再从AX给DS,DATA不能直接给DS
    MOV DS,AX
    ;此处输入代码段代码
    MOV AH,4CH		;结束语句
    INT 21H
    
CODES ENDS		;代码段结束
    END START	;结束代码


2.标号与名字

执行性语句中,冒号前的标号表示处理器指令在主存中的逻辑地址,主要用于指示分支、循环等程序的目的地址,可有可无。
说明性语句中的名字可以是变量名、段名、子程序名等,反映变量、段和子程序等的逻辑地址。标号采用冒号分隔处理器指令,名字采用空格或制表符分隔伪指令,据此也分别了两种语句。

标号和名字是符合汇编程序语法的用户自定义的标识符(Identifier)。
标识符(也称为符号Symbol)一般最多由31个字母、数字及规定的特殊符号(如 _、$、?、@)组成,不能以数字开头(与高级程序语言一样)。在一个源程序中,用户定义的每个标识符必须是唯一的,且不能是汇编程序采用的保留字。
保留字(Reserved Word)是编程语言本身需要使用的各种具有特定含义的标识符,也称为关键字(Key Word)。
汇编程序中主要有处理器指令助记符、伪指令助记符、操作符、寄存器名以及预定义符号等。例如,msg、var2、buf、next、again都是合法的用户自定义标识符。而8var、ax、mov、db 则是不符合语法(非法)的标识符,原因是:8var 以数字开头,其他是保留字。ax 是寄存器名、mov是指令助记符、db是伪指令助记符。
默认情况下,汇编程序不区分包括保留字在内的标识符字母大小写。换句话说,汇编语言是大小写不敏

3.助记符

助记符(Mnemonics)是帮助记忆指令的符号,反映指令的功能。处理器指令助记符可以是任何一条处理器指令,表示一种处理器操作。同一系列处理器的指令常会增加,不同系列处理器的指令系统不尽相同。例如,前面介绍的数据传送指令,其助记符是“MOV”,调用中断服务程序的指令助记符是“INT”(Interrupt),调用子程序的指令助记符是“CALL”。

4.操作数和参数

处理器指令的操作数表示参与操作的对象,可以是一个具体的常量、也可以是保存在寄存器的数据,还可以是一个保存在存储器中的变量等。双操作数的指令中,目的操作数写在逗号前,还可用来存放指令操作的结果;对应地,逗号后的操作数就称为源操作数。
例如,指令“MOV AH,9”中数字9是常量形式的源操作数,AH是寄存器形式的目的操作数。同样,OFFSET MSG经汇编后转换为一个具体的偏移地址,也是常量。
伪指令的参数可以是常量、变量名、表达式等,可以有多个,参数之间用逗号分隔。例如在“‘Hello, Assembly !’,13,10, ' ′ ” 示 例 中 , 就 用 单 引 号 表 达 了 一 个 字 符 串 “ H e l l o , A s s e m b l y ! ” , 一 个 字 符 “ '”示例中,就用单引号表达了一个字符串“Hello, Assembly !”,一个字符“ Hello,Assembly!”,还有常量13和10(这两个常量在ASCII码表中表示回车和换行控制字符,其作用相当于C语言的“\n”)。

5.注释和分隔符

汇编语言语句中,分号后的内容是注释,它通常是对指令或程序片段功能的说明,是为了程序便于阅读而加上的,不是必须有的。必要时,一个语句行也可以由分号开始作为阶段性注释。汇编程序在翻译源程序时将跳过该部分,不对它们做任何处理。


算术运算指令

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,O
 
SUB,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,O
 
INC,DEC
功能: 把OP的值加一或减一
语法: INC OP DEC OP
格式: INC r/m DEC r/m
影响标志: P,A,Z,S,O
 
NEG
功能: 将OP的符号反相(取二进制补码)
语法: NEG OP
格式: NEG r/m
影响标志: C,P,A,Z,S,O
 
MUL,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/m
 
CBW,CWD
功能: 有符号数扩展指令
语法: CBW CWD
 
AAA,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

数据传送指令

MOV
功能: 把源操作数送给目的操作数
语法: MOV 目的操作数,源操作数
格式: MOV r1,r2
MOV r,m
MOV m,r
MOV r,data
 
XCHG
功能: 交换两个操作数的数据
语法: XCHG
格式: XCHG r1,r2 XCHG m,r XCHG r,m
 
PUSH,POP
功能: 把操作数压入或取出堆栈
语法: PUSH 操作数 POP 操作数
格式: PUSH r PUSH M PUSH data POP r POP m
 
PUSHF,POPF,PUSHA,POPA
功能: 堆栈指令群
格式: PUSHF POPF PUSHA POPA
 
LEA,LDS,LES
功能: 取地址至寄存器
语法: LEA r,m LDS r,m LES r,m
 
XLAT(XLATB)
功能: 查表指令
语法: XLAT XLAT m

逻辑运算与移位指令

逻辑运算指令
 
 
AND   与  ;  OR    或  ;  NOT   非  ;  XOR   异或
 
 
TEST  测试
功能:将两个操作数进行逻辑与运算,Test命令的两个操作数不会被改变。
语法:TEST r/m,r/m/data
标志位:C,O,P,Z,S(其中C与O两个标志会被设为0)
 
 
移位指令
 
1)非循环移位指令SAL/SAR/SHL/SHR
 
算术移位指令SAL,SAR     (A:算术)
 
逻辑移位指令SHL,SHR     (H:逻辑)
 
 
2)循环移位指令ROL/ROR/RCL/RCR
 
不带进位的循环:ROL/ROR
 
带进位的循环:RCL/RCR

串操作指令

串传送指令    MOVS
功能:指令可以把SI指向的数据段中的一个字节、字或双字(DS:SI)传递到由DI指向的附加段中的一个字节、字或双字(ES:DI)中去,不影响条件标志位,并根据DF以及数据格式对SI和DI进行修改。 
语法:
   MOVS  DST,SRC
   MOVSB  (字节)
   MOVSW   (字)
   MOVSD  (双字)(386及其后继机型可用)
  
 
串装入指令    LODS
功能:指令把DS:SI指向的存储单元中的数据送到AL、AX或EAX中,并根据条件标志位DF的值和数据类型来修改SI。 
语法:
   LODS     SRC
   LODSB  (字节)
   LODSW   (字)
   LODSD  (双字)(386及其后继机型可用) 
 
 
串存储指令    STOS
功能:指令把AL、AX和EAX中的内容存入由DS:SI指向的存储单元,并根据DF的值及数据类型修改SI。 
语法:
   STOS     DST
   STOSB  (字节)
   STOSW   (字)
   STOSD  (双字)(386及其后继机型可用)
 
 
串比较指令    CMPS
功能:指令把DS:SI指向的存储单元中的数据与ES:SI指向的存储单元中的数据相减,不保存结果但影响条件标志位,并根据DF的值对SI和DI进行修改。 
语法:
   CMPS  SRC,DST
   CMPSB  (字节)
   CMPSW   (字)
   CMPSD  (双字)(386及其后继机型可用)  
 
 
串扫描指令    SCAS
功能:指令把AL、AX或EAX中的数据与ES:DI指向的存储单元中的数据相减,不保存结果但影响条件标志位,并根据DF的值对SI和DI进行修改。 
语法:
   SCAS     DST
   SCASB  (字节)
   SCASW   (字)
   SCASD  (双字)(386及其后继机型可用)
  
 
串输入指令    INS
功能:指令把端口在DX寄存器中的I/O空间的数据送到由ES:DI指向的存储单元,并根据DF的值和数据类型修改DI。 
语法:
   INS  DST,DX
   INSB  (字节)
   INSW   (字)
   INSD  (双字)(386及其后继机型可用)
  
 
串输出指令    OUTS
功能:指令把由DS:SI指向的存储单元中的数据送到端口号在DX寄存器中的I/O端口中,并根据DF的值和数据类型改变SI。
语法:
   OUTS  DX,SRC
   OUTSB  (字节)
   OUTSW   (字)
   OUTSD  (双字)(386及其后继机型可用)

条件转移指令

指令	英文	含义	格式	条件
JZ/JE	jump if zero/equal	结果为零/相等则转移	JZ/JE OPR	ZF=1
JNZ/JNE	jump if not zero/equal	结果不为零/不相等则转移	JNZ/JNE OPR	ZF=0
JS	jump if sign	结果为负则转移	JS OPR	SF=1
JNS	jump if not sign	结果为正则转移	JNS OPR	SF=0
JO	jump if overflow	溢出则转移	JO OPR	OF=1
JNO	jump if not overflow	不溢出则转移	JNO OPR	OF=0
JP/JPE	jump if parity/parity even	奇偶位为1则转移	JP/JPE OPR	PF=1
JNP/JNPE	jump if not parity/parity even	奇偶位为0则转移	JNP/JNPE OPR	PF=0
JB/JNAE/JC	jump if below/not above、not equal/carry	低于/不高于或不等于/进位为1则转移	JB/JNAE/JC OPR	CF=1
JNB/JAE/JNC	jump if not below/ above、equal/not carry	不低于/高于或等于/进位为零则转移	JNB/JAE/JNC OPR	CF=0

无条件转移和控制指令

⑴ 无条件转移
          JMP 跳转
⑶ 循环指令
      LOOP      循环
      LOOPZ/LOOPE  为零/相等时循环
      LOOPNZ/LOOPNE 不为零/不等时循环
 
⑷ 子程序调用与返回
      CALL      调用
      RET       返回
 
⑸ 中断及中断返回
      INT       中断
      INTO      溢出则中断
      IRET       中断返回

处理器控制指令

   CLC    //对CF清零 
   STC    //对CF置位
   CMC    //对CF取反
   CLD    //对DF清零
   STD    //对DF置位
   CLI    //对IF清零
   STI    //对IF置位
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值