微机原理:汇编语言程序设计

文章目录

  • 一、汇编格式
    • 1、文字简述
    • 2、代码表述
  • 二、汇编语言结构说明
    • 1、方式选择伪指令
    • 2、段定义语句
    • 3、段约定语句
    • 4、汇编结束语句
    • 5、返回DOS语句
  • 三、实例
    • 1、例子
    • 2、汇编语言程序开发过程
  • 四、功能调用
    • DOS功能调用
      • 1、功能号01H
      • 2、功能号02H
      • 3、功能号09H
      • 4、功能号0AH
      • 5、举例
    • BIOS功能调用
      • 1、功能号00H
      • 2、功能号01H
      • 3、功能号0EH(文本)
      • 4、功能号13H

前言:本章我们就学习,如何汇编?大家对前面几章的学习,应该对于汇编代码有了一个初始的印象。

一、汇编格式

1、文字简述

一个完整的汇编语言源程序在结构上必须做到以下几点:

  • 用方式选择伪指令说明执行该程序的微处理器类型;
  • 用段定义语句定义每一个逻辑段;
  • 用ASSUME语句说明段约定;
  • 用汇编结束语句说明源程序结束。

2、代码表述

完整段定义格式:

.586               ;方式定义
DATA SEGMENT USE16 ;定义数据段
;....
DATA ENDS
CODE SEGMENT USE16  ;定义代码段
ASSUME CS:CODE,DS:DATA  ;说明段约定
BEG:MOV AX,DATA ;BEG为启动地址
    MOV DS,AX
	;....
    MOV AH,4CH
    INT 21H ;返回DOS
CODE ENDS
END BEG     ;汇编结束

:在汇编中,冒号后面表示注释内容。

二、汇编语言结构说明

1、方式选择伪指令

功能:通知汇编程序,源程序经过汇编链接后生成哪一种CPU类型的机器指令
应用:源程序第一条指令,指令以句号开头
例如.586
说明:不设置方式选择伪指令与设置.8086是等价的。
在这里插入图片描述

2、段定义语句

格式

段名 SEGMENT  定位参数链接参数'分类名' 段长度
段体
段名 ENDS

功能:是逻辑段的定界语句,源程序中每一个逻辑段都必须用定义语句定界

段名:无特别限制,只是为了说明,但通常便于阅读,我们通常会把DATA作为数据段的段名,用STACK作为堆栈段的段名,CODE为代码段的段名。
在这里插入图片描述

3、段约定语句

格式:ASSUME 段寄存器:段名,…,段寄存器:段名
功能:ASSUME语句通知汇编程序,寻址逻辑段使用哪一个寄存器
在这里插入图片描述

4、汇编结束语句

格式1:END 程序的启动地址标号
例如:END BEGIN
功能:通知汇编程序,源程序到此结束,用BEGIN作为标号的指令是程序的启动指令。
在这里插入图片描述
格式2:END
功能:通知汇编程序,源程序到此结束。在模块化程序的子模块中,必须用次格式作为源程序的最后一条语句。

5、返回DOS语句

程序在完成预定任务之后,必须返回DOS,返回DOS最常用的方法是使用DOS系统4CH功能调用,即连续执行以下2条指令:

MOV AH,4CH
INT 21H

三、实例

1、例子

题目:加法程序实现46H+52H,并将运算结果存在在数据段SUM中。
思路:先在数据段中定义一个随机字节,在代码段中,先将46H赋值一个通用寄存器,之后实现ADD相加指令,最后赋值给SUM。

.586
DATA SEGMENT USE16
SUM DB ?
DATA ENDS
CODE SEGMENT USE16
ASSUME CS:CODE,DS:DATA
SEG:MOV AX,DATA
    MOV DS,AX
    MOV AL,46H
    ADD AL,52H
    MOV SUM,AL
    MOV AH,4CH
    INT 21H
CODE ENDS
END SEG

注意:这里最后无输出,因为我们在这里只是做了相加后,存入数据段中,并没有显示在屏幕的功能。

2、汇编语言程序开发过程

在这里插入图片描述
在这里插入图片描述

四、功能调用

通过对DOS/BIOS调用,可以实现一些功能。
了解一下:
在这里插入图片描述

DOS功能调用

格式

MOV AH,功能号
设置入口参数
INT 21H
分析出口参数

操作图
在这里插入图片描述

1、功能号01H

作用:等待输入一个字符,有回显,以该字符的ASSCII码输出在屏幕上。
入口参数:无
出口参数:AL=按键的ASCII码。若AL=0,表明按键时功能键,需再次调用本功能,才能返回按键的扩展码。
举例

MOV AH,1
INT 21H

2、功能号02H

作用:显示一个字符
入口参数:DL=待显字符的ASCII码
出口参数:无
举例

MOV DL,41H ;显示‘AMOV AH,2
INT 21H

注意:该项功能会破坏AL寄存器的内容

3、功能号09H

作用:显示字符串
入口参数:DS:DX=字符首地址,字符串必须以‘$’为结束标志符。
出口参数:无
举例

.586
DATA SEGMENT USE16
MESG DB 'I AM HERE$'
DATA ENDS
CODE SEGMENT USE16
ASSUME CS:CODE,DS:DATA
BEG:
    MOV AX,DATA
    MOV DS,AX
LAST:
    MOV AH,9
    MOV DX,OFFSET MESG
    INT 21H
MOV AH,4CH
INT 21H
CODE ENDS
END BEG

大家可以看出来,利用9号功能调用时候,需要把字符串的偏移地址送到DX里面。

4、功能号0AH

作用:等待键入一串字符送用户程序数据缓冲区,并保存在缓冲区里,同时在屏幕上显示字符串。
入口参数
DS:DX=输入字符的缓冲区的首地址
在这里插入图片描述

5、举例

题目:询问用户姓名并等待用户键入,用户输入姓名后敲击回车键,程序再把键入的姓名复制到屏幕上。

.586
DATA SEGMENT USE16
MESG DB 'WHAT IS YOUR NAME? $'
BUF  DB 30
     DB ?
     DB 30 DUP(?)
DATA ENDS
CODE SEGMENT USE16
ASSUME CS:CODE,DS:DATA
BEG:
    MOV AX,DATA
	MOV DS,AX
AGAIN:
    MOV AH,9
	MOV DX,OFFSET MESG
	INT 21H ;询问姓名
	
	MOV AH,0AH
	MOV DX,OFFSET BUF
	INT 21H ;存入内存
	
	MOV BL,BUF+1
	MOV BH,0 ;实际键入字符个数给BX
	
	MOV SI,OFFSET BUF+2
	MOV BYTE PTR[BX+SI],'$'
	
	MOV AH,2
	MOV DL,0AH ;换行
	INT 21H
	
	MOV AH,9
	MOV DX,OFFSET BUF+2
	INT 21H
	
	MOV AH,4CH
	INT 21H
CODE ENDS
END BEG	
	

BIOS功能调用

1、功能号00H

在这里插入图片描述

2、功能号01H

在这里插入图片描述

3、功能号0EH(文本)

格式如下:
在这里插入图片描述
在这里插入图片描述

4、功能号13H

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/108519.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu编译 PCL 1.13.1 详细流程

Ubuntu编译 PCL 1.13. 详细流程 一、编译环境二、虚拟机准备1. 虚拟机扩容2. 配置交换分区 三、Cmake - gui 生成 MakeFile1. 解决 flann 依赖问题2. 配置 Cmake 四、编译安装1.编译:2. 安装 一、编译环境 Ubuntu:Ubuntu 20.04 VMware:VMwar…

统计学习方法 支持向量机(下)

文章目录 统计学习方法 支持向量机(下)非线性支持向量机与和核函数核技巧正定核常用核函数非线性 SVM 序列最小最优化算法两个变量二次规划的求解方法变量的选择方法SMO 算法 统计学习方法 支持向量机(下) 学习李航的《统计学习方…

VS工程的“多dll与exe文件合并”

运行环境 ILMerge插件 1、打开 VS的“工具 - NuGet包管理器 - 管理解决方案的NuGet程序包” 2、在浏览中搜索“ILMerge”,在官方源中,3.0.41版本的插件已不支持使用了 3、下拉列表其他版本可以安装,使用3.0.40 4、下载封装好的“ILMerge”任…

React-快速搭建开发环境

1.安装 说明:react-excise-01是创建的文件名 npx create-react-app react-excise-01 2. 打开文件 说明:we suggest that you begin by typing:下面即是步骤。 cd react-excise-01 npm start 3.显示

B. Qingshan Loves Strings(贪心规律)

Problem - B - Codeforces 解析&#xff1a; 首先判断 t 字符串是不是相邻不同并且两端不同。 然后遍历 s 并且判断每一个相邻的相同字符&#xff0c;必须 t 字符符合并且两侧不同。 #include<bits/stdc.h> using namespace std; #define int long long const int N2e55…

计算机视觉注意力机制小盘一波 (学习笔记)

将注意力的阶段大改分成了4个阶段 1.将深度神经网络与注意力机制相结合&#xff0c;代表性方法为RAM ⒉.明确预测判别性输入特征&#xff0c;代表性方法为STN 3.隐性且自适应地预测潜在的关键特征&#xff0c;代表方法为SENet 4.自注意力机制 通道注意力 在深度神经网络中…

状态机的设计与实现

写作目的 好久没有写博客进行输出了&#xff0c;是时候需要水一篇了&#xff0c;嘻嘻。 正好项目中使用了状态机&#xff0c;也借此分享一下系统中状态机的项目落地经验。 什么是状态机 以在某宝下单为例&#xff0c;在点击下单后&#xff0c;此时订单就已经创建了&#xff…

基于Python+pyecharts 实现国内上映电影票房评分可视化分析项目源码

基于Pythonpyecharts 实现国内上映电影票房评分可视化分析项目源码 项目内容 统计2018年在国内上映的所有电影&#xff0c;分别获取上映电影的票房、评分&#xff08;豆瓣、猫眼、时光、imdb&#xff09;、类型、上映日期、演员、导演等数据。利用所获数据绘图&#xff0c;对…

人工智能基础_机器学习006_有监督机器学习_正规方程的公式推导_最小二乘法_凸函数的判定---人工智能工作笔记0046

我们来看一下公式的推导这部分比较难一些, 首先要记住公式,这个公式,不用自己理解,知道怎么用就行, 比如这个(mA)T 这个转置的关系要知道 然后我们看这个符号就是求X的导数,X导数的转置除以X的导数,就得到单位矩阵, 可以看到下面也是,各种X的导数,然后计算,得到对应的矩阵结…

php之 角色的权限管理(RBAC)详解

RBAC&#xff08;Role-based access control&#xff09;是一种常见的权限管理模型&#xff0c;通过将用户分配至特定的角色&#xff0c;以及为角色分配访问权限&#xff0c;实现了权限管理的目的。以下是关于RBAC的详细解释&#xff1a; 角色&#xff1a;RBAC模型的核心是角色…

Java电商平台 - API 接口设计之 token、timestamp、sign 具体架构与实现|电商API接口接入

一&#xff1a;token 简介 Token&#xff1a;访问令牌access token, 用于接口中, 用于标识接口调用者的身份、凭证&#xff0c;减少用户名和密码的传输次数。一般情况下客户端(接口调用方)需要先向服务器端申请一个接口调用的账号&#xff0c;服务器会给出一个appId和一个key, …

常用JQuery插件汇总

Jquery插件&#xff0c;数字动画特效&#xff0c;从n到m数字跳动JJ​​​​​​​CountUp.jsA javascript class that animates a numerical value by counting to it.http://inorganik.github.io/countUp.js/

javaEE -10(11000字详解5层重要协议)

一&#xff1a;应用层重点协议 1.1&#xff1a; DNS DNS&#xff0c;即Domain Name System&#xff0c;域名系统。DNS是一整套从域名映射到IP的系统。 TCP/IP中使用IP地址来确定网络上的一台主机&#xff0c;但是IP地址不方便记忆&#xff0c;且不能表达地址组织信息&#x…

EASYX动画效果实现

eg1:绘制小球的动画效果 通过一下的代码实现小球从左向右移动效果&#xff0c;计算小球的移动速度和帧率实现移动效果平和造成视觉上的错觉 #include <stdio.h> #include <easyx.h> #include <iostream> #include <math.h> #define PI 3.14 // 1PI …

Android JNI/NDK 入门从一到二

1. 前言 最基础的创建JNI接口的操作&#xff0c;可以直接看这篇文章 : 第一个Android JNI工程&#xff0c; 本文会基于掌握创建JNI接口的操作的基础之上&#xff0c;来入门JNI/NDK。 2. 在JNI中打印日志 2.1 添加log模块 记得CMake中有log模块&#xff0c;不然编译不过 ta…

大模型之十九-对话机器人

大语言模型的最早应用是Chatbot&#xff0c;其实我最早接触语义理解在2014年&#xff0c;2014年做智能音箱的时候&#xff0c;那时也是国内第一批做智能音箱的&#xff0c;在现在看起来当时的智能音箱比较傻&#xff0c;很多问题无法回答&#xff0c;长下文效果也不好&#xff…

etcd的mvcc源码剖析

mvcc简介 悲观锁 在对于一些临界资源进行读写的时候&#xff0c;为了防止其他人进行同步的修改数据&#xff0c;直接将当前的数据锁住&#xff0c;不让别人使用&#xff0c;来实现并发安全 乐观锁 在对临界资源进行操作的时候&#xff0c;不锁住数据&#xff0c;实现独占&…

网络协议--TCP的交互数据流

19.1 引言 前一章我们介绍了TCP连接的建立与释放&#xff0c;现在来介绍使用TCP进行数据传输的有关问题。 一些有关TCP通信量的研究如[Caceres et al. 1991]发现&#xff0c;如果按照分组数量计算&#xff0c;约有一半的TCP报文段包含成块数据&#xff08;如FTP、电子邮件和U…

Elasticsearch跨集群检索配置

跨集群检索字面意思&#xff0c;同一个检索语句&#xff0c;可以检索到多个ES集群中的数据&#xff0c;ES集群默认是支持跨集群检索的&#xff0c;只需要动态的增加入节点即可&#xff0c;下面跟我一起来体验下ES的跨集群检索的魅力。 Elasticsearch 跨集群检索推荐的是不同集群…

linux中nginx配置https

一、版本适配 版本一定要适配&#xff0c;否则会报错各种参数定位不到不识别的错误&#xff0c;以下是版本适配信息&#xff0c;各位观客自行按照以下信息匹配版本。 Nginx 1.11.5及以上版本与OpenSSL 1.0.2及以上版本兼容。Nginx 1.15.2及以上版本与OpenSSL 1.1.1及以上版本兼…