汇编语言学习-基础篇2
来源:互联网 发布:go语言http json数据 编辑:程序博客网 时间:2024/06/06 00:09
1.8086模式下的指令介绍
在介绍各个指令之前,需要说明的是当指令中的操作数带有SI, DI, BX时,如果不特别指定,则默认的使用数据段DS,如果操作数带有BP,则默认的使用堆栈段SS。
下面说的8086下的指令格式以及分类
指令表示的一般格式为:【标签:】 指令助记符 【操作数1 【操作数2】 】 【;注释】,标签的使用取决于程序的实现逻辑(标签本身不是指令),注释取决于编码人员的习惯。而指令中可以有两个操作数,例如MOV AX [SI] ; 也可以有一个操作数,例如PUSH AX; 也可以没有操作数,例如字转换指令CWD。指令按其功能特点可以分为如下六类:
1.数据传送指令
1.传送指令, 格式: MOV DST, SRC 。此指令把源操作数的一个字或字节送至目的操作数DST。数据传送指令可实现以下功能:
1.CPU内部寄存器之间的数据传送,例如:MOV AH, AL。
2.立即数送至通用寄存器或存储器单元,例如:MOV AL. 3。
3.寄存器与存储器之间的数据传送,例如:MOV BH, [SI]。
2.交换指令,格式:XCHG OPPD1, OPPD2。此指令时把操作数OPPD1的内容与操作数OPPD2的内容交换,例如:XCHG AL, AH。
3.地址传送指令,如下:
1.传送有效地址指令LEA,格式:LEA REG, OPRD。该指令把操作数OPRD的有效地址传送到操作数REG,OPRD必须是存储器操作数,REG必须是通用寄 存器。
例如:LEA DX, [BX + 3],即把BX + 3的值传送给DX
2.指令LDS,格式:LDS REG, OPRD。该指令把操作数OPRD中所含32位地址指针的段值部分传送到数据寄存器DS,把偏移量部分传送值寄存器REG。
例如:LDS DI, [BX],即把BX对应的段值传送给DX,BX的值传送给DI。
3.指令LES,格式:LES REG, OPRD。该指令把操作数OPRD所含32位地址指针的段值部分送到附加段寄存器ES,偏移部分传送给REG。
2.堆栈操作指令
堆栈的作用主要是保护现场和返回地址、保护寄存器内容、参数传递、存储局部变量。堆栈寄存器有两个,压栈PUSH,出栈POP,详细如下:
1.压栈PUSH,格式:PUSH SRC。该指令把源操作数压入栈。例如:PUSH SI。
2.出栈POP, 格式: POP DST。该指令从栈顶弹出一个字数据到目的操作数DST。例如:POP [SI]。
3.标志操作指令
标志指令包括四条标志位寄存器传送指令和七条设置或清除标志位的指令,具体如下:
1. 标志传送指令,
1.指令LAHF,格式:LAHF。LAHF采用固定寻址方式,该指令把标志寄存器的低8位(包括SF,ZF,AF,PF,CF)传送到寄存器AH的指定位,即AH需要指定的位必须与标志寄存器需要传送的位相同,如果标志寄存器的传送位为7,AH也要指定 第7位。
2.指令SAHF, 格式: SAHF。SAHF采用固定寻址方式。改指令的功能与LAHF相反,把AH低8位传送至相应标志寄存器的SF,ZF,AF,PF,CF位。
3.指令PUSHF,格式:PUSHF。该指令把标志寄存器的内容压栈,此指令不改变标志寄存器。
4.指令POPF,格式:POPF。该指令把栈顶的一个字传送到标志寄存器。
2.标志操作指令
1.清进位标志指令,格式:CLC。该指令使进位标志位0。
2.置进位标志指令,格式:STC。改指令使进位标志位1。
3.进位标志取反指令,格式:CMC。该指令使进位标志取反。
4.清方向标志指令,格式:CLD。该指令使方向标志DF为0。
5.置方向标志指令,格式:STD。该指令使方向标志DF为1。
6.清中断允许标志指令,格式:CLI。该指令使中断允许标志IF为0。
7.置中断允许标志指令,格式:STI。该指令使中断允许标志IF为1。
4.算术运算指令
1.普通加法指令,格式:ADD OPRD1, OPRD2。该指令完成两个操作数的相加,结果送至目的操作数OPRD1。例如,ADD AL, 5。
2.带进位加法指令,格式:ADC OPRD1, OPRD2。该指令完成两个操作数相加,同时还要把进位标志CF的现行值加上去,把结果送至目的操作数OPRD1。即OPRD1=OPRD1 + OPRD2 + CF。例如:ADC DX, AX。
3.加1指令,格式:INC OPRD。该指令完成对操作数OPRD加1,然后把结果送回OPRD。例如:INC AL。
4.普通减法指令,格式:SUB OPRD1, OPRD2。该指令完成两个操作数的相减,结果送至目的操作数OPRD1。例如,ADD AL, 5。
5.带进(借)位加法指令,格式:SBB OPRD1, OPRD2。该指令完成两个操作数相减,同时还要把进位标志CF的现行值减去,把结果送至目的操作数OPRD1。即OPRD1=OPRD1 - OPRD2 - CF。例如:ADC DX, AX。
6.加1指令,格式:DEC OPRD。该指令完成对操作数OPRD减1,然后把结果送回OPRD。例如:DEC AL。
7.取补指令,格式:NEG OPRD。该指令对操作数取补,即用0减去操作,再把结果送回OPRD。例如:NEG AL。
8.比较指令,格式:CMP OPRD1, OPRD2。该指令完成操作数OPRD1减去操作数OPRD2,结果不送回OPRD1,仅影响标志寄存器的某些标志位。例如:CMP SI, DI。
9.无符号数乘法指令,格式:MUL OPRD。如果OPRD为字节操作数,则使用AL中的无符号数与OPRD相乘,产生的16位结果送到AX中; 如果OPRD为字操作数,则把AX中的无符号数与OPRD相乘,产生的32位结果送到DX, AX中,DX 为高16位,AX为低16位。例如:MUL AX。
10.有符号数乘法指令,格式:IMUL OPRD。该指令把乘数和被乘数均作为有符号数,其他与MUL相同。如果乘的结果的高位部分不是低位部分的扩展,则CF=OF=1,否则CF=OF=0。例如:IMUL CL。
11.无符号数除法指令,格式:DIV OPRD。如果OPRD为字节操作数,则使用AX中的无符号数除OPRD,8位的商送到AL中; 如果OPRD为字操作数,则把DX作为高16位与AX作为低16位的无符号数除以OPRD,产生的16商送到AX中, 16位的余数送至DX中。例如:DIV CX。
12.有符号数除法指令,格式:IDIV OPRD。该指令把乘数和被乘数均作为有符号数,其他与DIV相同。例如:IDIV BX。
13.符号扩展指令(在无符号数除之前,不宜用CBW或CWD指令,一般用XOR指令清掉高8位或高16位),如下:
1.字节转换为字指令,格式:CBW。该指令把寄存器AL中的符号扩展到寄存器AH,即若AL的最高有效位为0, 则AH为0;若AL的最高有效位为1,则AH为FF。
2.字转换为双字指令,格式:CWD。该指令把寄存器AX中的符号扩展到寄存器DX。即若AX的最高有效位为0,则DX 为0;若AX的最高有效位为1,则DX为FFFF。
5.逻辑运算和移位指令
1.逻辑运算指令
1.否操作指令,格式:NOT OPRD。该指令把操作数OPRD取反,然后送回OPRD。例如:NOT AX。
2.与操作指令,格式:AND OPRD1, OPRD2。该指令对两个操作数进行按位的逻辑"与"运算,把结果送到目的操作数OPRD1。例如:AND AH DH。
3.或操作指令,格式:OR OPRD1, OPRD2。该指令对两个操作数进行按位的逻辑"或"运算,结果送至目的操作数OPRD1。例如OR AX, 8080H。
4异或操作指令,格式:XOR OPRD1, OPRD2。该指令对两个操作数进行按位的逻辑"异或"运算,结果送至目的操作数OPRD1,指令执行后CF=OF=0,通过PF,SF,ZF可以反映运算结果。例如:XOR DX, DX。
5.测试指令,格式:TEST OPRD1, OPRD2。该指令与指令AND类似,但不把结果送到操作数OPRD1中,仅影响标志位。指令执行后,标志ZF,PF和SF反映出运算结果。例如:TEST AL, BL。
2.一般移位指令
1.算术左移或逻辑左移指令,格式:SAL OPRD, m 或者SHL OPRD, m。这两条指令军事把操作数OPRD左移m位,右边补0,移出的最高位进入CF。例如:SHL AL, 1。
2.算术右移指令,格式:SAR OPRD, m。该指令使操作数右移m位,每移动一位,左边符号位保持不变,移出的最低位进入CF。例如:SAR BX , CL。
3.逻辑右移指令,格式:SHR OPRD, m。该指令使操作数右移m位,每移动一位,左边补0,移出的最低位进入CF。例如:SHR BL,1。
3.循环右移指令
1.左循环移位指令,格式:ROL OPRD, m。m或为1或为CL,每移动一位,操作数左移,其最高位移入最低位,同时最高位也移入进位标志CF。例如:ROL AH 1。
2.右循环移位指令,格式:ROR OPRD, m 。m或为1或为CL,每移动一位,操作数右移,其最低位移入最高位,同时最低位也移入进位标志CF。例如:ROR AH CL。
3.带进位左循环移位指令,格式:RCL OPRD, m。m或为1或为CL,每移动一位,操作数左移,其最高位移入,CF移入最低位。例如:RCL AH 1。
4.带进位右循环移位指令,格式:RCR OPRD, m。m或为1或为CL,每移动一位,操作数右移,其最低位移入CF,CF移入最高位。例如:RCR AH CL。
6.转移指令
1.无条件转移指令
1.无条件段内直接转移指令,格式:JMP 标签。该指令使程序无条件的从标签地址处开始执行。
例如:
NEXT: MOV AX, 1
JMP NEXT
2.无条件段内间接转移指令,格式:JMP OPRD。该指令使程序无条件转到由操作数OPRD的内容给定的目标地址处,OPRD可以是寄存器也可以是存储单元。例如:JMP CX或JMP WORD PTR [1234H]。
3.无条件段间直接转移指令,格式:JMP FAR PTR 标签。该指令使程序无条件的从标签开始的地址执行。FAR指明是段间转移。例如JMP FAR PTR EXIT ;EXIT是另一代码段的标签
4.无条件段间间接转移指令,格式:JMP OPRD。基本同无条件段内间接转移指令,但OPRD必须是双字存储单元,低字送入IP, 高字送入CS。例如:JMP DWORD PTR [1234]。
2.循环指令
1.计算循环指令,格式:LOOP 标签。该指令使寄存器CX的值减一,如果结果不等于0,则转移到标签处,否则往下执行。
例如:
NEXT: MOV AX , BX;
DEC CX
LOOP NEXT
2.等于/全零循环指令,格式:LOOPE 标签 / LOOPZ 标签。这条指令使寄存器CX减1,如果不等于0,并且ZF等于1,则转移到标签处执行。
3.不等于/非零循环指令,格式:LOOPNE 标签 / LOOPNZ 标签。该指令使CX减1,如果不等于0,并且ZF等于1,则转移到标签处执行。
3.条件转移指令,涉及的比较多就不一一说明了
- 汇编语言学习-基础篇2
- 汇编语言学习-基础篇
- 汇编语言学习笔记--基础指令篇
- 汇编语言基础学习
- 汇编语言基础2
- 汇编语言基础2
- Intel汇编语言程序设计学习-第三章 汇编语言基础-上
- Intel汇编语言程序设计学习-第三章 汇编语言基础-中
- Intel汇编语言程序设计学习-第三章 汇编语言基础-下
- 汇编语言学习笔记(2)
- 汇编语言学习笔记2
- AT&T汇编语言基础学习示例
- 汇编语言基础
- 汇编语言基础
- 汇编语言基础
- 汇编语言学习笔记--基础知识篇
- X86汇编语言学习手记(2)
- X86汇编语言学习手记(2)
- MingQQ v1.0高仿版开源了,使用WebQQ协议实现了QQ客户端基本的聊天功能...
- [C][socket]:setsockopt + raw_socket
- Standford机器学习 聚类算法(clustering)和非监督学习(unsupervised Learning)
- OpenGL屏幕二维坐标转化成三维模型坐标
- C++ 顺序栈的实现
- 汇编语言学习-基础篇2
- Spring AOP 详解
- C#操作AD及Exchange Server总结(二)
- memcache研究
- Longest Valid Parentheses (求最长有效匹配括号子串的长度)
- 20个非常棒的扁平设计免费资源
- android josn讲解及应用
- 编译ffmpeg步骤(windows&linux)
- 页面脚本(js、css等)调试技巧介绍