8086汇编伪指令小结

同一个程序中,标号或变量只能定义一次.

标号有三种属性:段、偏移、类型(NEAR PTR,WORD PTR,FAR PRT,DWORD PTR)

?
?

一。数值回送操作符:TYPE、LEGNTH、SIZE、OFFSET、SEG

1.?TYPE????expression_r(or label)

如果表达式是变量,则回送该变量以字节数表示的类型:DB为 1, DW为 2, DD为 4...

如果表达式是标号,则回送该标号类型的数值:NEAR为 -1, FAR为 -2.

如果表达式是常量,则回送0.

array??DW A110H,B02CH,C322H???

ADD????AX, TYPE??array??等价于 ADD????AX, 2

2.?LENGTH????variable????对于变量使用DUP的情况,将回送分配给该变量的单元数; 对其它情况则回送1.

fees??DW 100 DUP(?)??????????

MOV??CX, LEGNTH??fees??等价于MOV??CX, 100

3.?SIZE????variable????回送分配给该变量的字节数

MOV????CX, SIZE??fees 等价于 MOV CX, 200

4.?OFFSET????variable (or lable)????????回送变量或标号的偏移地址.

MOV????BX,OFFSET OPER_ONE 等价于 LEA BX,OPER_ONE 语句 ,将OPER_ONE的偏移地址送入BX

5.?SEG????variable(or lable)???????回送变量或标号的段地址.

若OPER_ONE是DATA_SEG数据段中的一个变量,下面语句取得DATA_SEG段首地址

MOV????DS , SEG OPER_ONE??等价于

MOV????AX , DATA_SEG??????MOV????DS , AX

二。属性操作符:PTR、THIS、HIGH、LOW、HIGHWORD、LOWWORD

1.?type????PTR????expression????????用来给已分配的存储地址赋予另一种属性,使该地址具有另一种类型.

表示按expression表达式寻址,按指定的类型type看待.

即PTR是给后面的expression操作数赋予新的数据类型或地址类型.

MOV????BYTE PTR[BX] , 5????????//存入字节(Byte)单元

MOV????WORD PTR[BX] , 5???????//存入字(Word)单元

2.?THIS????type????指定与当前地址计数器相等的一个地址单元的类型.type是NEAR、FAR、PROC,也可以是BYPE、WORD...

first_type????EQU????THIS??BYTE

word_table????DW????100 DUP(?)????此时,first_type的偏移地址与word_table完全相同,但它是字节类型

3.?HIGH (LOW)????express???字节分离操作符, HIGH取高位字节, LOW取低位字节.

HIGHWORD (LOWWORD)????express????字分离操作符, HIGHWORD取高位字, LOWWORD取低位字.

CONST????EQU????0ABCDH??,??????MOV????AH, HIGH CONST 等价于

MOV????AH,0ABH

三。数据定义语句:variable_name????Mnemonic?????oper1, oper2.....

常用的助记符Mnemonic有:

?DB 定义字节,表示其后每个操作数占有一个字节(1Byte)单元

?DW 定义字,表示表示其后每个操作数占有一个字(2Byte)单元

?DD 定义双字,表示表示其后每个操作数占有两个字(4Byte)单元

?DQ 定义四个字,表示表示其后每个操作数占有四个字(8Byte)单元

?DT 定义十个字节,表示表示其后每个操作数占有十个字(10Byte)单元,形成压缩BCD码.

data_byte?????DB??????10 , 4 , 10H , ?????????//共定义了4个字节,其中 ‘?‘ 是保留单元

data_word????DW????100,?,100H????????????//共定义了3个字(6Byte)

str_aa????????????DB?????‘ABCDEFG‘????????????//定义和初始化多于两个能上能下字符的字符串时,只能使用DB伪指令.

四。符号定义语句(即常量)

name????EQU????expression????????????????//定义

PURGE????name1,name2...???????????????//解除

CONSTANT?????EQU????256???????//表示CONSTANT的值为256

五。段定义语句:SEGMENT ... ENDS、ASSUME、ORG

segmnet_name????SEGMENT????[align_type] [combine_type] [use_type] [class]

...

segment_name????ENDS????//SEGMENT和ENDS成对使用,把汇编语句分成段

对于数据段、附加段和堆栈段,一般是存储单元定义、初始化数据、分配单元等伪指令.

对于代码段,主要是指令序列和伪指令.

可选项说明:详细信息?

定位类型align_type:说明段的起始地址就有怎有怎样的边界值.

????????PARA????缺省项.??指定段的起始地址须从小段边界开始,即以16进表示地址时最低位必须为0.

????????BYTE?????可从任何地址开始.

????????WORD????必须从字的边界开始,即段地址必须是偶数..

????????DWORD??必须从双字的边界开始,即以16进制表示地址时最低位必须是4的倍数.

????????PAGE?????必须从页的边界开始,即以16时制表示地址时最低两位必须为00.(能被256整除)

组合类型combine_type:说明程序连接的段合并方法.

????????PRIVATE????缺省项.为私有段,连接时不与其他模块中的同名分段合并.

????????PUBLIC???????将与相同名字的其它分段合并.

????????COMMON??将与相同名字的其它分段合并且会产生覆盖.

????????MEMORY???同PUBLIC.

????????STACK????????指定该段在运行时为堆栈的一部分.

使用类型use_type:只适用386及其后继机型,用来说明是USE16(16位寻址)还是USE32(32位寻址).

类别class:用引号中给出连接时组成段组的类型名.

ASSUME使汇编程序在汇编指令时,能知道各段寄存器的值.

ASSUEM????segment_registername : segment_name , segment_registername : segment_name...

任何对存存储器或堆栈的访问的指令,都将使用CS、DS、ES和SS段寄存器的值才能形成真正的物理地址.

ASSUME只指定某个段分配给某个寄存器,并不能把段地址装入段寄存器.

所以,DS、ES、SS段寄存器的值必须通过MOV指令来赋予,CS段寄存器在程序初始化时自动完成.

为了给存储单元设置起始偏移地址,可以用ORG伪指令.

ORG????表达式????//表达式的值范围必须在0 ~ +65535

伪指令ORG可设置于代码段、数据段的任何地方.

mydata????SEGMENT????????????//段定义,段名为mydata

ORG?????100H?????????????????????//置mydata段的起始偏移地址为100H

?X????DB????12H , ? , 30H?????//数据定义,X 的偏移地址为0100H, X+1=0101H, X+2=0102H

????Z????DD????9C56H???????????????//Z的偏移地址为0103H

mydata????ENDS

mycode????SEGMENT

????ASSUME????CS : mycode ,??DS : mydata????//用ASSUME伪指令分配段寄存器

????start:?????MOV AX , mydata??//等价于MOV AX , SEG X语句, 将mydata段的起始地址装入到DS

??????????????????MOV DS , AX

????...

mycode????ENDS

????END?????start??????//源程序结束指令END, 其中start为lable

六。过程定义语句:PROC ... ENDP

procedure_name????PROC????[ NEAR | FAR ]??//要说明是NEAR过程或FAR过程.

...

RET????????//RET 返回指令必须与[ NEAR??|??FAR ] 对应

procedure_name????ENDP????????//PROC 和ENDP必须有名字,两者成对出现.

七。宏指令语句:MACRO...ENDM

macro_name????MACRO????[ parameter_list ]????//形参 parameter_list 可选,有多个参数时,中间用逗号隔开.

...

ENDM

MULTIPLY????MACRO????OPR1 , OPR2 , RESULT????//宏定义,宏名MULTIPLY,形参为OPR1,OPR2和RESULT

????????PUSH????DX

????????PUSH????AX

????????MOV????AX , OPR1

????????IMUL????OPR2

????????MOV????RESULT , AX

????????POP????AX

????????POP????DX

ENDM

MULTIPLY????240 , BX , SAVE????//宏调用,实参为240 , BX , SAVE

宏指令与子程序的区别:

子程序产生目标代码少,占用内存少,但执行时间长,速度慢.

宏指令产生目标代码长,占用内存多,但执行时间短,速度快.

八。程序开始和结束语句:NAME | TITLE、END

模块名:NAME????moudle_name

标题名:TITLE????text

源程序结束指令:END????[ lable ]

?
?

来自 <http://blog.sina.com.cn/s/blog_4a92ce12010006m2.html>

时间: 2024-11-03 22:01:25

8086汇编伪指令小结的相关文章

8086汇编学习小结———实时更新

初学IBM-PC 8086,对INT指令不是很理解.现从网上总计如下: 表:DOS系统功能调INT 21H AH 功能 调用参数 返回参数 00 程序终止(同INT 20H) CS=程序段前缀 01 键盘输入并回显 AL=输入字符 02 显示输出 DL=输出字符 03 异步通迅输入 AL=输入数据 04 异步通迅输出 DL=输出数据 05 打印机输出 DL=输出字符 06 直接控制台I/O DL=FF(输入)DL=字符(输出) AL=输入字符 07 键盘输入(无回显) AL=输入字符 08 键盘

汇编考试小结

明天 汇编考试,今天小结一下 数据传送指令集 MOV 功能: 把源操作数送给目的操作数 语法: MOV 目的操作数,源操作数 格式: MOV r1,r2 MOV r,m MOV m,r MOV r,data XCHG 功能: 交换两个操作数的数据 语法: XCHG 格式: XCHG r1,r2 XCHG m,r XCHG r,m PUSH,POP 功能: 把操作数压入或取出堆栈 语法: PUSH 操作数 POP 操作数 格式: PUSH r PUSH M PUSH data POP r POP

《Intel汇编第5版》 条件汇编伪指令

一.条件汇编伪指令和宏使用可以使汇编程序更加灵活 二.通过伪指令来检查函数的参数是否为空,如果为空则输出警告信息 INCLUDE Irvine32.inc includelib Irvine32.lib includelib kernel32.lib includelib user32.lib .data source BYTE "this is source string",0 .code mWriteStr MACRO string IFB <string> ECHO

8086汇编双人贪食蛇游戏

突然找到4年前自己写的纯8086汇编语言双人贪食蛇游戏,绝对原创代码纯手打.分享给有需要参考的童鞋! Download : http://download.csdn.net/detail/yarkey09/7415405 源码:game1205.asm 可运行文件:GAME1205.EXE ( Windows XP 32bit 环境下测试成功 ) 字库文件:HZK24 位图图片:256.bmp 主要涉及以下几大难点: 1,8086汇编语言语法 2,BIOS/DOS系统中断功能调用 3,中断向量表

ARM汇编伪指令

伪指令的意义 伪指令不是指令,伪指令和指令的根本区别是经过编译后会不会生成机器码. 伪指令的意义在于指导编译过程. 伪指令是和具体的编译器相关的,我们使用gnu工具链,因此学习gnu环境下的汇编伪指令. gnu汇编中的一些符号 @ 用来做注释.可以在行首也可以在代码后面同一行直接跟,和C语言中//类似 # 做注释,一般放在行首,表示这一行都是注释而不是代码. :以冒号结尾的是标号 . 点号在gnu汇编中表示当前指令的地址 # 立即数前面要加#或$,表示这是个立即数 常用gnu伪指令 .globa

8086汇编指令速查手册

一.常用指令 二.算术运算指令 三.逻辑运算指令四.串指令 五.程序跳转指令------------------------------------------ 计算机寄存器分类简介: 32位CPU所含有的寄存器有:4个数据寄存器(EAX.EBX.ECX和EDX)2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP) 6个段寄存器(ES.CS.SS.DS.FS和GS)1个指令指针寄存器(EIP) 1个标志寄存器(EFlags) 1.数据寄存器数据寄存器主要用来保存操作数和运算结

8086汇编指令总结

经过学习,对8086汇编常用指令进行了以下总结: (1).mov : 移动数据 例如: mov ax, 8h ;mov 寄存器,常量 mov ax, bx ;mov 寄存器,寄存器 mov ax, ds:[0] ;mov 寄存器,内存单元 mov ds:[0], ax ;mov 内存单元,寄存器 mov ds, ax ;mov 段寄存器,寄存器 mov word ptr ds:[0], 8h ;mov (内存单元大小声明) 内存单元, 常量 sk: mov ax, offset sk ;mov

h5棋牌平台出售DSP汇编伪指令总结

1.条件汇编伪指令h5棋牌平台出售(h5.hxforum.com)联系方式 17061863533 企鹅 2952777280  源码出售,售房卡出售,平台出租 .break [well-defined expression]  如果条件真结束.loop汇编,.break结构是可选项 .else    如果.if条件为假,汇编代码块.else结构是可选项 .elseif well-defined expression--如果if条件为假且.elseif条件为真,汇编代码块.else结构是可选项

8086汇编语言学习(二) 8086汇编开发环境搭建和Debug模式介绍

1. 8086汇编开发环境搭建 在上篇博客中简单的介绍了8086汇编语言.工欲善其事,必先利其器,在8086汇编语言正式开始学习之前,先介绍一下如何搭建8086汇编的开发环境. 汇编语言设计之初是用于在没有操作系统的裸机上直接操作硬件的,但对于大部分人来说,在8086裸机上直接进行编程将会面临各种困难.好在我们可以使用软件模拟器来模拟硬件进行8086的学习实践.在<汇编语言>中作者推荐通过windows环境下的masm和debug进行学习. masm介绍: masm是一款DOS下的汇编工具包,