基于Keil a51汇编 —— 程序模板文件以及规则

程序模板文件

下面的代码模板包含有关如何编写自己的程序集模块的指南和提示。此模板文件模板。A51 在文件夹 \C51\ASM 中提供。

$NOMOD51                ; 禁用预定义的 8051 寄存器
#include <reg52.h>      // 包含头文件;
;根据需要更改小写名称。
;该汇编模板让你了解如何使用 A251/A51汇编器。 您不必以这种方式构建每个模块,这只是举例说明。
;除了文件末尾的 END 语句外,所有条目都是可选的。
;如果使用此模板,请确保删除任何未使用的段声明、以及未使用的变量空间和汇编指令。
;本文件无法提供 A251/A51 汇编程序的所有可能用途。;
; Module name (模块名)
;
NAME            module_name  ;通用汇编文件名;
; 在这里,您可以导入其他模块的符号。
;
EXTRN   CODE   (code_symbol)    ; 可以是code 段或者带有code指令的函数入口声明EXTRN   DATA   (data_symbol)    ; data数据声明EXTRN   BIT    (bit_symbol)     ; Bit 位声明EXTRN   XDATA  (xdata_symbol)   ; XDATA 数据声明EXTRN   NUMBER (typeless_symbol);  使用EQU or SET定义的声明;
; 可以一次性定义多个声明
;
EXTRN   CODE (sub_routine1, sub_routine2), DATA (variable_1);
; 在列表文中强制分页
;
$EJECT;
; 声明此处的符号可供其他模块使用
;
PUBLIC  data_variable
PUBLIC  code_entry
PUBLIC  typeless_number
PUBLIC  xdata_variable
PUBLIC  bit_variable;
; 可以一次性定义多个声明
;
PUBLIC  data_variable1, code_table, typeless_num1, xdata_variable1;
; Put the STACK segment in the main module.
;
?STACK          SEGMENT IDATA           ; 在IDATA ram中定义StackRSEG    ?STACK          ; 切换到?STACKDS      5               ;  保留5个STACK空间$EJECT;
; 将段落和变量声明放在此处
;;
; DATA SEGMENT(数据段) DATA RAM 中的预留空间 如果不使用,则删除该数据段。
;
data_seg_name   SEGMENT DATA            ; 声明在DATA RAM中的全局变量数据. RSEG    data_seg_name   ;  切换至该段
data_variable:  DS      1               ;  定义变量data_variable并申请1个字节空间
data_variable1: DS      2               ;  定义变量data_variable1并申请2个字节数组;
; DATA SEGMENT(数据段) DATA RAM 中的预留空间 如果不使用,则删除该数据段。
;
data_seg_name   SEGMENT DATA    OVERLAYABLE        ; 声明在DATA RAM中的局部变量数据. RSEG    data_seg_name   ;  切换至该段
data_variable:  DS      1               ;  定义变量data_variable并申请1个字节空间
data_variable1: DS      2               ;  定义变量data_variable1并申请2个字节数组
;
; XDATA SEGMENT 在 XDATA RAM 中预留空间 如果不使用,则删除该段。
;
xdata_seg_name  SEGMENT XDATA           ; 声明XDATA RAM段.RSEG    xdata_seg_name  ;  切换至该段
xdata_variable: DS      1               ; 
xdata_array:    DS      500             ;  定义变量xdata_array并申请500个字节数组;
; INPAGE XDATA SEGMENT 在 XDATA RAM 页面中保留空间(页面大小:256 字节)
; INPAGE 段适用于 @R0 寻址方法。
; 无用则删除
;
page_xdata_seg  SEGMENT XDATA INPAGE  RSEG    xdata_seg_name  
xdata_variable1:DS      1             ;
; ABSOLUTE XDATA SEGMENT 在 XDATA RAM 中保留绝对地址空间。
; ABSOLUTE 段对内存映射 I/O 非常有用。
;XSEG    AT 8000H        ; 定位到位于XDATA 中8000H的地址
XIO:            DS      1              
XCONFIG:        DS      1             ;
;BIT SEGMENT 保留 BIT RAM 中的空间 如果未使用,则删除该段。
;
bit_seg_name    SEGMENT BIT         RSEG    bit_seg_name   
bit_variable:   DBIT    1               ; 申请1Bit的位空间给bit_variable
bit_variable1:  DBIT    4     ;
; 在此处添加常量(无类型)数字。
;
typeless_number    EQU     0DH               
typeless_num1       EQU     typeless_number(8)     $EJECT;
;提供一个 LJMP,以主模块中的复位地址(地址 0)为起点
; 您可以将这种样式用于中断服务例程。
;CSEG    AT      0       ; 代码初始0地址LJMP    start         ;
; CODE SEGMENT(代码段) 在 CODE ROM 中为汇编指令预留空间。
;
code_seg_name   SEGMENT CODERSEG    code_seg_name  USING   0               ;  使用寄存器bank0start:          MOV     SP,#?STACK 1    ; 赋值指针;
;在此处插入您的汇编程序。 注意,下面的代码是非功能性的。
;ORL     IE,#82H         ; enable interrupt system (timer 0)SETB    TR0             ; enable timer 0
repeat_label:   MOV     A,data_symbolADD     A,#typeless_symbolCALL    code_symbolMOV     DPTR,#xdata_symbolMOVX    A,@DPTRMOV     R1,APUSH    AR1CALL    sub_routine1POP     AR1ADD     A,R1JMP     repeat_labelcode_entry:     CALL    code_symbolRET                                           ;程序结束code_table:     DW      repeat_labelDW      code_entryDB      typeless_numberDB      0
$EJECT;
; 要包含中断服务例程,请向 ISR 提供一个 LJMP跳转到中断服务程序
;CSEG    AT  0BH         ; 0BH   timer0中断入口LJMP    timer0int;
; 定义中断服务代码段
;
int0_code_seg   SEGMENT CODE         RSEG    int0_code_seg  USING   1               ; 使用寄存器bank1timer0int:      PUSH    PSWMOV     PSW,#08H        ; register bank 1PUSH    ACCMOV     R1,data_variableMOV     DPTR,#xdata_variableMOVX    A,@DPTRADD     A,R1MOV     data_variable1,ACLR     AADD     A,#0MOV     data_variable1+1,APOP     ACCPOP     PSWRETI;
; END必须有
;END             ; 文件结束

SEGMENT段名命名规

?存储器类型区分符?<函数名>?模块名 SEGMENT [段类型]
例:

 ?PR ? FUNCTION_NAME ? MODULE_NAME Segment  Code

全局变量与局部变量申明

全局变量

?存储器类型区分符? 模块名 SEGMENT 段类型 , 例:

 ?DT ? MAIN     SEGMENT DATA 

局部变量

  • 局部数据段的声明形式为:? 储存器类型区符?函数名?模块名 SEGMENT 段类型 OVERLAYABLE
  • 其中储存器类型的确定与全局数据段中的规则相同。当汇编程序按照C编译器编译的代码规则编写连接器将能对程序数据段进行覆盖分析。声明中的“OVERLAYABLE”标志就是用来打开段的覆盖属性,允许连接器进行覆盖分析。没有这个属性则段中的变量将一直占用这些空间,这样会降低储存器利用效率。
 ?DT ? main ? MAIN     SEGMENT DATA  OVERLAYABLE

类型列表:

段前缀C51存储类型汇编语言段类型说明
?PR?programCODE可执行程序代码代码
?CO?codeCODE程序存储区的常数数据
?BI?bitBIT内部数据区的位寻址数据
?BA?bdataBDATA内部数据区的可位寻址数据
?DT?dataDATA内部数据区 (SMALL存储模式)
?FD?farfar存储区(RAM空间)
?FC?const farFAR存储区(ROM空间)
?ID?idaraIDATA间接寻址内部数据区
?PD?pdataXDATA INPAGE外部数据区的分页数据 (COMPACT存储模式)
?XD?xdataXDATAXDATA存储区(ram空间,LARGE存储模式)
?XC?const xdataCODEXDATA存储区(rom空间)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[PwnThyBytes 2019]Baby_SQL - 代码审计+布尔盲注+SESSION_UPLOAD_PROGRESS利用

[PwnThyBytes 2019]Baby_SQL 1 解题流程1.1 分析1.2 解题 2 思考总结 1 解题流程 1.1 分析 此题参考文章&#xff1a;浅谈 SESSION_UPLOAD_PROGRESS 的利用 访问正常来讲用ctf-wscan是能扫出source.zip文件的&#xff0c;且F12后提示了有source.zip&#xff0c;那我们就下载…

多项目并行管理:优化协调策略提高效率

多项目同时进行已然是大部分项目管理者面临的现状了。相比于单项目管理&#xff0c;多项目管理可能会出现项目资源分配不均&#xff0c;项目进度监控难以及沟通协作复杂等问题。 可以通过一款灵活高效得项目管理工具&#xff0c;来帮助您进行多项目管理&#xff0c;比如 Zoho …

文件解析的方法与原理

文件的解析使用python的struct模块,接下来会用到的2个方法: 解包unpack()方法 : 使用该方法可以从写好的二进制文件中读出文件。它的函数原型为:struct.unpack(fmt,string),fmt参数是格式字符串。string表示要转换的python值。最终函数返回一个元组。 calcsize()方法 : 该方法用…

【原理学习】互斥量机制与条件变量机制一起使用

互斥量机制 互斥量是多线程机制的一种。互斥量&#xff08;Mutex&#xff09;是一种用于实现线程互斥访问共享资源的机制&#xff0c;通过互斥量可以保证在同一时间内只有一个线程可以访问共享资源&#xff0c;从而避免多线程并发修改共享资源导致的数据不一致问题。 在多线程…

libgedit-amtk和amtk冲突不能升级

[SOLVED] Cant update the system / Pacman & Package Upgrade Issues / Arch Linux Forums sudo pacman -Rd amtk 单独删除 amtk 包就行了。

美容类产品找什么渠道做推广比较好,媒介盒子告诉你

哈喽,大家好,今天媒介盒子小编又来跟大家分享软文推广的干货知识了,本篇分享的主要内容是:美容类产品找什么渠道做推广比较好~ 随着如今生活条件的进步&#xff0c;越来越多人的女性开始注重对自身的保养。她们会在市场上搜罗大量的美容护肤类服务和产品&#xff0c;这也给了无…

MFC文本输出学习

void CTxttstView::OnDraw(CDC* pDC) {CTxttstDoc* pDoc GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data hereCString str1;pDC->SetBkColor(RGB(0,0,0));pDC->TextOut(50, 50, "一段文字");pDC->SetBkColor(RGB(255,255,255))…

深入浅出:react高阶成分(HOC)的应用

React中的HOC&#xff08;Higher-Order Component&#xff09;是一种高阶组件的模式&#xff0c;它是一个函数&#xff0c;接收一个组件作为参数&#xff0c;并返回一个新的包装组件。HOC可以用于增强组件的功能&#xff0c;例如添加属性、处理生命周期方法、共享状态等。 HOC…

【MySQL】基本查询(三)聚合函数+group by

文章目录 一. 聚合函数二. group by子句结束语 建立如下表 //创建表结构 mysql> create table exam_result(-> id int unsigned primary key auto_increment,-> name varchar(20) not null comment 同学姓名,-> chinese float default 0.0 comment 语文成绩,->…

spark3使用hive zstd压缩格式总结

ZSTD&#xff08;全称为Zstandard&#xff09;是一种开源的无损数据压缩算法&#xff0c;其压缩性能和压缩比均优于当前Hadoop支持的其他压缩格式&#xff0c;本特性使得Hive支持ZSTD压缩格式的表。Hive支持基于ZSTD压缩的存储格式有常见的ORC&#xff0c;RCFile&#xff0c;Te…

基于地理位置的IP地址定位技术

IP地址定位是指通过互联网上的IP地址&#xff0c;准确地定位出该IP地址对应的物理位置。IP地址是互联网上设备之间通信时使用的一个地址标识符&#xff0c;每个设备都有一个唯一的IP地址。 IP地址定位的原理是通过收集和分析网络设备的IP地址和相应的网络数据&#xff0c;以确定…

华为云云耀云服务器L实例评测|测试CentOS的网络配置和访问控制

目录 引言 1 理解几个基础概念 2 配置VPC、子网以及路由表 3 配置安全组策略和访问控制规则 3.1 安全组策略和访问控制简介 3.2 配置安全组策略 3.3 安全组的最佳实践 结论 引言 在云计算时代&#xff0c;网络配置和访问控制是确保您的CentOS虚拟机在云环境中安全运行的…

淘宝商品链接获取淘宝商品详情数据(用 Python实现淘宝商品信息抓取)

在网页抓取方面&#xff0c;可以使用 Python、Java 等编程语言编写程序&#xff0c;通过模拟 HTTP 请求&#xff0c;获取淘宝多网站上的商品页面。在数据提取方面&#xff0c;可以使用正则表达式、XPath 等方式从 HTML 代码中提取出有用的信息。值得注意的是&#xff0c;淘宝网…

Python中如何快速解析JSON对象数组

嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 由于浏览器可以迅速地解析JSON对象&#xff0c;它们有助于在客户端和服务器之间传输数据。 本文将描述如何使用Python的JSON模块来传输和接收JSON数据。 JavaSc…

爬虫项目(九):实时抓取csdn热榜数据

一、书籍推荐 推荐本人书籍《Python网络爬虫入门到实战》 ,详细介绍见👉: 《Python网络爬虫入门到实战》 书籍介绍 二、完整代码 # 使用selenium爬取热榜 # 热榜地址:https://blog.csdn.net/rank/list # 获取标题、浏览量、评论数量、收藏数量from selenium import web…

【JavaEE】多线程(五)- 基础知识完结篇

多线程&#xff08;五&#xff09; 文章目录 多线程&#xff08;五&#xff09;volatile关键字保证内存可见性JMM&#xff08;Java Memory Model&#xff09; 不保证原子性 wait 和 notifywait()notify()线程饿死 上文我们主要讲了 synchronized以及线程安全的一些话题 可重入…

故障注入常用方法有哪些 其重要性是什么

故障注入是一种有效的测试方法&#xff0c;可用于评估系统对异常情况的响应。通过这种测试方法&#xff0c;可以发现系统中的潜在问题&#xff0c;并采取适当措施来改进系统的质量和性能。本文将介绍故障注入常用方法及重要性! 一、故障注入常用方法 1、随机故障注入&#xff1…

Kotlin的关键字 lateinit 和 lazy

序、完善一下曾经的草稿。 Kotlin通常要求我们在定义属性后立即对起进行初始化&#xff0c;当我们不知道理想的初始值时&#xff0c;这样做似乎很奇怪&#xff0c;尤其是在生命周期驱动android属性的情况下。 lateinit 简介 lateinit&#xff0c;Kotlin提供的一个可以延迟初…

《向量数据库指南》——向量数据库 有必要走向专业化吗?

向量数据库 有必要走向专业化吗? 向量数据库系统的诞生,来源于具体业务需求——想要高效处理海量的向量数据,就需要更细分、更专业的数据基础设施,为向量构建专门的数据库处理系统。 但这种路径是必须的吗? 从产品层面讲,如果传统数据库厂商不单独研发向量数据库,那么…

Postgresql中的C/C++混编(JIT)

1 Postgresql编译JIT 整体上看使用了GCC、G编译文件&#xff0c;最后用G汇总&#xff1a; GCC编译的三个.o文件llvmjit、llvmjit_deform、llvmjit_expr llvmjit.c -> llvmjit.o gcc -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -…