微机笔记3——汇编语言程序设计
汇编语言基本元素
汇编语言的语句格式
[标识符] 指令助记符 [操作数] [;注释]
- 标识符 : 给指令或某一存储单元地址所起的名字称为标识符
- 指令助记符 :表示不同操作的指令
- 操作数 : 指令执行的对象,可能有一个、两个、没有或者多个
- 注释
汇编语言运算符
算术、逻辑、关系运算符 eg:+、-、×、 / 、 AND、OR、LT
取值运算符
a) $ 运算符
$:当前地址偏移量的值
b) SEG 和OFFSET
SEG: 求标号或变量的段地址
OFFSET: 求标号或变量的偏移地址
c) TYPE 返回标号或存储器操作数的类型值
d) LENGTH和SIZE(对用DUP定义数据的情况下)
LENGTH:返回一个与存储器操作数相联系的基本数据个数
SIZE:返回一个为存储器操作数分配的字节数
关系:SIZE=LENGTH × TYPE属性运算符
用来给指令中的操作数指定一个临时的属性,而暂时忽略操作数定义时的属性。
PTR 定义操作数为新的类型
一般格式:类型 PTR 操作数
功能:建立一个存储器操作数,它与其后的存储器操作数有相同的段地址和偏移地址,但有不同的类型。
表达式
1) 常数
二进制(B),八进制(Q),十六进制(H),十进制(D)(默认),字符和字符串
2)常量操作数
3)存储器操作数
存储器操作数有三个属性:
- 段属性(SEG) : 所对应存储单元的段地址
- 偏移量属性(OFFSET) :所对于存储单元在所在段内的偏移地址(距段起点的字节数)
- 类型属性(TYPE)
变量的类型是占用存储单元的字节数,分为: DB(1个字节)DW(2个字节)DD(4个字节)
标号的类型则反映了相应存储单元地址在作为转移或调用指令的目标操作数时的寻址方式,可
有两种情况,即NEAR和FAR。
4)常量表达式 例如 PORT、VAL+1、OFFSET SUM 、SEG SUM 、 TYPE CYCLE
5)地址表达式 例如 SUM+2、CYCLE-5
汇编语言程序汇编步骤
1)编写源程序;2)汇编;3)连接;4)调试。
伪指令
数据定义伪指令
DB:定义字节,其后的每个操作数占有一个存储单元,连续存放;
DW:定义字,其后的每个操作数占有两个字节;
DD: 定义双字,其后每个操作数占4个字节;
若仅保留单元,不初始化,用?代替初值; ARRAY DB 100 DUP(?)
若数据重复,用 n DUP( )代替,n为重复次数。DATA1 DB 100 DUP(‘AB’)
符号定义伪指令
① EQU伪指令给符号定义一个值。在程序中,凡是出现该符号的地方,汇编时均用其值代替。
一般格式:标识符 EQU 表达式
TIMES EQU 50
DATA DB TIMES DUP (?)
②PURGE伪指令用来释放由EQU伪指令定义的变量,这样这些变量就可以被重新定义。
PURGE TIME
TIME EQU 100
用EQU伪指令定义的变量值在程序运行过程中不能改变,若要改变这些变量的值必须
先由PURGE伪指令释放,再重新定义。
③“=”伪指令也可给变量赋值。使用“=”伪指令定义的变量值不用释放就可重新定义。
一般格式:标识符 = 表达式
BETA = TIMES-2
BETA = TIMES+5 ;重新赋值
段定义伪指令
段名 SEGMENT [定位类型][组合类型][类别]
段名 ENDS
- 定位类型:表示本段起始地址位于何处
每256个地址为一页(PAGE),每页的起始地址为二进制:
**** **** **** 0000 0000
16进制:00H
每16个地址为一段(PARA),每段的起始地址为二进制:* **** **** **** 0000
16进制:****0H
段是默认的定位类型。
每2个地址为一个字(WORD),每个字的起始地址为偶数;
最基本的类型是字节(BYTE),每个字节只包含一个地址,可以是内存的任何空间。 - 组合类型
NONE: 表示本段与其他段不发生任何关系,该段有自己的段基址,是默认的组合关系。
PUBLIC:在满足定位类型的前提下与其他模块的同名段连接在一起,形成一个新的逻辑段,共用一个段基址。
COMMON: 表示产生一个覆盖段。连接时,把本段与其他也用COMMON说明的同名段置成相同的起始地址,重叠在一起,共享相同的存储区,其段长度由最长的段确定。
STACK: 在每个汇编程序中,只能必须有一个堆栈段,连接时,将本段与其他也用STACK说明的同名段连接成一个连续的STACK段,编译程序自动初始化SS和SP寄存器,使SS的内容为该连续段的段基址,SP指向堆栈底部加1的存储单元。
MEMORY: 表示本段在存储器中应定位在所有其他段的最高地址。以首先遇到的具有memory组合类型的段为准,其他段认为是common型的
AT<表达式>: 表示本段从表达式指定的地址处开始装入,这样,在程序中用户就可以直接定义段地址,这种方式不适用于代码段。 - 类别
是用单引号括起来的字符串,以表明该段的类别,如代码段(CODE)、数据段(DATA)、堆栈段(STACK)等
设定段寄存器伪指令
一般格式:ASSUME 段寄存器:段名[,段寄存器:段名,…]
功能:通知汇编程序,哪一个段寄存器是该段的段寄存器,以便对使用变量或标号的指令汇编出正确的目的代码。
注意 :在装入程序中DS寄存器由于被用作其它用途,因此,在用户程序中必须用两条指令对DS进行初始化,以装入用户的数据段段地址。当使用附加段时,也要用MOV指令给ES赋段地址。CODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKMOV AX,DATA ;DATA段值送AXMOV DS,AX ;AX内容送DS,DS才有实际段值CODE ENDS
过程定义伪指令
在程序设计中,可将具有一定功能的程序段看成为一个过程(相当于一个子程序),它可以被别的程序调用。
过程名 PROC [类型] ; 类型由FAR和NEAR来确定,如果缺省类型,则默认为近过程。
过程体
RET ; 过程体内至少有一条RET指令
过程名 ENDP
注意 : PROC和ENDP要成对出现。
call 调用过程
宏指令
宏指令定义格式:
宏指令名 MACRO <形参列表>
汇编程序段(宏体)
ENDM
定位伪指令
功能:指定在其后的指令或数据存放的偏移地址。
格式:ORG 表达式
CODE SEGMENT
ORG 0100H
MOV AX, 0
CODE ENDS ; 指定MOV指令放在代码段中偏移地址为0100H开始的位置。
DATA SEGMENT
ORG 2000H
NUM DB 0,5
DATA ENDS ; 指定NUM指向数据段中偏移地址为2000H开始的位置。
汇编结束伪指令
一般格式: END 表达式
汇编程序设计
顺序、分支、循环程序设计
子程序设计
入口参数:由主程序传给子程序的参数
出口参数:子程序运算完传给主程序的结果。
参数传递方法
- 利用寄存器 : 最常见方法,把所需传递的参数直接放在主程序的寄存器中传递给子程序。
- 利用存储单元 ; 把所需传递的参数直接放在子程序调用指令之后或通过数据区传递。
- 利用堆栈 : 将参数压入堆栈,在子程序运行时从堆栈中取参数.
DOS功能调用
1)在显示器上显示单个字符(2号功能)
功能:在屏幕的光标处显示单个字符
入口参数:要显示字符的ASCII码放在DL中
出口参数:无
MOV DL, ‘A’ ; 显示字符A
MOV AH, 2 ; 提供调用功能号
INT 21H ; 系统功能调用
2)在屏幕上显示字符串(9号功能)
功能:在屏幕上当前光标处输出存储在内存数据段的一串字符串,该字符串以‘ $ ’结束。
入口参数: DS:DX指向欲显示字符串的首址
出口参数:无
DATA SEGMENT
STRING DB ‘I am a student.$’
DATA ENDS
MOV DX, OFFSET STRING ; 指向字符串首址
MOV AH, 9 ; 提供调用功能号
INT 21H ; 系统功能调用
3) 带显示的键盘输入(1号功能)
功能:等待键盘输入,直到按下一个键。
入口参数:无
出口参数:键入键的ASCII码放在AL中,并在屏幕上显示该键。
MOV AH, 1 ; 提供调用功能号
INT 21H ; 系统功能调用 ; 程序运行到此停下,等待用户键盘输入
MOV [2000H], AL ; 用户从键盘键入的键的ASCII码进入AL中
4)不带显示的键盘输入(7号功能)
功能:等待键盘输入,直到按下一个键。
入口参数:无
出口参数:键入键的ASCII码放在AL中,但在屏幕上没有显示,常用于输入密码。
MOV AH, 7 ; 提供调用功能号
INT 21H ; 系统功能调用
MOV [2000H], AL
该功能与1号功能类似,只是字符不在屏幕上显示。
5)字符串输入(10号功能)
功能:等待从键盘输入一串字符到存储区的数据段,直到按下回车结束输入。
入口参数:DS:DX指向接收字符串的内存地址的首址,该地址的第一个字节是由用户设置的可输入字符串的最大字符数(含回车)
出口参数:存放输入字符串存储区的第二个字节是实际输入的字符数(不含回车),实际输入的字符串从该存储区的第三个字节处开始存放。
6)程序结束返回DOS( 4C号功能 )
功能:将控制权移交DOS。
入口参数:无
出口参数:无
MOV AH, 4CH
INT 21H
微机笔记3——汇编语言程序设计相关推荐
- 微机原理之汇编语言程序设计
微机原理之汇编语言程序设计 还没有时间弄图床,图片都放在本地显示不了-先将就着,有空再补上 1 基础知识 1.1 总线 连接CPU和其他芯片的导线 地址总线 数据总线 控制总线 内部总线实现CPU内部 ...
- 【微机原理与接口技术】学习笔记4 汇编语言程序设计
文章目录 4.1 汇编语言程序格式和伪指令 4.1.1 汇编语言程序格式(略) 4.1.2 伪指令语句 1. 段定义语句 2. 段分配语句 3. 过程定义语句 4. 变量定义语句 5. 程序结束语句 ...
- 【读书笔记】汇编语言程序设计
零.阅读目的 C++开发的游戏服务器避免不了偶尔出现的宕机问题,在查找宕机问题时,一般都会分析dump,但由于编译器优化问题和64位dump调试的不方便,能看懂汇编可以起到事半功倍的效果,通常可以通过 ...
- 微型计算机标致寄存器实验报告,xin微机原理与汇编语言程序设计
或(2)的规定,可设一个或多个断点地址.DEBUG程序中允许最多可设置10个断点,这些断点地址的次序是任意的.所谓断点是指程序执行到这个地址时立即停止,并显示CPU内部所有寄存器的内容以及全部标志位的 ...
- 琢石成器――windows环境下32位汇编语言程序设计(第三版)笔记
琢石成器――windows环境下32位汇编语言程序设计(第三版)笔记 2011年12月20日 基础篇 第1章 背景知识 1 1.1 Win32的软硬件平台 1.1.1 80x86系列处理器简史 1.1 ...
- 【微机原理与接口技术学习实践】汇编语言程序设计初步——debug编写调试指令序列
halo~我是bay_Tong桐小白 本文内容是桐小白个人对所学知识进行的总结和分享,知识点会不定期进行编辑更新和完善,了解最近更新内容可参看更新日志,欢迎各位大神留言.指点 [微机原理与接口技术学习 ...
- Intel汇编语言程序设计读书笔记(基本概念)
我决定将最近读的Intel汇编的东西写下来,慢慢更新.汇编这个东西嘞,你让我拿来写个大程序,真是组织不了,没那个架构能力.但是看看工作过程,对理解其它东西可能有点帮助吧.知道比不知道好.找空就开始写. ...
- 微机原理实验一——8086系统寻址方式和汇编语言程序设计
本文使用TPC-UPC-ZK集成环境进行汇编语言程序设计 内含 1.内存中现有X和Y两个存储单元,分别存有42和-43,利用汇编语言编程计算这两个数之和,并将结果存入SUM单元 2.数据段中的一个存储 ...
- 《汇编语言程序设计》学习笔记(3)三、C与汇编语言
3.1 80x86汇编与C语言-1 3.1.1 80x86汇编与C语言-1 - 汇编程序员眼中的系统结构 汇编程序员眼中的系统结构 如何从C代码生成汇编代码 gcc -O2 -S code.c -m3 ...
最新文章
- PYTHON编程导论群问题汇总(五)
- oracle类型sql转为mysql_Oracle和MySql之间SQL区别(等效转换以及需要注意的问题)...
- python生成验证码
- 死锁问题案例分析解决
- SpringBoot高级-缓存-搭建redis环境测试
- 洛谷P2342-叠积木
- 算法前戏 递归 二分查找 列表查找
- uni-app第三方登陆-微信
- Windows平台基于RTMP实现一对一互动直播
- C++ 三种继承方式
- js 绘制泳道图_软件工程师,如何绘制业务架构图 — 4.流程图
- 初识FL Studio中的FLEX插件
- Micro LED 巨量转移技术
- java ad域 单点登录_系统集成-SSO微软ADSF单点认证-AD域认证
- 机器学习读书笔记:假设检验(一)
- 摄像机高精度标定的一些方法
- OSPF协议介绍及配置
- 中国财团收购Opera 为什么要美国监管部门同意?
- 【web安全】——XXE漏洞快速入门
- 云计算、大数据和人工智能之间的关系----详细说明
热门文章
- 为什么有些人看了别人的总结、经验、教训,依然没有用。
- Python【第一篇】python安装、pip基本用法、变量、输入输出、流程控制、循环
- JAVA GUI界面组件学习
- MySQL字符串转日期
- 基于visual Studio2013解决C语言竞赛题之1026判断排序
- 好用的MessageFormat类
- asp.net关于页面不回发,不生成__doPostBack方法问题的完美解决方案--ZT
- SpringMVC @ResponseBody 406
- Spring与SpringMVC的区别
- ELK日志系统之使用Rsyslog快速方便的收集Nginx日志