好文档 - 专业文书写作范文服务资料分享网站

汇编语言指令 

天下 分享 时间: 加入收藏 我要投稿 点赞

汇编语言(王爽版)用到的伪指令,指令等

一 寄存器(reg):AX,BX,CX,DX,ah,al,bh,bl,ch,cl,dh,dl,SI,DI,SP,BP,IP。 段寄存器(sreg):CS,SS,DS,ES。

1 CS——代码段寄存器(Code Segment Register),其值为代码段的段值; 2 DS——数据段寄存器(Data Segment Register),其值为数据段的段值; 3 SS——堆栈段寄存器(Stack Segment Register),其值为堆栈段的段值; 4 ES——附加段寄存器(Extra Segment Register),其值为附加数据段的段值; 5 BP为基指针(Base Pointer)寄存器,用它可直接存取堆栈中的数据; 6 SP为堆栈指针(Stack Pointer)寄存器,用它只可访问栈顶。 7 寄存器AX和AL通常称为累加器(Accumulator),用累加器进行的操作可能需要更少时间。累加器可用于乘、除、输入/输出等操作,它们的使用频率很高;

8 寄存器BX称为基地址寄存器(Base Register)。它可作为存储器指针来使用;

9 寄存器CX称为计数寄存器(Count Register)。在循环和字符串操作时,要用它来控制循环次数;在位操作中,当移多位时,要用CL来指明移位的位数;

10 寄存器DX称为数据寄存器(Data Register)。在进行乘、除运算时,它可作为默认的操作数参与运算,也可用于存放I/O的端口地址。

11 SI和DI称为变址寄存器(Index Register),它们主要用于存放存储单元在段内的偏移量,用它们可实现多种存储器操作数的寻址方式,为以不同的地址形式访问存储单元提供方便。

16位标志寄存器——共用了9个标志位,它们主要用来反映CPU的状态和运算结果的特征。标志位的分布如下表所示。

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 OF DF IF TF SF ZF AF PF CF 1、进位标志CF(Carry Flag)主要用来反映运算是否产生进位或借位。如果运算结果的最高位产生了一个进位或借位,那么,其值为1,否则其值为0。

2、奇偶标志PF(Parity Flag)用于反映运算结果中“1”的个数的奇偶性。如果“1”的个数为偶数,则PF的值为1,否则其值为0。

3、零标志ZF(Zero Flag)用来反映运算结果是否为0。如果运算结果为0,则其值为1,否则其值为0。

4、符号标志SF(Sign Flag)用来反映运算结果的符号位,它与运算结果的最高位相同。在微机系统中,有符号数采用补码表示法,所以,SF也就反映运算结果的正负号。运算结果为正数时,SF的值为0,否则其值为1。

5、溢出标志OF(Overflow Flag)用于反映有符号数加减运算所得结果是否溢出。如果运算结果超过当前运算位数所能表示的范围,则称为溢出,OF的值被置为1,否则,OF的值被清为0。

6、追踪标志TF(Trap Flag)被置为1时,CPU进入单步执行方式,即每执行一条指令,产生一个单步中断请求。

7、方向标志DF(Direction Flag)用来决定在串操作指令执行时有关指针寄存器发生调整的方向。Cld指令:将标志寄存器的DF位置0,Std指令:将标志寄存器的DF位置1

8、中断允许标志IF是用来决定CPU是否响应CPU外部的可屏蔽中断发出的中断请求。但不管该标志为何值,CPU都必须响应CPU外部的不可屏蔽中断所发出的中断请求,以及CPU内部产生的中断请求。

(1)、当IF=1时,CPU可以响应CPU外部的可屏蔽中断发出的中断请求; (2)、当IF=0时,CPU不响应CPU外部的可屏蔽中断发出的中断请求。 Sti用于设置IF=1;Cli用于设置IF=0。

二 数据传送指令(mov,push,pop,pushf,popf); 1 Mov为转移指令把后面的数据转移到前面。 mov 寄存器,段寄存器 mov段寄存器,寄存器 mov 寄存器,数据 mov 寄存器,寄存器 mov 寄存器,内存单元 mov 内存单元,段寄存器 2 push和pop

push (段)寄存器;将一个(段)寄存器中的数据入栈。

pop (段)寄存器;出栈,用一个(段)寄存器接收出栈的数据。

push 内存单元;将一个内存字单元处的字入栈(注意:栈操作都是以字为单元。) pop 内存单元;出栈,用一个内存单元接收出栈的数据。 3 pushf和popf

pushf 的功能是将表示寄存器的值压栈。

popf 是从栈中弹出数据,送入标志寄存器中。

三 算术运算指令(add,sub,adc,sbb,inc,dec,cmp,div,mul); 1 add为相加指令,把两个数相加的结果存储在前面 add寄存器,数据 add寄存器,寄存器 add寄存器,内存单元 add内存单元,寄存器

2 sub为相减指令,把第一个数减去第二个数的结果存储在前面,用法同add。 3 adc和sbb

adc带进位加法指令,它利用了CF位上记录的进位值。 指令格式:adc 操作对象1,操作对象2

功能:操作对象1=操作对象1+操作对象2+CF

sbb带借位减法指令,它利用了CF位上记录的进位值。 指令格式:sbb 操作对象1,操作对象2

功能:操作对象1=操作对象1—操作对象2—CF 4 inc和dec

inc 操作对象;实现操作对象自加一。 dec 操作对象;实现操作对象自减一。 5 div是除法指令 格式如下: div reg

div 内存单元

(1) 除数:有8位和16位两种,在一个寄存器或内存单元中。

(2) 被除数:默认放在AX或DX和AX中,如果除数为8位,被除数则为16位,默认

在AX中存放;如果除数为16位,被除数则为32位,在DX和AX中存放,DX存放高16位,AX存放低16位。

(3) 结果:如果除数为8位,则AL存储除法操作的商,AH存储除法操作的余数;如果

除数为16位,则AX存储除法操作的商,DX存储除法操作的余数。

6 mul 是乘法指令 格式如下: mul reg

mul 内存单元

(1) 两个相乘的数:两个相乘的数,要么都是8位,要么都是16位。如果是8位,一个

默认放在AL中,另一个放在8位寄存器或内存字节单元中;如果是16位,一个默认在AX中,另一个放在16位寄存器或内存字单元中。

(2) 结果:如果是8位乘法,结果默认放在AX中;如果是16位乘法,结果高位默认在

DX中存放,低位在AX中存放。

7 cmp 是比较指令

cmp指令格式:cmp 操作对象1,操作对象2 功能:计算操作对象1—操作对象2 但并不保存结果,仅仅根据计算结果对标志寄存器进行设置。和“检测比较结果的条件转移指令”配合使用。 常用的根据无符号数的比较结果进行转移的条件转移指令 如下:第一个字母j,表示jump; 指令 je jne jb jnb ja jna 含义 等于则转移——表示equal 不等于则转移——表示not equal 低于则转移——表示 below 不低于则转移——表示not below 高于则转移——表示 above 不高于则转移——表示 not above 检测的相关标志位 ZF=1 ZF=0 CF=1 CF=0 CF=0且ZF=0 CF=1或ZF=1

四 逻辑指令(and,or,shl,shr);

1 and 指令:逻辑与指令,按位进行与运算。

通过该指令可将可将操作对象的相应位设为0,其他位不变。 2 or 指令:逻辑或指令,按位进行或运算。

通过该指令可将可将操作对象的相应位设为1,其他位不变。 3 shl 指令:逻辑左移指令;它的功能为:

(1) 将一个寄存器或内存单元中的数据向左移位; (2) 将最后移出的一位写入CF中; (3) 最低位用0补充。

4 shr 指令:逻辑右移指令;它的功能为:

(1) 将一个寄存器或内存单元中的数据向右移位; (2) 将最后移出的一位写入CF中; (3) 最高位用0补充。

注意:如果移动位数大于1时,必须将移动位数放在cl中。 五 转移指令

1 无条件转移指令,jmp

Jmp可以只修改IP,也可以同时修改CS和IP。 “jmp short 标号 ”实现段内短转移,功能为:(IP)=(IP)+8位位移。 (1)8位位移=“标号”处的地址—jmp指令后的第一个字节的地址;

(2)short指明此处的位移为8位位移;

(2)8位位移的范围为-128~127,用补码表示; (3)8位位移由编译程序在编译时算出。

“jmp near ptr 标号”实现段内近转移,功能为:(IP)=(IP)+16位位移。 (1)16位位移=“标号”处的地址—jmp指令后的第一个字节的地址; (2)near ptr指明此处的位移为16位位移;

(2)16位位移的范围为-32768~32767,用补码表示; (3)16位位移由编译程序在编译时算出。

“jmp far ptr 标号”实现的是段间转移,又称为远转移。 功能如下:(CS)=标号所在段的段地址;(IP)=标号在段中的偏移地址。 far ptr 指明了指令用标号的段地址和偏移地址修改CS和IP。 “jmp word ptr 内存单元地址(段内转移)”功能:从内存单元地址处开始存放着一个字,是转移的目的偏移地址。

“jmp dword ptr 内存单元地址(段间转移)”功能:从内存单元地址处开始存放着两个字,高地址处的字是转移的目的段地址,低地址处是转移的目的偏移地址。 (CS)=(内存单元地址+2);(IP)=(内存单元地址)。 内存单元地址可用寻址方式的任一格式给出。 2 条件转移指令,jcxz,je,jb,ja,jnb,jna 所有的有条件转移指令都是短转移。

jcxz指令格式:jcxz 标号(如果(CX)=0,转移到标号处执行。) 操作:当(CX)=0时,(IP)=(IP)+8位位移。 3 循环指令,loop

所有的循环指令都是短转移。 指令格式:loop 标号 ((CX)=(CX)—1,如果(CX)!=0,转移到标号处执行。) 操作:(1)(CX)=(CX)—1;

(2)如果(CX)!=0,(IP)=(IP)+8位位移。 4 过程,call,ret,retf

(1)ret指令用栈中的数据,修改IP的内容,从而实现近转移; CPU执行ret指令时,相当于进行: pop IP

(2)retf指令用栈中的数据,修改CS和IP的内容,从而实现远转移。 CPU执行retf指令时,相当于进行: pop IP pop CS

(4) Call指令不能实现短转移,除此之外,call指令实现转移的方法和jmp指令的原理

相同。CPU执行call指令时,进行两步操作:1、将当前的IP或CS和IP压入栈中;2、转移。

5 中断,int,iret

(1) int指令的格式为:int n,n为中断类型码,它的功能是引发中断过程。

执行过程如下:1、取中断类型码n;2、标志寄存器入栈,IF=0,TF=0;3、CS、IP入栈;4、(IP)=(n*4),(CS)=(n*4+2)。 (2) iret指令的功能为:pop IP pop CS popf

int指令和iret指令的配合使用与call指令和ret指令的配合使用具有相似的思路。 六 处理机控制指令(cld,std,cli,sti)

①cld指令:将标志寄存器的DF位置0,正向传送。 ②std指令:将标志寄存器的DF位置1,逆向传送。 ③cli指令:用于设置IF=0 ④sti指令:用于设置IF=1

七 串处理指令(movsb,movsw,rep)

Flag的第10位是DF,方向标志位。在串处理指令中,控制每次操作后si,di的增减。 DF=0 每次操作后si,di递增; DF=1 每次操作后si,di递增。 (1)格式:movsb

功能:执行movsb指令相当于进行下面几步操作: 1、((es)*16+(di))=((ds)*16+(si)) 2、如果DF=0则:(si)=(si)+1 (di)=(di)+1 如果DF=1则:(si)=(si)—1 (di)=(di)—1 (2)格式:movsw

movsw的功能是将ds:si指向的内存字单元中word送入es:di中,然后根据标志寄存器DF位的值,将si和di递增2或减2。

(3) rep的作用是根据cx的值,重复执行后面的串传送指令。 一般来说,movsb和movsw都和rep配合使用,格式如下: rep movsb

用汇编语法来描述就是:s:movsb loop s rep movsw

用汇编语法来描述就是:s:movsw loop s

使用串传送指令进行数据的传送,需要给它提供一些必要的信息,它们是: 1、 传送的原始位置:ds:si; 2、 传送的目的位置:es:di; 3、 传送的长度:cx; 4、 传送的方向:DF。

八 伪指令(segment,ends,end,assume,offset,seg,dup,db,dw,dd, in,out) (1)segment和ends是一对成对使用的伪指令,这是在写可被编译器变异的汇编程序时,必须用到的一对伪指令。Segment和ends的功能是定义一个段,segment说明一个段开始,ends说明一个段结束。一个段必须有一个名称来标识,使用格式为: 段名 segment . .

段名 ends

(3) end是一个汇编程序的结束标记。 (4) assume这个伪指令的含义为“假设”。它假设某一段寄存器和程序中的某一个用

segment…..ends定义的段相关联。通过assume说明这种关联,在需要的情况下,编

译程序可以将段寄存器和某一个具体的段相联系。

(5) offset在汇编语言中是由编译器处理的符号,它的功能是取得标号的偏移地址。

Seg操作符,功能为取得某一标号的段地址。

(6) dup是一个操作符,它是和db,dw,dd等数据定义伪指令配合使用的,用来进行数

据的重复。

使用格式如下:

? db 重复的次数 dup(重复的字节型数据); ? dw 重复的次数 dup(重复的字型数据); ? dd 重复的次数 dup(重复的双字数据)。

(7) db、dw和dd定义字节型数据、字型数据和双字数据。

(8) 端口的读写指令只有两个:in和out,分别用于从端口读取数据和往端口写入数据。 在in和int指令中,只能使用ax或al来存放从端口中读入的数据或要发送到端口中的数据。访问8位端口时用al,访问16位端口时用ax。

格式如下:in al,20h ;从20h端口读入一个字节 out 20h,al ;从20h端口写入一个字节 九 影响标志寄存器的指令

①影响标志寄存器的指令:add,sub,adc,sbb,div,mul,inc,dec,cmp,and,or,shl,shr,cld,std,cli,sti ②不影响标志寄存器的指令:mov,push,pop,pushf,popf, ③inc和loop指令不影响CF位。 十 注意:

①在写一条汇编指令或一个寄存器的名称时不区分大小写。

②push,pop等栈操作指令,修改的只是SP。也就是说,栈顶的变化范围最大为: 0~FFFFH。

③Debug将程序从可执行文件加载入内存后,cx中存放的是程序的长度。 ④在汇编源程序中,数据不能以字母开头,所以要在前面加0。

⑤若要cpu从何处开始执行程序,只要在源程序中用“end 标号”指明就可以了。 ⑥一般来说,在需要暂存数据的时候,我们都应该使用栈。 ⑦内存地址空间中,B8000H~BFFFFH共32KB的空间,为80*25彩色字符模式显示缓存区, 在其中,一个字符占两个字节的存储空间(一个字),地位字节存储字符的ASCII码,高位字节存储字符的属性。偶地址存放字符,奇地址存放字符的颜色属性。 ⑧BIOS和DOS提供的中断例程,都用ah来传递内部子程序的编号。 ⑨闪烁的效果必须在全屏dos方式下才能看到。

10在后面加有“:”的地址标号,只能在代码段中使用,不能在其他段中使用。 ○

汇编语言指令 

汇编语言(王爽版)用到的伪指令,指令等一寄存器(reg):AX,BX,CX,DX,ah,al,bh,bl,ch,cl,dh,dl,SI,DI,SP,BP,IP。段寄存器(sreg):CS,SS,DS,ES。1CS——代码段寄存器(CodeSegmentRegister),其值为代码段的段值;2DS——数据段寄存器(DataSe
推荐度:
点击下载文档文档为doc格式
36bsa0v0jd0weks4q3cj
领取福利

微信扫码领取福利

微信扫码分享