码迷,mamicode.com
首页 > 其他好文 > 详细

一些汇编指令(基于8086)

时间:2014-12-26 21:41:19      阅读:128      评论:0      收藏:0      [点我收藏+]

标签:

回头看了下汇编,简单总结一些备忘,大部分内容在《王爽汇编语言第二版》中有更为详细的介绍,建议下载,比起某些教授抄书出版的内容,王爽先生的文章何止优秀百倍

mov

(1)数据送寄存器;

(2)寄存器送寄存器;

(3)内存单元送寄存器;

注意:

1.内存不能送内存

2.内存不能送段寄存器;

例:

将al中的数据送入内存单元10003H

分析:默认数据的寄存器是DS,所以只要我们设置ds的值后,使ds*16+[数据索引] = 10003即可。

程序:

mov bx,1000H

mov ds,bx

mov [3],al

另一种答案:

mov bx,FFFH

mov ds,bx

mov [13],al

 

 

PUSH(入栈)

POP (出栈)

push ax:将寄存器ax中的数据送入栈中;

pop ax :从栈顶取出数据送入ax。

8086CPU的入栈和出栈操作都是以字为单位进行的

 

jmp short 标号

(IP)=(IP)+8位位移。

jmp near ptr 标号

它实现的是段内近转移。

指令“jmp near ptr 标号”的功能为:

(IP)=(IP)+16位位移。

 

jmp far ptr 标号

实现的是段间转移,又称为远转移

(IP)=(IP)+32位位移。

mov ax,0123H

mov ds:[0],ax

jmp word ptr ds:[0]

执行后,(IP)=0123H

mov ax,0123H

mov [bx],ax

jmp word ptr [bx]

执行后,(IP)=0123H

 

 

ret 和retf

ret

将栈中数据pop至IP中,具体操作如下:

(IP)=((ss)*16+(sp))

(sp)=(sp)+2

将栈中sp指针处的值放入到IP中,同时栈指针往栈底移动两byte(栈是从高位往地位分配的,所以取出一个数据要增加2)

retf:(return far)

(IP)=((ss)*16+(sp))

(sp)=(sp)+2

(CS)=((ss)*16+(sp))

(sp)=(sp)+2

 

 

call指令 (一般和ret配合使用)

 

call 标号(将当前的 IP 压栈后,转到标号处执行指令)

CPU执行此种格式的call指令时,进行如下的操作:

(sp) = (sp) – 2

((ss)*16+(sp)) = (IP)

(IP) = (IP) + 16位位移

16位位移=“标号”处的地址-call指令后的第一个字节的地址;

16位位移的范围为 -32768~32767,用补码表示;

16位位移由编译程序在编译时算出

call相当于:

push IP

jmp near ptr 标号

 

call far ptr 标号:

(1) (sp) = (sp) – 2

((ss) ×16+(sp)) = (CS)

(sp) = (sp) – 2

((ss) ×16+(sp)) = (IP)

(2) (CS) = 标号所在的段地址

(IP) = 标号所在的偏移地址

相当于进行:

push CS

push IP

jmp far ptr 标号

一些汇编指令(基于8086)

标签:

原文地址:http://www.cnblogs.com/thaughtZhao/p/4182211.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!