汇编指令简单指令简介

计算机是通过执行指令来处理各种数据的。为了指出数据的来源、操作结果的去向及所执行的操作,一条指令必须包含下列信息:

1)操作码。它具体说明了操作的性质及功能。一台计算机可能有几十条至几百条指令,每一条指令都有一个相应的操作码,计算机通过识别该操作码来完成不同的操作。

2)操作数的地址。CPU通过该地址就可以取得所需的操作数。

3)操作结果的存储地址。把对操作数的处理所产生的结果保存在该地址中,以便再次使用。

4)下条指令的地址。

一条指令实际上包括两种信息即操作码和地址码。操作码(OperationCode,OP)用来表示该指令所要完成的操作(如加、减、乘、除、数据传送等),其长度取决于指令系统中的指令条数。地址码用来描述该指令的操作对象,它或者直接给出操作数,或者指出操作数的存储器地址或寄存器地址(即寄存器名)。

指令包括操作码域和地址域两部分。根据地址域所涉及的地址数量,常见的指令格式有以下几种。

①三地址指令:一般地址域中A1、A2分别确定第一、第二操作数地址,A3确定结果地址。下一条指令的地址通常由程序计数器按顺序给出。

②二地址指令:地址域中A1确定第一操作数地址,A2同时确定第二操作数地址和结果地址。

③单地址指令:地址域中A 确定第一操作数地址。固定使用某个寄存器存放第二操作数和操作结果。因而在指令中隐含了它们的地址。

零地址指令:在堆栈型计算机中,操作数一般存放在下推堆栈顶的两个单元中,结果又放入栈顶,地址均被隐含,因而大多数指令只有操作码而没有地址域。

⑤可变地址数指令:地址域所涉及的地址的数量随操作定义而改变。如有的计算机的指令中的地址数可少至 0个,多至6个。

 

mov指令解析

列如 mov  ax,cx 89c8   1000 1001 1100 1000

Xxxx xxxx(前八位表示指令) xx(表寻址方式) xxx(操作数2 bx)xxx(操作数1 ax)

表寻址方式:

11表示两个寄存器  后面跟着两个操作数   其他的和后面三位配合表示寻址方式

00 表示内存到寄存器

01 表示内存加寄存器+16位

10 表示内存到寄存器+64位

 

数据传送指令

Mov 无法内存到内存的传送

一般传送都需要一个为寄存器

Mov al byte ptr ds[200h]

告诉编译器区多大

Mov ax ds[200H]

必须明确寄存器的位置

 

Xchg  两数交换

Xchg axbx

 

换码指令

Xlat(等价于下标寻址)

Table db a , b,c

Mov bxoffset Table

Mov al0

Xlat   al= 61H

 

为什么要入栈,寄存器不够用

Push  入栈  

Pop  出栈

假设栈顶为1000h  栈的位置就是0ffe   00 00 两个字节用作传参

站必须在模16的位置

  Sub sp2

Push  ax =  mov bx , sp

  Mov [bx],ax

 

    Mov bx, sp

Pop  ax =》   mov ax ,[bx]

  Add sp ,2

 

程序为了兼容,执行最后保存环境

Push axpop  ax

Pushf popf

保存标志恢复标志

 

Lahf  加载ahflag   读取

Sahf  存储ahflag   写入

只能修改低位  重要标志位都在低位

 

Lea 地址传送(用来做运算块)

多数用于加法和乘法

Lea axds[bx + 200h];ax = bx + 200h

Lea axds[bx + 200h*8];ax = bx + 200h*8

 

Les  切换段寄存器  es

Lds 切换段寄存器 ds

 

In  out指令  特权指令

可以控制地址总线的输入和输出

现在的系统都已经禁止此命令

 

 

 

复杂指令集 inter  amd

精简指令集  arm

 

分配段控件

Debug调试器中

Mov ax,1000

Mov ds, ax

Mov es, ax (将数据和附加数据段放在一起)

可以分配其他空间,但是代码段是程序一开始就分配好的,改变不了,改变了后,系统会发现对应的地方无效操作码系统会崩

无法控制代码加载到内存的位置,所以将内存分段交给操作系统。

可执行文件 (executable file) 指的是可以由操作系统进行加载执行的文件。在不同的操作系统环境下,可执行程序的呈现方式不一样。

 Test指令

Test ax,  8000h    ; 与ax做与运算 ax的值不变

Test ax ,  ax  判断是否为零   指令周期最快

Test ax ,  1 ;判断标志位   影响 zf 标志位

 

Rol 左循环位移高位放到cf 和最低位

Ror 右循环位移低位放到高位和cf

 

mov  ax  ,  0ffeeh

mov  cl   ,  8  (次数)

rol   ax   ,  cl   ;结果  ax =  0eeffh

 

带进位的循环移位 32位的移位  将高位放在cf中寄存

Rcl带进位的左循环移位

Rcr带进位的右循环移位

32位移位

Shl ax,1

Rcl ax, 1

Shr ax,1

Rcr ax1

 

 

压缩到不压缩不压缩到压缩

Ax = 00ffh     ax= 0f0fh

And al,0fhAxd al,0fh

Mov ah,al Shl ah,4

And ah,0f0hOr al,ah

Shl ah,4

 

串操作指令

Cld指令后   df = 0  地址加    df方向标志位

STD,将方向标志位DF置1

Movs 把字节操作数从源地址传送到目的地址

Mov si ,offset SI

Mov di ,offset DI

Mov cx,4

;没有rep指令 一般都是repz

Repz    2个周期指令

Movsb拷贝一个字节

Movsw拷贝两个字节  在后面继续拷贝  

 

串存储STOS

ALAX数据传送至目的地址

STOSB    字节串存储:ES:[DI]←AL

STOSW   字串存储:ES:[DI]←AX

 

串读取LODS 用于比较

把指定主存单元的数据传送给ALAX

LODSB    字节串读取:AL←DS:[SI]

LODSW  字串读取:AX←DS:[SI]

 

串比较CMPSmemcpy

将主存中的源操作数减去至目的操作数,以便设置标志,进而比较两操作数之间的关系

CMPSB  字节串比较:DS:[SI]ES:[DI]

CMPSW字串比较:DS:[SI]ES:[DI]

 

串扫描SCASstrlen

AL/AX减去至目的操作数,以便设置标志,进而比较AL/AX与操作数之间的关系

SCASB字节串扫描:ALES:[DI]

SCASW     字串扫描:AXES:[DI]

 

REP重复前缀指令

REP每执行一次串指令,CX1

直到CX0,重复执行结束

REP前缀可以理解为:当数据串没有结束(CX≠0),则继续传送

 

REPZ每执行一次串指令,CX1相等重复

(需要将并判断ZF是否为0

cx走完)只要CX0ZF0,重复执行结束

 

REPNZ          每执行一次串指令,CX1不相等重复

cx可以     并判断ZF是否为1

提前结束)     只要CX0ZF1,重复执行结束

 

无条件转移指令

JMP/Jcc/LOOP  CALL/RET

 

JMP指令分成4种类型:

⑴  段内转移、直接寻址

⑵  段内转移、间接寻址

⑶  段间转移、直接寻址

⑷  段间转移、间接寻址

 

段内转移  同一段中跳转  

汇编中没有 jmp TABLE(标号)  是宏编译器帮忙识别添加short near

Jmp又称伪指令

 

段内转移——近转移(nearjmp  near ptr TABLE( 标号 )e9表示跳转

在当前代码段64KB范围内转移( ±32KB范围)

不需要更改CS段地址,只要改变IP偏移地址

 

段内转移——短转移(shortjmp  short  TABLE( 标号 ) eb表示跳转

转移范围可以用一个字节表达,在段内-128~+127范围的转移

 

段间转移  不同段相互跳转操作

jmp  far  ptr  TABLE( 标号 )ea表示跳转 前四个表ip 后四个表段  

段间转移——远转移(far

从当前代码段跳转到另一个代码段,可以在1MB范围

需要更改CS段地址和IP偏移地址

目标地址必须用一个32位数表达,叫做32位远指针,它就是逻辑地址

 

~~~花指令   90 给一个字节的指令来解花指令

 

Edit 编辑器

注释  或者/**/

Mystack segment stack 

Db 256  dup(?)

Db定义数据类型  dup初始化内存 ?随机 全为0

Mystack ends

 

Mydate segment

;Db 256  dup(?)   如果不写就是默认写的字节数大小

MSG dbhello world$

Mydate ends

 

Mycode segment

START   ; (程序入口 告诉计算机执行代码开始处)

Mov ax,Mydate (标识代表位置)

Mov dsax

Mov esax

Mov axMystack

Mov ssax

Mov ah09h

Mov dxoffset MSG offset自动算数据区偏移

Int 21

;exit   系统写的特殊退出码

Mov ax04c00h

Int 21

 

Mycode ends

End  START 

;end 告诉编译器结束了

计算机是通过执行指令来处理各种数据的。为了指出数据的来源、操作结果的去向及所执行的操作,一条指令必须包含下列信息:

1)操作码。它具体说明了操作的性质及功能。一台计算机可能有几十条至几百条指令,每一条指令都有一个相应的操作码,计算机通过识别该操作码来完成不同的操作。

2)操作数的地址。CPU通过该地址就可以取得所需的操作数。

3)操作结果的存储地址。把对操作数的处理所产生的结果保存在该地址中,以便再次使用。

4)下条指令的地址。

一条指令实际上包括两种信息即操作码和地址码。操作码(OperationCode,OP)用来表示该指令所要完成的操作(如加、减、乘、除、数据传送等),其长度取决于指令系统中的指令条数。地址码用来描述该指令的操作对象,它或者直接给出操作数,或者指出操作数的存储器地址或寄存器地址(即寄存器名)。

指令包括操作码域和地址域两部分。根据地址域所涉及的地址数量,常见的指令格式有以下几种。

①三地址指令:一般地址域中A1、A2分别确定第一、第二操作数地址,A3确定结果地址。下一条指令的地址通常由程序计数器按顺序给出。

②二地址指令:地址域中A1确定第一操作数地址,A2同时确定第二操作数地址和结果地址。

③单地址指令:地址域中A 确定第一操作数地址。固定使用某个寄存器存放第二操作数和操作结果。因而在指令中隐含了它们的地址。

零地址指令:在堆栈型计算机中,操作数一般存放在下推堆栈顶的两个单元中,结果又放入栈顶,地址均被隐含,因而大多数指令只有操作码而没有地址域。

⑤可变地址数指令:地址域所涉及的地址的数量随操作定义而改变。如有的计算机的指令中的地址数可少至 0个,多至6个。

 

比如 mov  ax,cx 89c8   1000 1001 1100 1000

Xxxx xxxx(前八位表示指令) xx(表寻址方式) xxx(操作数2 bx)xxx(操作数1 ax)

表寻址方式:

11表示两个寄存器  后面跟着两个操作数   其他的和后面三位配合表示寻址方式

00 表示内存到寄存器

01 表示内存加寄存器+16位

10 表示内存到寄存器+64位

 

复杂指令集 inter  amd

精简指令集  arm

 

分配段控件

Debug调试器中

Mov ax,1000

Mov ds, ax

Mov es, ax (将数据和附加数据段放在一起)

可以分配其他空间,但是代码段是程序一开始就分配好的,改变不了,改变了后,系统会发现对应的地方无效操作码系统会崩

无法控制代码加载到内存的位置,所以将内存分段交给操作系统。

可执行文件 (executable file) 指的是可以由操作系统进行加载执行的文件。在不同的操作系统环境下,可执行程序的呈现方式不一样。

 

Edit 编辑器

注释 或者/**/

Mystack segment stack

Db 256  dup(?)

Db定义数据类型  dup初始化内存 ?随机 0 全为0

Mystack ends

Mydate segment

;Db 256  dup(?)   如果不写就是默认写的字节数大小

MSG dbhello world$

Mydate ends

Mycode segment

MJ     (程序入口 告诉计算机执行代码开始处)

Mov ax,Mydate (标识代表位置)

Mov dsax

Mov esax

Mov axMystack

Mov ssax

Mov ah09h

Mov dxoffset MSGoffset自动算数据区偏移

Int 21

;exit   系统写的特殊退出码

Mov ax04c00h

Int 21

 

Mycode ends

End  MJ

;end 告诉编译器结束了

 

寻址会极大的降低性能

posted @ 2020-09-05 16:38  特权E5  阅读(777)  评论(0编辑  收藏  举报