汇编指令与运算符

合集下载

c语言和汇编运算对应关系

c语言和汇编运算对应关系

c语言和汇编运算对应关系C语言和汇编运算对应关系引言:计算机科学的发展是一项深刻而复杂的领域,其中有两个重要的编程语言,C语言和汇编语言。

C语言是一种高级编程语言,而汇编语言是一种底层编程语言。

本文将探讨C语言和汇编语言之间的运算对应关系。

我们将从基本的概念和语法开始,一步一步深入,以帮助读者更好地理解这两种语言之间的联系。

第一部分:C语言的运算在C语言中,运算符是用于执行各种算术和逻辑操作的符号。

它们允许我们对变量和常量进行操作,并生成一个结果。

1. 算术运算符:包括加法(+),减法(-),乘法(*),除法(/)和求余(%)。

这些运算符用于执行基本的数学运算。

2. 关系运算符:包括等于(==),大于(>),小于(<),大于等于(>=),小于等于(<=)和不等于(!=)。

它们用于比较两个值之间的关系并生成一个布尔结果(真或假)。

3. 逻辑运算符:包括逻辑与(&&),逻辑或( )和逻辑非(!)。

它们用于执行一系列逻辑操作,并生成一个布尔结果。

第二部分:汇编的运算在汇编语言中,运算是通过使用特定的指令来实现的。

每个指令都会完成一些特定的操作,并生成一个结果。

1. 寄存器:寄存器是CPU内部的存储单元,可以用于存储和处理数据。

在汇编语言中,我们可以使用不同的寄存器来执行各种运算操作。

例如,AX寄存器用于存储数据,AL寄存器用于存储低8位数据,AH寄存器用于存储高8位数据等等。

2. 算术指令:汇编语言提供了一系列算术指令,用于执行加法、减法、乘法和除法运算等。

例如,ADD指令用于将两个数相加,并将结果存储在目标寄存器中。

3. 逻辑指令:逻辑指令用于执行各种逻辑操作,例如与、或、非和异或等。

例如,AND指令可用于执行逻辑与操作,并将结果存储在目标寄存器中。

4. 条件跳转指令:汇编语言提供了一些条件跳转指令,用于根据特定的条件转移执行流程。

例如,JZ(零标志跳转)指令可用于在零标志被设置时跳转到特定的位置。

第五章 DSP的汇编指令..

第五章 DSP的汇编指令..

第五章 TMS320C55x系列DSP的汇编指令
(2) 用户自定义的双指令的并行
这两条指令的并行是通过用户或C编译器定义的。两条指令 同时执行两个操作,用并行符“||”区分并行执行的两条指令。 例:
MPYM *AR1+, *CDP, AC1 ;D单元的一个MAC来完成
||XOR AR2,T1
;A单元的ALU来完成
第五章 TMS320C55x系列DSP的汇编指令
1、高速数字信号处理中常采用汇编语言编程。 2、汇编语言中的两种指令集 (1) 助记符指令集:有助于记忆的符号来表示指令。 (2) 代数指令集:类似于代数表达式,运算关系清楚明了。 注意:DSP的软件开发工具只支持单一的指令形式,不支持助记
符指令和代数指令的混合形式。 3、术语、符号和缩写见P93的表5-1 4、运算符见表5-2
令执行的条件:
TCx(测试/控制标志为1) !TCx(测试/控制标志为0)
TC1&TC2 TC1&!TC2 TC1|TC2 TC1|!TC2 TC1^TC2 TC1^!TC2
!TC1&TC2 !TC1&!TC2 !TC1|TC2 !TC1|!TC2 !TC1^TC2 !TC1^!TC2
第五章 TMS320C55x系列DSP的汇编指令
4、双16比特算术指令: [(1)语法、(2)操作数、(3)状态位] 在D单元中利用其ALU的双16比特模式,同时执行(并行)两个16
比特算术运算,包括加-减、减-加、两个加和两个减运算。
例:
说明: NO:不能并行执行 3:指令的长度为3字节 1:周期为1 X:在X(执行)流水线阶段处理
D – ALU:在D单元ALU执行。 执行结果:AC0=(*AR3)+CARRY+AC1 状态位: Affected by CARRY,C54CM,M40等

第五章 DSP的汇编指令..

第五章 DSP的汇编指令..

令执行的条件:
TCx(测试/控制标志为1) !TCx(测试/控制标志为0)
TC1&TC2 TC1&!TC2 TC1|TC2 TC1|!TC2 TC1^TC2 TC1^!TC2
!TC1&TC2 !TC1&!TC2 !TC1|TC2 !TC1|!TC2 !TC1^TC2 !TC1^!TC2
第五章 TMS320C55x系列DSP的汇编指令
4、双16比特算术指令: [(1)语法、(2)操作数、(3)状态位] 在D单元中利用其ALU的双16比特模式,同时执行(并行)两个16
比特算术运算,包括加-减、减-加、两个加和两个减运算。
例:
▪ M40=0时,D单元按32位运算模式,因此累加器溢出、进位、符号扩
展和移位操作都以第31比特为准。
▪ M40=1时,D单元按40位运算模式,因此累加器溢出,进位,符号扩
展和移位操作都以第39比特为准。
BCLR M40 ; Clear M40
BSET M40 ; Set M40
第五章 TMS320C55x系列DSP的汇编指令
第五章 TMS320C55x系列DSP的汇编指令
一、算术运算指令 用于完成加减乘除等运算,按照功能可分成以下几类:
▪ 加法指令 ▪ 减法指令:减法,条件减法,条件加/减 ▪ 乘法指令:乘法,乘加,乘减,双乘加/减 ▪ 双16比特算术指令 ▪ 比较运算指令:比较并求极值,最大/最小值,存储单元比较,寄存器比较 ▪ 移位指令:条件移位、带符号的移位。 ▪ 寄存器修改:辅助寄存器修改、堆栈指针SP修改 ▪ 隐含的并行指令 ▪ 专用指令:绝对值、归一化、有限冲激响应滤波FIR、最小均方LMS等
✓ M40=0时: 溢出位在第31位检测

8088汇编指令大全

8088汇编指令大全

8088汇编指令表一、数据传输指令───────────────────────────────────────它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据.1. 通用数据传送指令.MOV 传送字或字节.MOVSX 先符号扩展,再传送.MOVZX 先零扩展,再传送.PUSH 把字压入堆栈.POP 把字弹出堆栈.PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈.POPA 把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈.PUSHAD 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈.POPAD 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈.BSWAP 交换32位寄存器里字节的顺序XCHG 交换字或字节.( 至少有一个**作数为寄存器,段寄存器不可作为**作数) CMPXCHG 比较并交换**作数.( 第二个**作数必须为累加器AL/AX/EAX )XADD 先交换再累加.( 结果在第一个**作数里 )XLAT 字节查表转换.── BX指向一张 256 字节的表的起点, AL 为表的索引值 (0-255,即0-FFH); 返回 AL 为查表结果. ( [BX+AL]->AL )2. 输入输出端口传送指令.IN I/O端口输入. ( 语法: IN 累加器, {端口号│DX} )OUT I/O端口输出. ( 语法: OUT {端口号│DX},累加器 )输入输出端口由立即方式指定时, 其范围是 0-255; 由寄存器 DX 指定时,其范围是 0-65535.3. 目的地址传送指令.LEA 装入有效地址.例: LEA DX,string ;把偏移地址存到DX.LDS 传送目标指针,把指针内容装入DS.例: LDS SI,string ;把段地址:偏移地址存到DS:SI.LES 传送目标指针,把指针内容装入ES.例: LES DI,string ;把段地址:偏移地址存到ES:DI.LFS 传送目标指针,把指针内容装入FS.例: LFS DI,string ;把段地址:偏移地址存到FS:DI.LGS 传送目标指针,把指针内容装入GS.例: LGS DI,string ;把段地址:偏移地址存到GS:DI.LSS 传送目标指针,把指针内容装入SS.例: LSS DI,string ;把段地址:偏移地址存到SS:DI.4. 标志传送指令.LAHF 标志寄存器传送,把标志装入AH.SAHF 标志寄存器传送,把AH内容装入标志寄存器.PUSHF 标志入栈.POPF 标志出栈.PUSHD 32位标志入栈.POPD 32位标志出栈.二、算术运算指令───────────────────────────────────────ADD 加法.ADC 带进位加法.INC 加 1.AAA 加法的ASCII码调整.DAA 加法的十进制调整.SUB 减法.SBB 带借位减法.DEC 减 1.NEC 求反(以 0 减之).CMP 比较.(两**作数作减法,仅修改标志位,不回送结果).AAS 减法的ASCII码调整.DAS 减法的十进制调整.MUL 无符号乘法.IMUL 整数乘法.以上两条,结果回送AH和AL(字节运算),或DX和AX(字运算),AAM 乘法的ASCII码调整.DIV 无符号除法.IDIV 整数除法.以上两条,结果回送:商回送AL,余数回送AH, (字节运算);或商回送AX,余数回送DX, (字运算).AAD 除法的ASCII码调整.CBW 字节转换为字. (把AL中字节的符号扩展到AH中去)CWD 字转换为双字. (把AX中的字的符号扩展到DX中去)CWDE 字转换为双字. (把AX中的字符号扩展到EAX中去)CDQ 双字扩展. (把EAX中的字的符号扩展到EDX中去)三、逻辑运算指令───────────────────────────────────────AND 与运算.OR 或运算.XOR 异或运算.NOT 取反.TEST 测试.(两**作数作与运算,仅修改标志位,不回送结果).SHL 逻辑左移.SAL 算术左移.(=SHL)SHR 逻辑右移.SAR 算术右移.(=SHR)ROL 循环左移.ROR 循环右移.RCL 通过进位的循环左移.RCR 通过进位的循环右移.以上八种移位指令,其移位次数可达255次.移位一次时, 可直接用**作码. 如 SHL AX,1.移位>1次时, 则由寄存器CL给出移位次数.如 MOV CL,04SHL AX,CL四、串指令───────────────────────────────────────DS:SI 源串段寄存器 :源串变址.ES:DI 目标串段寄存器:目标串变址.CX 重复次数计数器.AL/AX 扫描值.D标志 0表示重复**作中SI和DI应自动增量; 1表示应自动减量.Z标志用来控制扫描或比较**作的结束.MOVS 串传送.( MOVSB 传送字符. MOVSW 传送字. MOVSD 传送双字. )CMPS 串比较.( CMPSB 比较字符. CMPSW 比较字. )SCAS 串扫描.把AL或AX的内容与目标串作比较,比较结果反映在标志位.LODS 装入串.把源串中的元素(字或字节)逐一装入AL或AX中.( LODSB 传送字符. LODSW 传送字. LODSD 传送双字. )STOS 保存串.是LODS的逆过程.REP 当CX/ECX<>0时重复.REPE/REPZ 当ZF=1或比较结果相等,且CX/ECX<>0时重复.REPNE/REPNZ 当ZF=0或比较结果不相等,且CX/ECX<>0时重复.REPC 当CF=1且CX/ECX<>0时重复.REPNC 当CF=0且CX/ECX<>0时重复.五、程序转移指令───────────────────────────────────────1>无条件转移指令 (长转移)JMP 无条件转移指令CALL 过程调用RET/RETF过程返回.2>条件转移指令 (短转移,-128到+127的距离内)( 当且仅当(SF XOR OF)=1时,OP1<OP2 )JA/JNBE 不小于或不等于时转移.JAE/JNB 大于或等于转移.JB/JNAE 小于转移.JBE/JNA 小于或等于转移.以上四条,测试无符号整数运算的结果(标志C和Z).JG/JNLE 大于转移.JGE/JNL 大于或等于转移.JL/JNGE 小于转移.JLE/JNG 小于或等于转移.以上四条,测试带符号整数运算的结果(标志S,O和Z). JE/JZ 等于转移.JNE/JNZ 不等于时转移.JC 有进位时转移.JNC 无进位时转移.JNO 不溢出时转移.JNP/JPO 奇偶性为奇数时转移.JNS 符号位为 "0" 时转移.JO 溢出转移.JP/JPE 奇偶性为偶数时转移.JS 符号位为 "1" 时转移.3>循环控制指令(短转移)LOOP CX不为零时循环.LOOPE/LOOPZ CX不为零且标志Z=1时循环.LOOPNE/LOOPNZ CX不为零且标志Z=0时循环.JCXZ CX为零时转移.JECXZ ECX为零时转移.4>中断指令INT 中断指令INTO 溢出中断IRET 中断返回5>处理器控制指令HLT 处理器暂停, 直到出现中断或复位信号才继续. WAIT 当芯片引线TEST为高电平时使CPU进入等待状态. ESC 转换到外处理器.LOCK 封锁总线.NOP 空**作.STC 置进位标志位.CLC 清进位标志位.CMC 进位标志取反.STD 置方向标志位.CLD 清方向标志位.STI 置中断允许位.CLI 清中断允许位.六、伪指令───────────────────────────────────────DW 定义字(2字节).PROC 定义过程.ENDP 过程结束.SEGMENT 定义段.ASSUME 建立段寄存器寻址.ENDS 段结束.END 程序结束.详细:80X86 汇编指令符号大全+、-、*、/∶算术运算符。

汇编语言指令集合 吐血整理

汇编语言指令集合 吐血整理

RET(return)
5.中断
INT(interrupt)指令
IRET(interrupt return)
INTO(interrupt if overflow)
六、处理机控制指令
1.标志处理指令
CLC(Clear carry)
CMC(Complement carry)
STC(Set carry)
CLD(Clear direction)
串比较指令
SCASB(Scan string of byte)
串搜索指令
SCASW(Scan string of word)
串搜索指令
STOSB(Store string of byte)
存串指令
STOSW(Store string of word)
存串指令
LODSB(Load string of byte)
ES(Extra Segment):附加段寄存器。
第一部分:指令助记符: 一、数据传送指令
1.通用数据传送指令 MOV(Move) PUSH(Push onto the stack) POP(Pop from the stack) XCHG(Exchange)
2.累加器专用传送指令 IN(Input) OUT(Output) XLAT(Translate)
REPE(Repeat when empty) 若(CX)=0,则退出,否则 CX=CX+1;
REPZ(Repeat when flag )
若 ZF=0,则退出,否则 CX=CX+1;
REPC(Repeat when carry flag)
REPNE(Repeat when not empty)
REPNZ(Repeat when not zero flag)

c语言和汇编运算对应关系

c语言和汇编运算对应关系

c语言和汇编运算对应关系【原创版】目录1.C 语言和汇编语言的概述2.C 语言中的运算符和汇编语言中的指令的对应关系3.实例分析正文一、C 语言和汇编语言的概述C 语言是一种高级编程语言,广泛应用于操作系统、嵌入式系统等领域。

它具有语法简单、执行效率高、跨平台等特点。

汇编语言是一种低级编程语言,与计算机硬件的操作紧密相关,可以直接控制计算机硬件。

汇编语言具有执行速度快、资源占用低等特点,但编写难度较大。

二、C 语言中的运算符和汇编语言中的指令的对应关系C 语言中的运算符可以分为算术运算符、关系运算符、逻辑运算符和赋值运算符等。

在汇编语言中,对应的指令主要包括加法指令、减法指令、乘法指令、除法指令、关系指令、逻辑指令和寄存器指令等。

以下是一些典型的对应关系:1.加法运算符(+):在汇编语言中对应 ADD 指令,如 ADD A, B。

2.减法运算符(-):在汇编语言中对应 SUB 指令,如 SUB A, B。

3.乘法运算符(*):在汇编语言中对应 MUL 指令,如 MUL B。

4.除法运算符(/):在汇编语言中对应 DIV 指令,如 DIV B。

5.关系运算符(如<、>、<=、>=):在汇编语言中对应 CMP 指令,如CMP A, B。

6.逻辑运算符(如&、|、^、~):在汇编语言中对应逻辑指令,如 ANDA, B;OR A, B;XOR A, B;NOT A。

7.赋值运算符(如=、+=、-=、*=、/=):在汇编语言中对应 MOV 指令,如 MOV A, B;MOV A, #;MOV B, A 等。

三、实例分析假设有一个 C 语言表达式:A = A + B,对应的汇编语言代码为:```MOV A, B ; 将 B 的值加到 A 中ADD A, B ; 计算 A + B 的结果,并将结果存储在 A 中```通过以上分析,我们可以发现 C 语言中的运算符和汇编语言中的指令具有明显的对应关系。

汇编语言学习第4章

汇编语言学习第4章

不同而不同。
(名字项,常称为标号) 标号是程序设计人员自己定义的表示符号,用来表示本语句的符号地址
(即该指令的偏移地址,也就是该单元与其所处段基址的偏移量)是可有
可无的,只有当需要用符号地址来访问该语句时才需要。 2.operation(操作符)
操作符项可以是指令、伪操作或宏指令的助记符。对于指令,作用是指出
1.等价语句EQU
等价语句的一般使用格式如下: SYMBOL EQU EXPRESSION
作用是用左边的符号名代表右边的表达式。
注意:等价语句不会给符号名分配存储空间,符号名不能与其它符号同名, 也不能被重新定义。
(1)用符号名代表常量或表达式
例4.14 (2)用符号名代表字符串 例4.15 (3)用符号名代表关键字或指令助记符 例4.16
例4.21
2.定义字变量的伪指令为DW
一个变量占一个字空间
例4.22:WORD1 DW DW 89H, 1909H, -1 0ABCDH, ?, 0
上面的定义语句经汇编后所产生出的内存单元分配情况如下:
… 89 00 09 19 FF FF CD AB --00 00 …
例4.23
3.双字变量定义伪指令DD 每个双字变量占用二个连续的字单元(四个字节)。
功能和作用,而不应该只写出指令的动作。
4.2运算符号
4.2.1算术运算符
算术运算符有:+、-、*、/和MOD。 其中: +、-、*、/就是我们算术中常用的加、减、乘、除。 MOD算符是模运算。指除法运算后得到的余数。 例如:5 MOD 2为1。 注意:算术运算符可以用于数字表达式或地址表达式中,但当它用于地址 表达式时,只有当其结果有明确的物理意义时才是有效的。 例如:将两个地址相乘或相除是无意义的。地址可以做加减运算,但也必 须注意物理意义。例如把两个不同段的地址相加减也是无意义的。 例4.1 例4.2

汇编语言及编程实例(电子教案)

汇编语言及编程实例(电子教案)

汇编语言及编程实例(电子教案)汇编语言程序设计2005第四章汇编语言程序设计回顾:8086的内部结构、寄存器功能和工作过程,指令格式、寻址方式和功能。

本讲重点:了解汇编的概念及其方法,掌握汇编程序的基本格式,常用运算符的使用方法,汇编的步骤。

4.1汇编语言的基本元素一、汇编语言的语句格式由汇编语言编写的源程序是由许多语句(也可称为汇编指令)组成的。

每个语句由1~4个部分组成,其格式是:[标号]指令助记符[操作数][;注解]其中用方括号括起来的部分,可以有也可以没有。

每部分之间用空格(至少一个)分开,一行最多可有132个字符。

1.标识符给指令或某一存储单元地址所起的名字。

可由下列字符组成:字母:A~z;数字:0~9;特殊字符:、·、@、一、$数字不能作标识符的第一个字符,而圆点仅能用作第一个字符。

标识符最长为31个字符。

当标识符后跟冒号时,表示是标号。

它代表该行指令的起始地址;当标识符后不带冒号时,表示变量;伪指令前的标识符不加冒号。

2.指令助记符表示不同操作的指令,可以是8086的指令助记符,也可以是伪指令。

3.操作数指令执行的对象。

依指令的要求,可能有一个、两个或者没有,例如:RET;无操作数COUNT:INCC某;一个操作数如果是伪指令,则可能有多个操作数,例如:COSTDB3,4,5,6,7;5个操作数MOVA某,[BP+4];第二个操作数为表达式4.注解该项可有可无,是为源程序所加的注解,用于提高程序的可读性。

二、汇编语言的运算符1.算术运算符、逻辑运算符和关系运算符-1-汇编语言程序设计2005算术运算符可以应用于数字操作数,结果也是数字。

而应用于存储器操作数时,只有+、-运算符有意义。

2.取值运算符SEG、OFFSET、TYPE、SIZE和LENGTH·SEG和OFFSET分别给出一个变量或标号的段地址和偏移量。

例如,定义:SLOTDW25则:MOVA某,SLOT;从SLOT地址中取一个字送入A某MOVA某,SEGSLOT;将SLOT所在段的段地址送入A某MOVA某,OFFSETSLOT;将SLOT所在段的段内偏移地址送A某·TYPE操作符返回一个表示存储器操作数类型的数值。

汇编浮点运算符

汇编浮点运算符
FCHS 改变符号位(求负数) st(0) <-st(0)
F2XM1 计算(2 ^ x)-1 st(0) <- (2 ^ st(0)) - 1
FYL2X 计算Y * log2(X) st(0)为Y;st(1)为X;将st(0)和st(1)变为st(0) * log2( st(1) )的值
FPREM 取余数 st(0) <-st(0) MOD st(1)
FPREM1 取余数(IEEE),同FPREM,但是使用IEEE标准[486]
FRNDINT 取整(四舍五入) st(0) <- INT( st(0) ); depends on RC <- ABS( st(0) ); removes sign
FLDPI 将pi装入st(0) st(0) <- ?(ie, pi)
FLDL2T 将log2(10)装入st(0) st(0) <- log2(10)
FLDL2E 将log2(e)装入st(0) st(0) <- log2(e)
FLDLG2 将log10(2)装入st(0) st(0) <- log10(2)
FCOS 余弦函数Cos st(0) <- COS( st(0) )
FPTAN 正切函数tan st(0) <- TAN( st(0) )
FPATAN 反正切函数arctan st(0) <- ATAN( st(0) )
FSIN 正弦函数sin st(0) <- SIN( st(0) )
FIST dest 将st(0)以整数保存到dest dest <- st(0) (mem32/mem64)
FISTP dest dest <- st(0) (mem16/mem32/mem64);然后再执行一次出栈操作

汇编语言设计-算术运算指令

汇编语言设计-算术运算指令

NEG指令是对指令中的操作数取补,再将结果送回。因 对一个操作数求2的补码,相当于0减去此操作数,所以NEG 指令执行的也是减法操作。
说明:0 – OPRD 又相当于: ①、FFH-OPRD+1 (字节操作)或
②、FFFFH-OPRD+1(字操作)。即将OPRD内容变反加1
例:若(AL)=13H 0000 0000 执行 NEG AL – 0001 0011
0000 0110 + 1111 1100 1← 0000 0010
6 + 252
258>255
+6 + (–4)
+2
CF=1 溢出
OF=0 不溢出
ⅲ、无符号数不溢出,带符号数溢出:
二进制加法 认作无符号 认作带符号数
0000 1000 + 0111 1011
1000 0011
8 + 123
131 CF=0 无溢出
2、带进位位的加法指令ADC ADC dest , src ; dest←dest+src+CF
ADC主要用于多字节运算,ADC对标志位的影响同ADD。 例:计算 1234FEDCH+33128765H 分别存于数据段指
定的区域中,低位在前,高位在后,相加后其和存入前一个双 字所在的区域中。 (SI)→1000H DCH (41H)
+ 39H 0011 1001
0110 1110
则(AL)=6EH,低4位为非法码,故需调整。
4、组合十进制加法调整指令DAA
(BCD码的加法十进制调整指令)
格式:DAA
功能:对组合BCD码相加的结果进行调整,使结果仍为 组合的BCD码。

汇编语言程序设计

汇编语言程序设计

第四章汇编语言程序设计(assembly languageprogramming)§4.1 汇编语言(assembly language)一.概述汇编语言:一种符号语言,它用助记符表示指令的操作码和操作数,用标号或符号代表地址、常量和变量,与机器语言几乎一一对应汇编语言程序:用汇编语言编写的程序汇编:把汇编语言源程序翻译成机器语言目标程序的过程汇编语言源程序手工汇编或汇编程序机器语言目标程序汇编程序:用来完成汇编工作的程序,有小汇编ASM宏汇编MASM动态调试程序DEBUG二.汇编语言的语句格式: [名称] 指令助记符 [操作数] [;注释]带方括号的项有时可没有,注释项完全可以没有每个部分用空格分开每行最多可有132个字符,但最好不要超过屏宽80语句可分成指令性语句和指示性语句(伪指令语句)指令性语句汇编后可生成机器码[标号:] 指令助记符 [操作数] [;注释]指示性语句指示汇编程序处理一些工作[名称] 伪指令(指示符) [操作数] [;注释]1.名称(或称标识符)给指令或存储单元地址起的名字,由字母、数字、字符组成字母:A~Z ,a~z数字:0~9字符:可打印+-*/=()[]〈〉;.' ’ ,_:?@$&(非打印空格制表符TAB 回车换行)(界符:,;:.()[]〈〉+-*/=?_@&$' ’界符用来表示某个标志的结束)数字不能作名称的第一个字符,圆点.仅能作第一个字符保留字不能作标识符($、?是保留字,与其它字符组合除外)名称最长为31个字符当名称后跟冒号,表示该名称是其后指令的标号,代表该指令的开始地址,其他指令可以用该标号作为转移地址当名称不跟冒号,它可能是标号或变量名,伪指令前的名称不跟冒号冒号隐含NEAR属性,例:供段内调用写成 OUTPUT:OUT DX ,AL供段间调用写成 OUTPUT OUT DX ,AL2.指令助记符8086/8088指令,也可以是伪指令,如果指令有前缀(LOCK、REP等)则前缀和指令用空格分开3.操作数指令执行的对象,可能有一、二个或没有名称指令助记符操作数注释RET ;返回(无操作数)COUNT: INC CX ;CX加1(1个操作数)MOV AL,BL ;ALBL(2个操作数)伪指令可有多个操作数COST DB 3,4,5,6,7,8 ;(6个操作数,用逗号分开)操作数可以是常数、寄存器名、标号、变量、表达式,MOV AX,[BP+4];(第二个操作数为表达式)4.注释可选项,使程序易读,汇编时不作处理注释前面要加分号,它可位于操作数之后,也可位于行首三.常量与变量1.常量,也叫常数,没有属性的纯数,汇编时已确定的值·数字常量为0~65535中的数(16位寄存器使用,伪操作可定义32位),进制加后缀说明,十进制加D(可省),二进制加B,八进制加Q,十六进制加H,若十六进制第一位为字母,则前头应加0·字符和字符串叫串常量,是ASCII码字符串,必须加单(或双)引号例:‘A’,“ABC”,汇编后变成41H,414243H2.变量,用于表达数值(或串)的标识符,有三个属性① 段属性(SEGMENT)② 偏移地址属性(OFFSET)③ 类型属性(TYPE),用DB、DW、DD定义§4.2 伪指令(pseudo-instruction)一.符号定义伪指令1.等值EQU格式:符号名 EQU 表达式用来给符号定义一个值,程序中出现该符号就用其值代替,EQU只能定义一次DATA EQU 1234 ;代表一个数XYZ EQU ALPHA[SI] ;代表一个地址2.等号 =格式:符号名 = 表达式意义与EQU一样,但程序中可重新定义符号的值EMP = 6 ;EMP代表6EMP =EMP + 1 ;EMP现在代表73.解除PURGE格式:PURGE 符号名(符号1,符号2,……,符号n)用于解除所定义的符号使该符号在以后的定义中有效例:原定义 TAB EQU 5可用 PURGE TAB 来解除然后可重新定义 TAB EQU 10二.数据定义伪指令用于预置存储器或定义变量1.定义字节DB格式:[变量名称] DB 表达式例:DATA1 DB 2,3,4,5;从DATA1单元开始存放4字节数据2.定义字DW格式:[变量名称] DW 表达式例:TAB DW 1234H;TAB单元内容为34H,TAB+1单元内容为12H 3.定义双字DD格式:[变量名称] DD 表达式每个数据二字(四字节)低位部分在低地址,高位部分在高地址·用DB/DW/DD定义的数每行不得超过16项,超过16项必须换行DB/DW/DD用法<1> SUM DB ? ;给SUM单元分配一个字节,内容未定<2> TAB DB 20 DUP(0);给TAB开始单元分配20字节,内容为0<3> TIME DW 100 DUP(?);给TIME开始单元分配100字,内容未定<4> ADDR DD TABLE ;TABLE的地址(双字)给ADDR例:DATA SEGMENTORG 100HTABLE DB 1,2,3,4ADDR DD TABLEDATA ENDS假设汇编后DS=13A2H(如果ADDR用DW定义,只得偏移量)(如果TABLE是变量,ADDR得地址,是常量,ADDR得数值)<5> LETTER DB ‘ABCDEFG’;将字符串以ASCII码形式填入LETTER开始的内存<6> HIS DB 3 DUP(‘WELCOME!’,0DH,0AH);从HIS单元开始重复3次存放WELCOME!和回车换行符4.标号LABEL格式:标号名 LEBEL 类型标号用于说明可执行代码在汇编语言程序中的位置,即符号地址,供调用和转移之用标号有三个属性段属性偏移量属性距离属性(即格式中的类型):NEAR(近程)和FAR(远程)NEAR:本标号为段内标号,调用本标号只提供偏移地址,段基址为当前代码段FAR:本标号为段间标号,调用本标号提供偏移地址和段基址一个具有NEAR属性的标号也可用标号加冒号作后缀,并排列在代码行的开头来隐含如 AGAIN LABEL NEARXOR AX,BUFF[BX]可写成 AGAIN:XOR AX,BUFF[BX]例:ROOT LABEL NEAR ;以下程序所用的ROOT标号是段内属性COMP PROC NEAR ;以下程序所用的过程下的标号是段内属性TIME PROC FAR ;以下程序所用的过程下的标号是段间属性三.运算符1.算术运算符+、-、*、/、MOD即加、减、乘、除、除法取余数(如19 MOD 7=5)操作数是数字,结果也是数字存储器地址运算时只有加减,例TAB+2、BETA-5等2.逻辑运算符AND、OR、XOR、NOT即与、或、异或、非操作数是数字,结果也是数字例:AND BX,DAT AND 0FEH3.关系算符EQ、NE、LT、GT、LE、GE即相等、不等、小于、大于、小于等于、大于等于若关系是假结果为0,若关系是真结果为0FFFFH例:MOV BX,PAD LT 3则PAD的值小于3时,汇编成MOV BX,0FFFFH否则,汇编成MOV BX,04.分析运算符可把存储器操作数分解成它的组成部分,如段值、段内偏移量、类型5.合成算符由已存在的存储器操作数生成一个段值与偏移量相同,而类型不同的新的存储器操作数以下讨论分析算符和合成算符1.取段基址SEG它加于一个变量或标号之前,回送段基址,例:ASSUME CS:SEG BEGIN ;令CS为BEGIN程序段段基址MOV AX,SEG VARN ;将VARN的段基址送AX2.取偏移量OFFSET它加于一个变量或标号之前,取其偏移量,例:MOV BX,OFFSET SUM ;将SUM的段内偏移量存入BX3.取类型码TYPE它加于一个变量或标号之前,取其类型代码DB DW DD DQ DT NEAR FAR1 2 4 8 10 -1 -2例:NG1 DB ‘A’,‘D’,3NG2 DW 88,265……MOV AL,TYPE NG1 ;NG1定义字节,AL 1MOV AL,TYPE NG2 ;NG2定义字,AL 24.取长度LENGTH它加于一个变量之前,取分配给变量的项数例:TAB DB 150 DUP(?);150项,150字节FUM DW 150 DUP(?);150项,300字节则,MOV CX,LENGTH TAB ;CX 150MOV AX,LENGTH FUM ;AX 150·注意:LENGTH返回的存储区必须用DUP()来定义,否则返回为1 5.取字节数SIZE它加于一个变量之前,取回变量所占字节总数,有SIZE = LENGTH * TYPE由上例,LENGTH TAB = 150,TYPE TAB = 1LENGTH FUM = 150,TYPE FUM = 2可知: SIZE TAB = 150SIZE FUM = 300以上5个叫数值返回算符6.类型指示PTR格式:类型 PTR 地址表达式表示PTR右边的(存储器)操作数是左边的类型,有:BYTE、WORD、DWORD、NEAR、FAR例:INC BYTE PTR [BX] ;将BX指向的单元字节加1MOV WORD PTR [DI],99 ;立即数99送DI指向的字中JMP NEAR PTR FOK ;以近程方式跳转到FOK(只取FOK偏移地址)7.指定符THIS(合成算符)用于定义当前所指单元中的类型格式:THIS 类型/距离经THIS定义过的标号具有当前汇编段、偏移量和所规定的类型或距离等属性,例:FOOB EQU THIS BYTE;下面的字类型变量FOOW在这里指定为字节型FOOBFOOW DW 120 DUP(?)定义后,对同一数据块(FOOB和FOOW有相同的段和段内偏移量)有两种类型访问FOOB时为字节操作,访问FOOW时为字操作ADD AL,FOOB[3] ;将数组第四字节与AL相加MOV AX,FOOW[4]将数组第五六字节组成的字送AX也可以这样来构成FOOB:FOOB EQU BYTE PTR FOOW又例:DATAF EQU THIS FARDATAN:MOV AX,FOO这时 JMP DATAN为近程转移JMP DATAF为远程转移8.段修改符:用于对某一地址表达式指定临时段基址,如MOV AX,ES:[BX];指定ES为BX的段基址,对当前指令有效9.短程符SHORT与NEAR、FAR功能类似,位移量一字节范围 -128~+127,对应一条短转移指令例:JMP SHORT LAB;转移到标号LAB的地址10.方括号 [ ]表示操作数(加方括号)是一个地址偏移量,不是数值格式:[表达式] 或者 [表达式][ ]例:MOV [BX],AX ;将AX内容送BX所指单元MOV [BX+7],AX ;将AX内容送BX+7所指单元MOV AX,[BX][SI] ;将BX+SI所指单元内容送AX11.取高/低字节HIGH/LOW用来分离常量的高/低字节,对存储器操作数无效例:DATA EQU 789AHMOV AL,HIGH DATA ;AL=78HMOV AL,LOW DATA ;AL=9AH四.段定义伪指令1.SEGMENT—ENDS格式:[段名] SEGMENT [定位类型] [组合类型] [‘类别名’]┇[段名] ENDS·段名·定位类型(Align),给出实际段地点的种类或段长度的信息<1> PARA 段起始地址从一个节(paragraph)的边界开始<2> BYTE 段地址可从任意绝对地址开始<3> WORD 段地址从任意一个字的边界开始<4> PAGE 段地址从某一页的边界开始(一页等于256字节)<5> INPAG 段长度小于一页未说明定位类型时则默认为PARA·组合类型(Combine),又称联合类型,程序中各程序段的连接和定位方法<1> PUBLIC 将段名相同的程序段(亦称模块)依此紧密连接,但彼此不相互覆盖<2> COMMON将段名相同的程序段连接,各段都从同一地址开始<3> AT表达式段定位在由表达式(结果必须是常数)所指定的节的边界上例:AT 1234H,则段地址被定位在物理地址为12340H处,如果希望从12345H开始,则在SEGMENT命令的下一行写上ORG 5AT 不能向前引用<4>STACK 表示这个段是运行期间的堆栈段<5>MEMORY 该段是相互连接的几个段中地址最高的段<6>NONE本段与其他段无组合关系未说明联合类型时则默认为NONE,不和别的段连接·‘类别名’(Class),也叫组名,加单引号,汇编后类别名相同的程序段代码集中在一起定位,形成一个统一的物理段,类别名可自定,约定的有CODE (代码段)、DATA(数据段)、STACK(堆栈段)、CONST(常数)、MEMORY(存储)等2.ASSUME段寄存器说明伪指令,指明所定义的段名所使用的段寄存器(告诉汇编程序在运行期间通过哪一个段寄存器寻址才能找到所要的指令和数据),本语句一般在定义的代码段中第一条出现格式:ASSUME 段寄存器:段名 [,…]例: ASSUME CS:CODE,DS:DATA ;用SEGMENT—ENDS定义ASSUME CS:SEG KGF,DS:SEG BEGIN;由算符定义ASSUME ES:NOTHING ;用关键字定义,表示不使用ES(取消ES段寄存器)(保留字NOTHING在这里作为一个段名参数,ASSUME NOTHING表示取消所有段寄存器,各个段寄存器只能在指令性语句中由MOV指令赋值)·ASSUME只是设定段寄存器与逻辑段的对应关系,并没给段寄存器装入实际值,所以程序中必须对DS、ES、SS赋值,而CS由系统赋值3.ORG定点伪指令(段内定位),用以确定下一条指令(或变量)在当前段中的偏移地址格式:ORG 表达式表达式以65536(64K)为模计算,超过64K则取其余数本语句前未定义过的变量不可出现在表达式中,表达式可包含$(程序计数器当前值)如:ORG OFFSET $+1000表达式必须为正值,若为负值,就会从当前段的地址高端开始表达式最好不要写成OFFSET $-1000,以免把汇编过的1000个字节覆盖掉ORG指令不能带标识符,如START:ORG 0和SKIP ORG 100都是错的例:CODE SEGMENT ;段起始ORG 100H ;本程序代码从偏移地址100H开始装入ASSUME CS:CODE ;装入代码段地址到CS中START:IN AL,30H ;程序段SHL AL,1OUT 32H,ALJMP STARTCODE ENDS ;程序段结束END START ;汇编结束例:DATA SEGMENTORG 50HDAT DW 1,2,$+1┇DATA ENDS注意DAT不能定义为字节,否则与$不匹配五.过程定义伪指令格式:过程名 PROC 属性┇过程体RET过程名 ENDP·过程名不可缺省,它和标号一样有三个属性:段属性、偏移地址属性、距离属性·距离属性在PROC后指定,有NEAR和FAR,如果希望过程能让别的程序调用,则必须是FAR属性·一个过程允许多个入口,入口处有标号,标号要说明距离属性例:延时100ms子程序DELAY PROC ;隐含NEARMOV BL,10 4TDLY1: MOV CX,2801 ;内循环延时10ms 10TWAIT0: LOOP WAIT0 9/5T DEC BL 2TJNZ DLY1 8/4TRET 8TDELAY ENDP六.结束伪指令·NAME:给模块(源程序)命名格式:NAME 模块名称它出现在源程序的最前端·END:汇编结束格式:END [标号名]它通知汇编程序本模块汇编到此结束标号名是可选项,若选取,应指向执行本程序的起始地址若一个源程序是多模块,只有主模块的END后加标号,子模块只有END七.宏指令宏指令:在汇编语言源程序中多次重复出现的程序段,用一个名字来定义,然后当成一条指令来使用宏汇编:源程序中的宏指令经汇编程序翻译后扩展成对应程序段的机器码宏指令用MACRO—ENDM来定义,如:CRLF MACROMOV DL,0DHMOV AH,02HINT 21H┇ENDM(CRLF作回车换行)§4.3 汇编语言程序设计(assembly language programming)一.设计要求1.程序简明、易读、易调试、易修改2.程序占用内存要少(包括程序长度及运行时所需空间)3.程序运行速度要快二.基本设计方法1.选择合适的计算方法2.绘制程序流程图3.编制程序4.上机调试三.汇编语言程序格式和基本结构一般一个完整的汇编语言程序至少应包括以下三个程序段简化段格式:.MODEL SMALL.STACK 64H.DATA……;紧接指令代码从偶地址开始存放.CODESTART: MOV AX,@DATAMOV DS,AX……END STARTDATA SEGMENT ‘DATA’┇数据段DATA ENDSSTACK SEGMENT ‘STACK’┇堆栈段STACK ENDSCODE SEGMENT ‘CODE’ASSUME CS:CODE,DS:DATA,SS:STACKSTART:MOV AX,DATAMOV DS,AXMOV AX,STACKMOV SS,AX┇代码段CODE ENDSEND START程序的基本结构分为顺序结构、分支结构、循环结构和子程序结构(一)顺序结构一种简单程序,按顺序执行例1.将200H单元的低4位和高4位分别送入201H和202H单元的低4位,这二单元的高4位清0200HX X201H 0202H 0DATA SEGMENTORG 200HBCD DB 47HDB 2 DUP(?)DATA ENDSSTACK SEGMENTSTA DB 20 DUP(?)TOP EQU LENGTH STASTACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTART:MOV AX,DATAMOV DS,AXMOV AX,STACK MOV SS,AXMOV AX,TOPMOV SP,AXMOV BX,OFFSET BCD MOV AL,[BX]AND AL,0FHMOV [BX+1],AL MOV AL,[BX]MOV CL,4ROL AL,CLAND AL,0FHMOV [BX+2],AL HLTCODE ENDS END START例2.将ADDR1和ADDR2两单元开始的二个16位无符号数相加,考虑到进位,将其结果存放在SUM开始的三个单元中DATA SEGMNETADDR1 DW 7854HADDR2 DW 9981HSUM DB 3 DUP(0)DATA ENDSSATCK SEGMENTSTA DB 20 DUP(?)TOP EQU LENGTH STASTACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTART: MOV AX,DATAMOV DS,AXMOV AX,STACKMOV SS,AXMOV AX,TOPMOV SP,AXMOV AX,ADDR1ADD AX,ADDR2MOV WORD PTR SUM,AXADC SUM+2,0HLTCODE ENDSEND START例3.查表将DATA1单元中字节类型数据(0~0FH)转换成ASCII码,并存入ASCII单元中DATA SEGMENTASCTAB DB 30H,31H,32H,33H,34H,35H,36H,37HDB 38H,39H,41H,42H,43H,44H,45H,46HDATA1 DB 09HASCII DB ?DATA ENDSSTACK SEGMENT STACKDW 10 DUP(?)STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTART PROC FARASCTAB 30 031 1┇93941 A42 B┇46 F┇ASCIIPUSH DSMOV AX,0PUSH AXMOV AX,DATAMOV DS,AXMOV BX,OFFSET ASCTABMOV AL,DATA1XLATMOV ASCII,ALRETSTART ENDPCODE ENDSEND START例4.将200H和201H单元字节的高4位对调,低4位不变CODE SEGMENT200H201HORG 200HDATA1 DB 0F3H,47HASSUME CS:CODE,DS:CODESTART:MOV AX,CODEMOV DS,AXMOV CL,4MOV AX,WORD PTR DATA1 ;AX=47F3HROL AX,CL ;AX=7F34H ROL AH,CL ;AX=F734H ROL AL,CL ;AX=F743H MOV WORD PTR DATA1,AXHLTCODE ENDSEND START(二)分支结构通过判断产生分支,借助于条件转移指令跳转到相应的分支地址执行分支程序分支程序由三部分组成① 测试部分,负责产生决定分支的条件② 定向部分,根据测试条件是否满足,决定程序是否分支③ 标注部分,标明分支的去向利用跳转表也可使程序转移到分支地址例1.16位二进制补码X在DATA1单元,求其绝对值送DATA2单元(设X≠8000H)∣X∣= X,X≥0-X, X<0DATA SEGMENTDATA1 DW 9F87HDATA2 DW ?DATA ENDSSTACK SEGMENTSTA DB 20 DUP(?)TOP EQU LENGTH STA STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACK START:MOV AX,DATAMOV DS,AXMOV AX,STACKMOV SS,AXMOV AX,TOPMOV SP,AXMOV AX,DATA1AND AX,AXJNS ABS0NEG AXABS0: MOV DATA2,AXHLTCODE ENDSEND START例2.多重分支学生成绩按分数段划分为:A、90~100(5AH~64H)B、80~89 (50H~59H)C、70~79 (46H~4FH)D、60~69 (3CH~45H)E、 <60 ( <3CH)已知分数存放在MARK单元,请用ASCII码的A、B、C、D、E去代表MARK单元中的分数所属的段,并存于GRADE单元DATA SEGMENTMARK DB 81GRADE DB ?DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATAMOV DS,AXMOV BX,OFFSET MARKMOV AL,[BX]CMP AL,3CHJC LPECMP AL,46HJC LPDCMP AL,50HJC LPCCMP AL,5AHJC LPBMOV AL,41H ;‘A’JMP SHORT DONELPB: MOV AL,42H ;‘B’JMP SHORT DONELPC: MOV AL,43H ;‘C’JMP SHORT DONELPD: MOV AL,44H ;‘D’JMP SHORT DONELPE: MOV AL,45H ;‘E’DONE: MOV BX,OFFSET GRADE MOV [BX],ALHLTCODE ENDSEND START法2:直接查表转换(顺序结构)DATA SEGMENTTAB DB ‘EEEEEEDCBAA’MARK DB 81GRADE DB ?DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA START:MOV AX,DATAMOV DS,AXMOV BX,OFFSET TABMOV AL,MARKMOV AH,0MOV CL,10DIV CLXLATMOV GRADE,ALHLTCODE ENDSEND START(三)循环结构使机器重复执行一系列指令,是一种闭合的分支结构循环程序由四部分组成① 初始化部分(或预置部分),负责设置循环初值② 处理部分,循环过程的主体③ 控制部分,修改初值,判断是否循环循环次数由一计数器控制循环次数由某一指定条件是否满足来决定④ 结束部分,处理循环程序的最后结果例1.将DTAB单元开始的一组字节补码数(≤255个)求平均值,结果存入AVE单元,若结果为负,在SYM置FFH否则置0DATA SEGMENTDTAB DB 0FDH,0FCH,05H,0F8H,……DB 08H,25H,83H,97H,……COUNT EQU $-DTABAVE DB ?SYM DB ?DATA ENDSSTACK SEGMENT STACKSTA DB 20 DUP(?)STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACK AVER PROC FARSTART:PUSH DSMOV AX,0PUSH AXMOV AX,DATAMOV DS,AXLEA BX,DTABMOV CX,COUNTXOR DX,DXNEXT: MOV AL,[BX]CBWADD DX,AXINC BXLOOP NEXTMOV AX,DX MOV CL,COUNTIDIV CLMOV AVE,ALMOV SYM,0AND AL,ALJNS DONEMOV SYM,0FFHDONE: RETAVER ENDPCODE ENDSEND START循环控制方法:循环次数由计数器控制例2.将8位二进制小数规格化设需规格化的小数在DATA1单元,要求规格化后使其最高位为1,并存入DATA2单元,办法是把小数左移至最高为位为1为止,左移次数存入DATA3单元,若小数是0,则在DATA2和DATA3单元存入0示例:DATA1 DATA2 DATA322H 88H 02H01H 80H 07HCBH CBH 00H00H 00H 00HDATA SEGMENTDATA1 DB 22HDATA2 DB ?DATA3 DB ?DATA ENDSSTACK SEGMENTSTA DB 20 DUP(?)TOP EQU LENGTH STA STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTART:MOV DATAMOV DS,AXMOV AX,STACKMOV SS,AXMOV AX,TOPMOV SP,AXMOV CL,0MOV AL,DATA1 ;取数AND AL,AL ;设ZF、SF标志JZ DONECHKSF:JS DONEINC CLADD AL,AL ;左移一位JMP SHORT CHKSFDONE: MOV DATA2,ALMOV DATA3,CLHLTCODE ENDSEND START循环控制方法:循环次数由某一指定条件是否满足来决定例3.多重循环将n个无符号字节数从小到大排序,方法是依此比较相邻两单元的数,若前小后大不交换第一轮比较n-1次,最大数沉底(高地址)第二轮比较n-2次,次大数沉到最大数上面第n-1轮比较完若在某一轮比较时没有出现交换,说明顺序已排好,不必后续比较,故设交换标志AH=1代表不交换,AH=2代表有交换DATA SEGMENTLIST DB 18,6,11,3,1,2,3,9,8,7,6 DB 111,110,99,112,115,114,113,98,96,97 COUNT EQU $-LISTDATA ENDSSTACK SEGMENT STACKSTA DW 10 DUP(?)STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSET PROC FARSTART:PUSH DSMOV AX,0PUSH AXMOV AX,DATAMOV DS,AXMOV DX,COUNT-1 ;n-1轮(外循环)EXGO:MOV CX,DX ;每轮次数(内循环)MOV AH,01H ;交换标志MOV BX,OFFSET LIST ;数据块首址INGO: MOV AL,[BX]INC BXCMP AL,[BX]JC NEXT ;数1小,不交换XCHG AL,[BX] ;数1>数2,交换DEC BXXCHG AL,[BX]INC BX ;恢复数据指针MOV AH,02H ;有交换标志NEXT: LOOP INGODEC DXJZ DONEDEC AHJNZ EXGODONE: RETSET ENDPCODE ENDSEND START(四)子程序结构基本要求:① 子程序的开始(入口处)应给予一个标号,结束处有返回指令② 通用子程序要说明入口条件(入口参数)和出口条件(出口参数)③ 调用子程序要注意保护现场和恢复现场调用—返回的堆栈操作:CALL target ;段内SPSP-2,[SP+1,SP] IP,IPIP+disp段间SPSP-2,[SP+1,SP] CS,CSsegSPSP-2,[SP+1,SP] IP,IPoffsetRET ;段内IP [SP+1,SP],SPSP+2;段间IP [SP+1,SP],SPSP+2CS [SP+1,SP],SPSP+2RET n ;如上操作后SPSP+n·子程序入口标号应说明距离属性·对于一个FAR过程,过程初必须先保护程序段前缀中的中断指令INT 20H 的断点地址(DS:0000),它是一个程序正常结束退出的中断处理程序例1.将内存200H单元开始的一个五字节十六进制数显示出来(低位在低地址)DATA SEGMENTORG 200HNUM DB 9AH,78H,56H,34H,12HDATA ENDSSTACK SEGMENTSTA DB 20 DUP(?)TOP EQU LENGTH STASTACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTART:MOV AX,DATAMOV DS,AXMOV BX,5MOV AX,STACKMOV SS,AXMOV SP,TOPMOV SI,OFFSET NUMNEXT: MOV DH,[SI+BX-1] ;(不用AL,因调用MOV DL,DH ; display返回时DL→AL)MOV CL,4ROL DL,CLAND DL,0FHCALL DISPLAYMOV DL,DHAND DL,0FHCALL DISPLAYDEC BXJNZ NEXTMOV AX,4C00HINT 21HDISPLAY PROC NEARADD DL,30HCMP DL,3AHJB OKADD DL,07H;(如果DL=3AH,3AH+7=41H是‘A’)OK: MOV AH,02HINT 21HRET。

汇编gt指令用法

汇编gt指令用法

汇编gt指令用法GT是一个汇编指令,用于比较两个数的大小,其功能类似于高级语言中的“大于”(“>”)运算符。

本文将介绍GT指令的用法及其实现方法。

GT指令的语法格式如下:GT reg1, reg2, dest其中,reg1和reg2表示要比较的两个数,dest表示比较结果的存放地址。

GT指令将比较reg1和reg2的值,并将比较结果存储到dest中。

如果reg1的值大于reg2的值,那么dest中存储的值为1;否则,存储的值为0。

举个例子,假设我们要比较两个数10和5,将比较结果存储到寄存器ax中,可以使用以下代码实现:mov ax, 10 ; 将10存储到ax中cmp ax, 5 ; 比较ax和5的大小jg greater ; 如果ax>5,跳转到greater标签处mov ax, 0 ; 如果ax<=5,将0存储到ax中jmp end ; 跳出比较过程greater:mov ax, 1 ; 如果ax>5,将1存储到ax中end:在上面的例子中,我们使用了cmp指令来比较ax和5的大小,然后根据比较结果使用了jg指令和jmp指令进行跳转。

如果ax>5,则跳转到greater标签处,否则跳转到end 标签处。

在greater标签处,我们将1存储到ax中,表示ax>5;在end标签处,我们将0存储到ax中,表示ax<=5。

这个例子说明了如何利用GT指令来实现比较运算。

在实际的程序中,可能需要比较多个数的大小。

如果我们按照上面的方法来比较所有的数,那么代码会非常冗长。

为了简化代码,我们可以使用条件跳转指令(如jg、jl、je 等)来实现GT指令的功能。

举个例子,如果我们要比较三个数a、b、c中的最大值,可以使用以下代码实现:在上面的例子中,我们首先比较a和b的大小,并将较大的值存储到ax中;然后比较ax和c的大小,并将最大的值存储到ax中。

由于GT指令本身是不支持多个数比较的,因此我们需要借助条件跳转指令来实现。

实用文库汇编之C语言指令表与符号表

实用文库汇编之C语言指令表与符号表

作者:于椅上作品编号:785632589421G 101创作日期:2020年12月20日实用文库汇编之C语言指令表与符号表编译指令://—单行注解;/*多行注解*/基本数据类型(int,float,double,char,void)用户自定义数据类型格式t y p e d e f s t r u c t{数据类型变量序列1;数据类型变量序列1;...}自定义数据类型的名称;保留字_a t_,a l i e n,b d a t a,b r e a k,b i t,c a s e,c h a r,c o d e,c o m p a c t ,c o n s t,c o n t i n u e,d a t a,d e f a u l t,d o,d o u b l e,f a r,e l s e,e n u m,e x t e r n,f l o a t,f o r,g o t o,i f,f u n c u s e d,i d a t a,i n t,i n l i n e,i n t e r r u p t,l a r g e,l o n g,p d a t a,_p r i o r i t y_,r e e n t r a n t,r e t u r n,s b i t,s f r,s f r16,s h o r t,s i g e n d,s i z e o f,s m a l l,s t a t i c,s t r u c t,s w i t c h c_t a s k_,t y p e d e f,u s i n g,u n i o n,u n s i g n e d,v o i d,v o l a t i l e,w h i l e,x d a t a常量表示法-----------------------------------------------------运算符-----------------------------------------------------算术运算比较运算比较运算结果是个布尔值既。

汇编语言设计-算术运算指令

汇编语言设计-算术运算指令

N
传完否?
JNZ AGAIN ;CX≠0,循环
Y
结束

8086算术运算指令可用的BCD码有两种:
ⅰ、组合BCD码:一个字节表示2位BCD码
ⅱ、非组合BCD码:一个字节只用低4位表示1位BCD 码, 高4位为0(无意义)。
例:设(AL)=35,(BL)=39 35H 0011 0101
执行 ADD AL,BL
JNS NEXT
;若SF=0,则(AX)>(BX),转NEXT
XCHG AX,BX ;否则交换
NEXT:HLT
Ⅱ、两负数比较,即A<0,B<0:两负数相减,结果也不会溢出,
仍可用符号标志,若SF=0,则A>B;反之若SF=1,则A<B。
Ⅲ、两异号数比较。当A>0,B<0时,当然的结果应该是A>B,
而且有SF=0。
格式:ADD dest,src ;dest←dest+src
功能:将源操作数与目的操作数相加,将结果送回目的操 作数。指令执行后对各状态标志均产生影响。
例:ADD CX,0F0F0H 设指令执行前(CX)=5463H
0101 0100 0110 0011
思考:
+ 1111 0000 1111 0000
LEA SI,BUF1 ;SI指向BUF1 LEA DI,BUF2 ;DI指向BUF2
取数 传送
MOV CX,100 ;CX放计数初值
AGAIN:MOV AL,[SI] ;取一字节数 MOV [DI],AL ;传送一字节数
修改地址指针 修改计数器
INC SI INC DI DEC CX
;修改地址指针 ;修改计数初值
NEG指令是对指令中的操作数取补,再将结果送回。因 对一个操作数求2的补码,相当于0减去此操作数,所以NEG 指令执行的也是减法操作。

汇编指令符号大全

汇编指令符号大全

80X86 汇编指令符号大全+、-、*、/∶算术运算符。

&∶宏处理操作符。

宏扩展时不识别符号和字符串中的形式参数,如果在形式参数前面加上一个& 记号,宏汇编程序就能够用实在参数代替这个形式参数了。

$∶地址计数器的值——记录正在被汇编程序翻译的语句地址。

每个段均分配一个计数器,段内定义的所有标号和变量的偏移地址就是当前汇编地址计数器的值。

∶操作数。

在数据定义语句中,操作数用?,其作用是分配并保留存储空间,但不存入确定的数据。

=∶等号伪指令——符号定义。

对符号进行定义和赋值,功能与 EQU相似,但允许(重复)再定义。

:∶修改属性运算符(操作符)——段操作符。

用来临时给变量、标号或地址表达式指定一个段属性(不用缺省的段寄存器),自动生成一个“跨段前缀字节”。

注意,段寄存器CS和ES不能被跨越,堆栈操作时也不能跨越SS。

;∶注释符号。

%∶特殊宏操作符,用来将其后的表达式(通常是符号常数,不能是变量名和寄存器名)转换成它所代表的数值,并将此数值的ASCII码嵌入到宏扩展中。

( )∶1.运算符——用来改变运算符的优先级别。

2.教材符号,表示括号内存储单元(或寄存器)的内容。

< >∶宏调用时用来将带间隔符(如空格,逗号等)的字符串(作为实参)括起来。

[ ]∶1.运算符。

方括号括起来的数是数组变量的下标或地址表达式。

带方括号的地址表达式必须遵循下列原则,①只有BX、BP、SI、DI这四个寄存器可在方括号内出现;②BX或BP可单独出现在各方括号中,也可以与常数、SI或DI一起出现在方括号内,但不允许BX 和BP出现在同一个方括号内;③SI和DI可以单独出现在各方括号内,也可以与常数、BP 或BX一起出现在方括号内,但不允许SI和DI出现在同一个方括号内;④一个方括号内包含多个寄存器时,它们只能作加法运算;⑤若方括号内包含基址指针BP,则隐含使用堆栈段寄存器SS提供段基址,否则均隐含使用数据段寄存器DS提供段基址。

DSP第五章 DSP的汇编指令

DSP第五章 DSP的汇编指令
M40=0时,D单元按32位运算模式,因此累加器溢出、进位、符号扩
展和移位操作都以第31比特为准。
M40=1时,D单元按40位运算模式,因此累加器溢出,进位,符号扩
展和移位操作都以第39比特为准。
BCLR M40
; Clear M40
BSET M40
; Set M40
第五章 TMS320C55x系列DSP的汇编指令
2、累加器溢出状态(ACOVx)
当AC0~AC3寄存器溢出时,目的累加器的溢出状态位ACOV0~3被置1。 以下情况会清零ACOVx位
复位; CPU执行一个跳转,条件调用,条件返回或执行一条测试ACOVx的指令; 通过BCLR指令清除; 溢出位检测受ST1_55中的M40位影响,即:
第五章 TMS320C55x系列DSP的汇编指令
(3)内置并行指令与用户自定义并行指令的混合形式 在不引起资源冲突的情况下,将隐含并行的指令按用户自定义 方式与另一条指令并行执行。例:
MPY *AR0, *CDP, AC0 ;隐含的或内置的并行指令 :: MPY *AR1, *CDP, AC1 ||MOV #5, AR1
பைடு நூலகம்
在实际编程时,只要指令满足这三条基本规则,即可写成并行
方式,然后进行编译。如果编译有错,则可参照书上详细规则进 行检测。
第五章 TMS320C55x系列DSP的汇编指令 5.4 TMS320C55x DSP的汇编指令
TMS320C55x DSP的汇编指令按操作分为以下6类 算术运算指令 比特操作指令 一条指令的属性包括: 语法(Syntax) 执行的操作 操作数 相关的状态位 是否有并行使能位 长度(Size) 执行周期(Cycles) 在流水线(Pipeline)上的执行阶段 在哪个功能单元执行(Executed) 是否可以重复执行等

汇编语言运算符

汇编语言运算符

汇编语言运算符汇编语言是一种低级语言,直接操作计算机硬件的指令和数据。

运算符是汇编语言中常用的操作符号,用于执行各种数学和逻辑运算。

本文将介绍汇编语言中常见的运算符及其使用方式。

一、算术运算符1. 加法运算符(ADD):将两个数相加,并将结果存储在目标操作数中。

例如,ADD AX, BX表示将寄存器AX和BX中的值相加,结果存储在AX中。

2. 减法运算符(SUB):将第二个操作数的值从第一个操作数中减去,并将结果存储在目标操作数中。

例如,SUB AX, BX表示将寄存器BX的值从AX中减去,结果存储在AX中。

3. 乘法运算符(MUL):将两个数相乘,并将结果存储在目标操作数中。

例如,MUL AX, BX表示将寄存器AX和BX中的值相乘,结果存储在AX中。

4. 除法运算符(DIV):将第一个操作数的值除以第二个操作数,并将商存储在目标操作数中。

例如,DIV AX, BX表示将AX的值除以BX,商存储在AX中,余数存储在DX中。

二、逻辑运算符1. 与运算符(AND):对两个操作数进行逻辑与运算,并将结果存储在目标操作数中。

例如,AND AX, BX表示将寄存器AX和BX中的值进行逻辑与运算,结果存储在AX中。

2. 或运算符(OR):对两个操作数进行逻辑或运算,并将结果存储在目标操作数中。

例如,OR AX, BX表示将寄存器AX和BX中的值进行逻辑或运算,结果存储在AX中。

3. 非运算符(NOT):对一个操作数进行逻辑非运算,并将结果存储在目标操作数中。

例如,NOT AX表示对寄存器AX的值进行逻辑非运算,结果存储在AX中。

4. 异或运算符(XOR):对两个操作数进行逻辑异或运算,并将结果存储在目标操作数中。

例如,XOR AX, BX表示将寄存器AX和BX 中的值进行逻辑异或运算,结果存储在AX中。

三、移位运算符1. 左移运算符(SHL):将一个操作数的二进制位向左移动指定的位数,并将结果存储在目标操作数中。

汇编语言基础

汇编语言基础

汇编语言基础(一)汇编语言的基本语法1.字符集(1)英文字符:A~Z a~z(2)数字字符:0~9(3)算术运算符:+ - * /(4)关系运算符:<=>(5)分隔符: ,: ;() [] ’ (空格) TAB(6)控制符: CR(回车) LF(换行) FF(换页)(7)其他字符: & - (下划线)?. $ @ ! %在用汇编语言编写程序时,程序中的指令助记符、标识符、运算符、分隔符等,均应由上述字符集中的字符组成。

使用其他字符均为非法字符,8086/8088宏汇编程序不能识别和翻译。

2.标识符标识符在程序中用作变量名、常量名、记录名、段名等。

规定如下:(1)标识符由1~31个字符组成,打头的字符必须是字母、?(问号)、@和 - (下划线)。

(2)从第2个字符开始。

组成标识符的字符可以是字母、数字、@、?、 - 等,不能使用其他字符。

3.保留字8086/8088中指令助记符、伪指令、寄存器名、表达式运算符及属性操作符等都是系统的保留字。

保留字不能用作标识符。

4.语句80x86宏汇编语言有三种基本语句,即指令语句、伪指令语句和宏指令语句。

指令语句对应着机器的一种操作,汇编时产生一个目标代码;伪指令是为汇编程序提供编译信息、指标汇编程序做某些操作的语句,它不产生目标代码,与机器的操作无关。

一条语句在源程序中一般只占一行,长度超过一行时必须用续行符号&。

5.汇编语言程序结构用汇编语言编写的源程序,在结构上具有以下特点:(1)由若干逻辑段组成,各逻辑段由伪指令语句定义和说明。

(2)整个源程序以END伪指令结束。

(3)每个逻辑段由语句序列组成,各语句可以是指令语句、伪指令语句、宏指令语句、注释语句或空行语句。

(二)汇编语言和汇编处理过程计算机完成汇编任务是由一个称为汇编程序(Assembler)软件工具实现的。

汇编程序是一种系统软件。

汇编程序加工的对象是汇编语言程序,称为源程序,而汇编后产生的结果是机器语言程序,称为目标程序。

SAL SHL SOL汇编语言指令汇总

SAL SHL SOL汇编语言指令汇总

SAL SHL SOL汇编语言指令汇总1.算术运算符ADC:带进位加法ADD:二进制数加法DEC:减一DIV:无符号数除法IDIV:带符号数(整数)除法IMUL:带符号数(整数)乘法INC:加一MUL:无符号数乘法NEG:求补SBB:带借位减法SUB:二进制减法XADD:交换并相加2.ASCII-BCD转换AAA:加后ASCII调整AAD:除前ASCII调整AAM:乘后ASCII调整AAC:减后ASCII调整DAA:加后十进制调整DAS:减后十进制调整3.移位RCL:带进位循环左移RCR:带进位循环右移ROL:循环左移ROR:循环右移SAL:算术左移SAR:算术右移SHL:逻辑左移SHR:逻辑右移SHLD:双精度左移SHRD:双精度右移4.比较BSF/BSR:位扫描BT/BTC/BR/BB:位测试CMP:比较CMPSN:串比较CMPXCHG:比较交换CMPXCHG8B:比较并换?lt;br>TEST:测试位5.数据传送LDS:装如数据段寄存器LEA:装入有效地址LES:装入附加段寄存器LODS:从串取LSS:装入堆栈段寄存器MOV:传送数据MOVS:串传送MOVSX:带符号扩展传送MOVZX:带零扩展传送STOS:存入串XCHG:交换XLAT:换码6.标志操作CLC:清除位标志CLD:清除方向标志CLI:清除中断标志CMC:进位标志求反LAHF:标志送AH POPF:标志出栈PUSHF:标志进栈SAHF:AH送标志寄存器STC:进位标志置1 CTD:方向标志置1 STI:中断标志置17.输入/输出IN:输入字节或字INSN:串输入OUT:输出字节或字OUTSN:穿输出8.逻辑操作AND:逻辑与NOT:逻辑非OR:逻辑或XOR:异或9.循环LOOP:循环直到完成LOOPE:相等时循环LOOPZ:为零是循环LOOPNE:不相等时循环LOOPPNZ:不为零是循环LOOPPNEW:不相等时循环LOOPNZW:不为零时循环。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
POPA把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈.
PUSHAD把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈.
POPAD把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈.
BSWAP交换32位寄存器里字节的顺序
XCHG交换字或字节.(至少有一个操作数为寄存器,段寄存器不可作为操作数)
1.2 BTC(Bit Test And Complement),测试并取反用法和规则与BT是一样,但在功能有些不同,它不但将要测试位的值送往CF,并且还将该位取反。
1.3 BTR(Bit Test And Reset),测试并复位,用法和规则与BT是一样,但在功能有些不同,它不但将要测试位的值送往CF,并且还将该位复位(即清0)。
MOVZX reg16,r/m8 ; o16 0F B6 /r [386]
MOVZX reg32,r/m8 ; o32 0F B6 /r [386]
MOVZX reg32,r/m16 ; o32 0F B7 /r [386]
PUSH把字压入堆栈.
POP把字弹出堆栈.
PUSHA把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈.
JB/JNAE小于转移.
JBE/JNA小于或等于转移.
以上四条,测试无符号整数运算的结果(标志C和Z).
JG/JNLE大于转移.
JGE/JNL大于或等于转移.
JL/JNGE小于转移.
JLE/JNG小于或等于转移.
以上四条,测试带符号整数运算的结果(标志S,O和Z).
JE/JZ等于转移.
JNE/JNZ不等于时转移.
XOR异或运算.
NOT取反.
TEST测试.(两操作数作与运算,仅修改标志位,不回送结果).
SHL逻辑左移.
SAL算术左移.(=SHL)
SHR逻辑右移.
SAR算术右移.(=SHR)
ROL循环左移.
ROR循环右移.
RCL通过进位的循环左移.
RCR通过进位的循环右移.
以上八种移位指令,其移位次数可达255次.
1.4 BTS(Bit Test And Set),测试并置位,用法和规则与BT是一样,但在功能有些不同,它不但将要测试位的值送往CF,并且还将该位置位(即置1)。
1.5 BSF(Bit Scan Forward),顺向位扫描,指令格式:BSF OPRD1,OPRD2,功能:将从右向左(从最低位到最高位)对OPRD2操作数进行扫描,并将第一个为1的位号送给操作数OPRD1。操作数OPRD1,OPRD2可以是16位或32位通用寄存器或者存储单元,但OPRD1和OPRD2操作数的长度必须相等。
BTS EAX,8;CF=0,EAX=12345778H
BSF AX,BX;AX=0
BSR AX,BX;AX=15
BT WORD PTR [AA],4;CF=1,[AA]的内容不变
BTC WORD PTR [AA],4;CF=1,[AA]=1223H
BTR WORD PTR [AA],4;CF=1,[AA]=1223H
CMPXCHG比较并交换操作数.(第二个操作数必须为累加器AL/AX/EAX )
XADD先交换再累加.(结果在第一个操作数里)
XLAT字节查表转换.
── BX指向一张256字节的表的起点, AL为表的索引值(0-255,即
0-FFH);返回AL为查表结果. ( [BX+AL]->AL )
2.输入输出端口传送指令.
AAS减法的ASCII码调整.
DAS减法的十进制调整.
MUL无符号乘法.
IMUL整数乘法.
以上两条,结果回送AH和AL(字节运算),或DX和AX(字运算),
AAM乘法的ASCII码调整.
DIV无符号除法.
IDIV整数除法.
以上两条,结果回送:
商回送AL,余数回送AH, (字节运算);
或商回送AX,余数回送DX, (字运算).
LOCK封锁总线.
NOP空操作.
STC置进位标志位.
CLC清进位标志位.
CMC进位标志取反.
STD置方向标志位.
CLD清方向标志位.
STI置中断允许位.
CLI清中断允许位.
六、伪指令
DW定义字(2字节).
PROC定义过程.
ENDP过程结束.
SEGMENT定义段.
ASSUME建立段寄存器寻址.
ENDS段结束.
IN I/O端口输入. (语法: IN累加器, {端口号│DX} )
OUT I/O端口输出. (语法: OUT {端口号│DX},累加器)
输入输出端口由立即方式指定时,其范围是0-255;由寄存器DX指定时,
其范围是0-65535.
3.目的地址传送指令.
LEA装入有效地址.
例: LEA DX,string ;把偏移地址存到DX.
1.7举个简单的例子来说明这6条指令:
AA DW 1234H,5678H
BB DW 9999H,7777H
MOV EAX,12345678H
MOV BX,9999H
BT EAX,8;CF=0,EAX保持不变
BTC EAX,8;CF=0,EAX=12345778H
BTR EAX,8;CF=0,EAX=12345678H
Z标志用来控制扫描或比较操作的结束.
MOVS串传送.
( MOVSB传送字符. MOVSW传送字. MOVSD传送双字. )
CMPS串比较.
( CMPSB比较字符. CMPSW比较字. )
SCAS串扫描.
把AL或AX的内容与目标串作比较,比较结果反映在标志位.
LODS装入串.
把源串中的元素(字或字节)逐一装入AL或AX中.
2.8 WAIT,等待BUSY引脚为高。
2.9 LOCK,封锁前缀可以锁定其后指令的操作数的存储单元,该指令在指令执行期间一直有效。在多任务环境中,可以用它来保证独占其享内存,只有以下指令才可以用LOCK前缀:
汇编语言的运算符
下面我们学习一些汇编语言常用的运算符:
算术运算符
算术运算符有+、-、*、/和MOD。其中MOD是取余。算术运算符可用于数字表达式或地址表达式中。
处理器控制指令主要是用来设置/清除标志,空操作以及与外部事件同步等。
2.1 CLC,将CF标志位清0。
2.2 STC,将CF标志位置1。
2.3 CLI,关中断。
2.4 STI,开中断。
2.5 CLD,清DF=0。
2.6 STD,置DF=1。
2.7 NOP,空操作,填补程序中的空白区,空操作本身不执行任何操作,主要是为了保持程序的连续性。
( LODSB传送字符. LODSW传送字. LODSD传送双字. )
STOS保存串.
是LODS的逆过程.
REP当CX/ECX<>0时重复.
REPE/REPZ当ZF=1或比较结果相等,且CX/ECX<>0时重复.
REPNE/REPNZ当ZF=0或比较结果不相等,且CX/ECX<>0时重复.
REPC当CF=1且CX/ECX<>0时重复.
LDS传送目标指针,把指针内容装入DS.
例: LDS SI,string ;把段地址:偏移地址存到DS:SI.
LES传送目标指针,把指针内容装入ES.
例: LES DI,string ;把段地址:偏移地址存到ES:DI.
LFS传送目标指针,把指针内容装入FS.
例: LFS DI,string ;把段地址:偏移地址存到FS:DI.
移位一次时,可直接用操作码.如SHL AX,1.
移位>1次时,则由寄存器CL给出移位次数.如MOV NhomakorabeaCL,04
SHL AX,CL
四、串指令
DS:SI源串段寄存器:源串变址.
ES:DI目标串段寄存器:目标串变址.
CX重复次数计数器.
AL/AX扫描值.
D标志0表示重复操作中SI和DI应自动增量; 1表示应自动减量.
BTR DWORD PTR [BB],12;CF=1,[BB]=76779999H
BTS DWORD PTR [BB],12;CF=1,[BB]=77779999H
BSF DWORD PTR [BB],12;[BB]=0
BSR DWORD PTR [BB],12;[BB]=31(十进制)
2.处理器控制指令
END程序结束.
七、位操作指令,处理器控制指令
1.位操作指令,8086新增的一组指令,包括位测试,位扫描。BT,BTC,BTR,BTS,BSF,BSR
1.1 BT(Bit Test),位测试指令,指令格式:
BT OPRD1,OPRD2,规则:操作作OPRD1可以是16位或32位的通用寄存器或者存储单元。操作数OPRD2必须是8位立即数或者是与OPRD1操作数长度相等的通用寄存器。如果用OPRD2除以OPRD1,假设商存放在Divd中,余数存放在Mod中,那么对OPRD1操作数要进行测试的位号就是Mod,它的主要功能就是把要测试位的值送往CF,看几个简单的例子:
LOOPNE/LOOPNZ CX不为零且标志Z=0时循环.
JCXZ CX为零时转移.
JECXZ ECX为零时转移.
4>中断指令
INT中断指令
INTO溢出中断
IRET中断返回
5>处理器控制指令
HLT处理器暂停,直到出现中断或复位信号才继续.
WAIT当芯片引线TEST为高电平时使CPU进入等待状态.
ESC转换到外处理器.
LGS传送目标指针,把指针内容装入GS.
例: LGS DI,string ;把段地址:偏移地址存到GS:DI.
LSS传送目标指针,把指针内容装入SS.
相关文档
最新文档