80*86 指令

news/2024/11/17 10:37:00/
实地址模式 + 保护虚地址模式。

1  实地址: 存储器20位物理地址;1MB;LMSW指令设置机器状态字 MSW中的PE状态,可使 80286进入保护虚地址模式。
2 保护虚地址模式:
设计用来增强 多工 和系统稳定度,像是 内存保护,分页 系统,以及硬件支援的 虚拟内存。大部分的现今 x86 操作系统 都在保护模式下运行,包含 Linux、FreeBSD、以及 微软 Windows 2.0 和之后版本

指令:

【1】 push 16位立即数 .286 ;需要在编码开头加

push -32767
push 0bh
push 'a'
masm6.0在金山快盘里有,已经可以通过ml来替代make 和 link,很方便。
【2】PUSHA
POPA
pusha 
popa
pusha 
将ax,cx,dx,bx,sp,bp,si,di压栈
popa 相反方向出栈。但是sp是所有通用寄存器弹出后,堆栈指针指向的真实的值,而不是栈中保存的值,即该指令执行后,SP+16. 
PUSHA POPA均不影响标志位
【子程序调用时非常方便】
【有符号整数乘法】
1 .
IMUL 16位寄存器, 立即数
CF为1. IMUL DX,9 

乘积范围(-32768~32767)溢出部分丢失,并置OF,
2 IMUL 16位寄存器,16位寄存器,立即数
mov byte ptr DS:[100], 11h;可以通过-d ds:64查看
                                              (100->64)

IMUL DX, DS:[100], 02h
将16位存储器操作数作为被乘数与立即数相乘,并送16位寄存器。
移位指令
mov ax, 0035h
ROL ax, 5
SHL word ptr ds:[bx], 18
8086中移位次数大于1时,需要放入cl。但80286中修改了限制,移位次数为1-31时,允许使用立即数。
支持高级语言的指令  
内存范围检查指令
.286

DATA SEGMENT

BOTTOM EQU 0
TOP EQU 19
ANS LABEL DWORD
WANS DW BOTTOM, TOP
BOFF DB TOP+1    DUP(?)                                                                  

DATA ENDS

CODE SEGMENT
ASSUME CS:CODE, DS:DATA
START:

mov si, 02h
BOUND SI, ANS
MOV DX, BOFF[SI]

INT 21H     
CODE ENDS
END START

BOUND 16位寄存器,32位存储器
大概是这个样子,但是没有调通
设置堆栈指令空间ENTER 6, 0ENTER 16位立即数, 8位立即数
16位立即数表示堆栈空间的大小,也即表示给当前过程分配多少字节的堆栈空间,8位立即数表示在高级语言内(如pascal语言)调用自身的次数,也即嵌套次数
【该指令使用BP寄存器而非SP作为栈基址】
撤销LEAVE
eg:
;调用子程序的过程,参数存入堆栈中
ENTER 4,0
MOV AX, Number1
MOV [BP-4], ax
MOV AX, Number
mov [BP-2], AX

CALL COURSE

MOV AX, [BP-4]
MOV Number1, AX
MOV AX, [BP-2]
MOV Number2, AX
LEAVE                                                                                     

... ...
COURSE PROC NEAR
PUSHA
MOV AX, [BP-4]
MOV DX, [BP-2]
...
;参数处理
...

MOV [BP-4], AX
MOV [BP-2], DX
POPA
RET

COURSE ENDP
该指令无操作数,撤销由ENTER指令建立的堆栈空间


80386增强和扩展指令:
80386是80*86系列发展中的里程碑。提供了32位寻址方式,可对32位数据直接操作。所有16位指令均可扩展为32位指令。8个32位通用寄存器:
EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI
不过他们的低16位也可以作为独立寄存器。
三种模式:
实地址模式;保护虚地址模式和虚拟8086模式。
DOS下只能运行实地址模式,可作为超高速8086芯片使用。

数据段寄存器,增加了两个FS和GS。

标志寄存器扩展到了32位,某些位没有定义。在实地址模式下有9个标志位可用,保护虚地址模式下可有13个标志位可用。扩展后的标志寄存器可称为E标志寄存器:EFR 

数据传送和扩展指令  
MOVSX 寄存器, 寄存器/存储器movsx eax, cx目的操作数可以16或者32,源可是寄存器或者存储器,位数应小于或者等于目的操作数。当少于时,目的操作数高位用源的符号位填充。【适用于有符号数的传送与扩展,不影响状态为】
MOVZX 寄存器, 寄存器/存储器 与MOVSX唯一的区别是,高位用0填充,适用于无符号数的传送与扩展
堆栈操作指令  
PUSH 32位立即数push 12h ;8
pushw 15h ;16
pushd 20h ;32                                                   
 
pushad 将所有通用寄存器EAX, ECX,....ESP,EBP,ESI,EDI顺序压入堆栈,压入的ESP值是指令执行前值,执行后,ESP-32
popad与上相反 
pushfd 将32位标志寄存器压入堆栈
popfd与pushfd相反 
地址传送指令  
LFSLFS bx, ds:[0010]如果目的操作符为16位,将4字节的存储器操作数中的低两字节送寄存器,高两字节送FS (32位时,6字节,低4字节,高2字节)
LGS 把上面的FS换为GS
LSS SS
有符号数乘法算法  
IMUL 寄存器, 寄存器/存储器 IMUL 寄存器, 寄存器/存储器 两操作数位数一致
IMUL 寄存器, 寄存器/存储器,立即数 
与286指令类似,只不过支持
32位寄存器。
符号扩展指令  
CWDE
CDQ
mov word ptr ds:[data1], -5                                                                                      
mov dword ptr ds:[data2], -7
mov ax, data1
cwde
mov eax, data2
cdq
  • al符号位到ah:cbw
  • ax到dx:cwd
  • ax到eax cwde
  • eax-> edx: cdq 使之成为64位有符号数
SHLDmov ax, 8321h
mov dx, 5678h
shld ax, dx, 1
shld ax, dx, 2
SHLD 寄存器/存储器, 寄存器, CL/立即数
第一操作数左移若干位,空出位用第二操作数高位部分填充(第二操作数不变),
SHRDmov ax, 4bo2h
mov bx, 6040h
shrd ax, bx, 7
相反(右,低)
位操作指令  
BT BT [bx],cx
jc swhereBT

===
mov ax, [bx]
test ax, 10h
jnz swhere
BT 寄存器/存储器地址, 寄存器/立即数
第一寄存器(16/32)指定被测试对象,第二操作数指定要测试的位(从左往右数)
然后把被测位值不变放入cf
BTC BT指令基础上,将其取反
BTR BT指令基础上,将其清零
BTS BT指令基础上,将其置1
位扫描指令 用于找出reg或者memory中第一个或者最后一个是1的位,可用来检查是否为0
BSFmov ax, 0
bsf ax, cx

mov eax, 01234567h
bsr ecx, eax
bsf ax, cx
对第二操作数从最低到最高搜索,第一个扫描的1的位号送第一操作数,且使zf为0,若第二操作数均为0,zf=1.
BSR 从最高到最低。
条件设置指令 80386特有的指令用于测试指定标志位状态
SETSETZ Al
SETNC BYTE PTR ds:[BX]
;当zf=1, 则(al)=1, else =0
; 当cf=0, 则bx所指字节单元为1

80486 与386差别不大,只增加个别指令:


字节交换指令 
BSWAP 寄存器将32位寄存器以字节为单位高低字节交换
互换并相加指令 
XADD 寄存器/存储器, 寄存器将两操作数互换,并将之和放入第一个操作数
比较并交换指令 
CMPXCHG 寄存器/存储器, 寄存器 将第一操作数内容与对应长度的累加器比较,相等zf=1,并将第二操作数送第一操作数;否则zf=0,将第一个操作数送累加器。
Cache管理指令 
INVDst:整个片内Cache无效
WBINVD写回并使Cache无效指令, 该指令功能与INVD相似
INVLPG使TLB无效


Pentium 新增指令



8字节比较交换指令cmpxchg8b将edx:eax中的8字节与制定存储器操作数中8字节比较,相等->zf=1, 且ecx:ebx送存储器;否则zf=0,将制定的8字节存储器操作数送edx:eax
处理器特征识别指令CPUID根据EAX中的参数,将处理器说明信息送EAX,特征标志字送EDX
读时间标记计数器指令RDTSC将pentium中64位时间标记计数器高32送EDX,低32送EAX
读模型专用寄存器指令RDMSRECX对应的模型专用寄存器->edx:eax
写模型专用寄存器指令WRMSPedx:eax->ECX对应的模型专用寄存器
































http://www.ppmy.cn/news/578849.html

相关文章

手机号码格式化得到带86和不带86的号码

/*** 得到不带86开头的号码* * param phoneNumber* return*/ public static String getNoWith86Number(String number) {String regular number;if (StringUtils.isNotBlank(regular)) {// 去掉号while(regular.startsWith("")) {regular regular.substring(1);}//…

leetcode 86.分割链表

leetcode 86.分割链表 题目描述 给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前。 你应当保留两个分区中每个节点的初始相对位置。 示例: 输入: head 1->4->3->2->5->2, x 3 输出: 1…

php 手机号 去掉86,手机号前面的+86是什么意思

手机号前面的86是指中国的国际区号,在国内拨打国内手机,加上“86”和不加是一样的;而国际电话区号,即国际电信联盟根据“E.164”标准分配给各国的代码;所有的号码都是前缀号,也就是说这些号码是用来“拨到”…

德科一星题86

给定一个射击比赛成绩单,包含多个选手若干次射击的成绩分数,请对每个选手按其最高三个分数之和进行降序排名,输出降序排名后的选手id序列 条件如下 1. 一个选手可以有多个射击成绩的分数,且次序不固定 2. 如果一个选手成绩…

Day 86

_Spring技术setter注入 思考:像一个类中传递数据的方式有几种? 普通方法(set方法)构造方法 思考:依赖注入描述了在容器中建立bean与bean之间的联系关系,如果bean运行需要的是数字或是字符串呢?…

70--86

70 回文数 #include<stdio.h> #include<stdlib.h> #include<string.h> //将n进制转化为10进制整数 int trans(char str[],int n,int len){int i,sum,x;sum0;x1;for(ilen-1;i>0;i--){sum(str[i]-0)*x;x*n;}return sum; } //判断字符串是否回文 int huiw…

X86-64与x86-32

参考链接http://www.admin10000.com/document/3676_2.html x86&#xff0c;或8086是Intel首先开发制造的一种微处理器体系结构的泛称&#xff0c;包括8086、80186、80286、80386以及80486等。 因此其架构被称为“x86”。由于数字并不能作为注册商标&#xff0c;现在Intel把x86-…

崩坏3区号+86_手机号码前的“+86”是什么意思?

原标题&#xff1a;手机号码前的“86”是什么意思&#xff1f; 不知道大家发现过这样一个现象没有&#xff0c;有时候收到的短信的手机号码前有会“86”字样。这究竟是什么意思呢&#xff1f;直接拨打过去会不会有额外收费呢&#xff1f; 今天&#xff0c;蜗牛君就来为大家揭秘…