街机模拟游戏逆向工程(HACKROM)教程:[2]68K汇编的一些规则

指令中的符号(#,$,%)

在指令中,我们最常见到的符号有#和$。

这其中的"#"符号是告诉汇编程序,这个符号后面的数值为一个立即数,而不是一个偏移值或一个地址。立即数可以理解为"单纯的一个数值"。我们会在后面通过一些实例来更详细说明什么叫立即数。

而$符号是告诉汇编程序,这个符号后的数值为一个16进制数值;如果符号为%,那它后面的数值为一个2进制的数值;如果没有任何符号,它后面的数为一个10进制数值。

我们来看以下几条代码:

move.b #%00010000,d0
move.b #16,d0
move.b #$10,d0

上面这几条指令的意思是一样的,第一行是2进制数值(%),第二行是10进制数值,最后一行是16进制数值($)

我们可以用计算器来查看各个进制之间的换算

我们回到立即数的问题,我们用两行代码来进行测试,更详细地说明什么是立即数

move.b  #$10,d0
*这条指令将会把$10这个数值置入到d0寄存器。

move.b  $10,d0
*这条指令将会读取地址$10处的字节,然后把它复制到d0寄存器,如果$10位置的值是88,那么d0寄存器的值也会在这条指令执行后变成88。

我们先来测试第一个指令:

*-----------------------------------------------------------
* Title      :
* Written by :
* Date       :
* Description:
*-----------------------------------------------------------
    ORG    $1000
START:                  ; first instruction of program

* Put program code here
    move.b #$10,d0 

    SIMHALT             ; halt simulator

* Put variables and constants here

    END    START        ; last line of source

 运行后的结果


*-----------------------------------------------------------
* Title      :
* Written by :
* Date       :
* Description:
*-----------------------------------------------------------
    ORG    $1000
START:                  ; first instruction of program

* Put program code here
    move.b #$88,$10     *把$88立即数 置入 地址$10
    move.b $10,d0       *把$10地址的值 置入 D0寄存器

    SIMHALT             ; halt simulator

* Put variables and constants here

    END    START        ; last line of source

运行结果:

奇数地址

至些为止,我们尝试了几个指令的执行,在了解更多的指令之前,我们还需要了解一些比较重要的东西。

我们刚刚测试了从内存中读写的例子:

move.b $10,d0

我们可以在操作长度为单字节的情况下,用奇数地址对内存进行读写,比如:

move.b $11,d0

但很重要的是,我们如果在操作双字节或四字节长度时,不能对奇数地址进行读写,比如下面的代码是一个非法的例子:

move.w $11,d0

move.l $11,d0

该规则对所有指令适用,所以,我们需要保证,需要从奇数地址读写数据时,只能读写单字节长度的数据。

标签

标签由字母、数字和下划线组成,必须以下划线、@符号或字母开头。标签后面可以有可选的冒号。标准汇编语言约定使用以“@”开头的标签作为过程或函数的本地标签。与其他类型的标识符一样,标签不区分大小写。

标签可以在任何指令的前面,我们可以在很多指令中使用标签功能,最常见的是jmp之类的跳转指令,比如:

   ORG     $100
START:

	move.w	d0, d1
	add.w	d1, d1
	add.w	d1, d0
	jmp	    label
	add.w	d2, d3
	asr.w	#$04, d0

label:
	move.w	d0, d2 

    END    START

我们可以测试这段代码,我们可以看到代码中的label:就是一个标签,当执行jmp  label时,程序会把label:标签所在的地址传递到PC寄存器。

   ORG     $100
START:
    movea.l #label,a0
    
label:
    move.w  d0,d2

    END    START

在这段代码中,当执行movea.l  #label,a0时,程序会把label:向在的地址传递到a0寄存器。

ORG指令

该指令声明了在内存中加载后续指令和数据的位置。

    ORG     $100
START:
    move.b  d0,d1
    
    ORG     $200
    move.b  d2,d3
    END    START

 

我们可以看到,第一句move指令被保存在了地址$100,第二句move指令被保存在了地址$200。

dc指令

定义常量。DC指令将指定的数据或字符串放置在指令流中。也可以把字符定义到指令流中。

我们可以测试:

   ORG     $100
START:
    dc.b    'abcd'
    dc.b    $01 , $02 , $03 , $04
    dc.w    $1010 , $1234
    dc.l    $30303030

    END    START

我们可以看到,该指令会把操作数直接置入到指令流中,当操作数为字符串时,会把该字符的ASCII码对应的值置入指令流。

ds指令

该指令会声明一段空白的内存空间。声明空间的大小由操作数和操作长度决定。

   ORG     $100
START:
    ds.b    $10
    dc.l    $00010203 , $04050607, $08090a0b, $0c0d0e0f
    ds.w    $10
    dc.l    $00010203 , $04050607, $08090a0b, $0c0d0e0f
    ds.l    $10
    dc.l    $00010203 , $04050607, $08090a0b, $0c0d0e0f
    END    START

我们可以看到,三个ds的指令虽然操作数都相同,但操作长度不同,所以,声明的空间大小也不同。

nop指令

该指令在程序中不起任何作用,我们可以把他想象为一个空指令,在逆向研究中,我们常常会用到该指令来对程序进行一些测试。

nop指令固定是占用2个字节的存储空间,它经过编译器编译后生成的机器码为"4E71"。这个机器码我们会经常用到。

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

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

相关文章

GPT有什么用?对哪些行业帮助比较大?无际Ai带来介绍

GPT 是“Generative Pre-trained Transformer”的缩写。这是一种由 OpenAI 开发的人工智能语言模型,它采用了变压器(Transformer)架构,并且在大规模文本数据上进行了预训练。GPT 系列模型的目标是生成具有高度连贯性和语义合理性的…

WordPress如何修改旧文章的发布日期让其变成新文章发布?

我们个人网站发展一段时间后,可能就不懂得发布什么内容了,这个时候可以考虑翻看以前的旧文章,必要时对其进行适当修改,然后修改它的发布日期变成当前日期重新发布,这样就会变成新文章重新出现在我们首页的文章列表中。…

【教学类-43-21】20240113 数独(三)11-12-13-14-15宫格 无空行A4模板 上下结构(附加3宫格 4宫格)

作品展示: 11-15宫格 A4 两份 下面空行做一点4-5宫格题目 : 已经制作没有分割线的连在一起的3-10宫格模板 【教学类-43-19】20240113 数独(一) 3-5-6-7-8-10宫格 无空行A4模板-CSDN博客文章浏览阅读399次,点赞13次…

3D建模素材分层渲染怎么操作?

在3D建模素材分层渲染过程中,需要将场景中的元素分到不同的层里,然后分别进行渲染。以下是一个简单的方法: 1、打开要渲染的3D建模素材。 2、在场景中选择要分层的元素,然后在软件的图层面板中新建图层,将元素拖拽到新…

代码随想录算法训练营第6天 | 242.有效的字母异位词 , 349. 两个数组的交集 , 202. 快乐数 , 1. 两数之和

哈希知识基础 文章链接:https://programmercarl.com/%E5%93%88%E5%B8%8C%E8%A1%A8%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html#%E5%93%88%E5%B8%8C%E8%A1%A8 242.有效的字母异位词 题目链接:https://leetcode.cn/problems/valid-anagram/description/…

CentOS7中将MySQL注册为系统服务开机启动

实际生产环境中为了避免重启服务器后所有的服务都手动启动带来的麻烦,建议所有基础服务都设置为开机自动启动。本章节我们主要演示在Centos7中如何将MySQL注册为系统服务,并实现开机自动启动。 ① 手动启动mysql,查看进程信息,复制…

手机上最危险的3个操作,千万小心!

普通人千万不要在手机上做这3个操作,否则你的手机早晚会被黑客入侵了。 第一种,苹果越狱 越狱虽然可以绕过限制给你的苹果安装上一些特殊软件,但只要是越狱之后的苹果手机,都将留下漏洞,黑客最喜欢寻找做过越狱的手机…

【计算机组成-算术逻辑单元】

课程链接:北京大学陆俊林老师的计算机组成原理课 1. 算术运算和逻辑运算 算数运算 逻辑运算 算数逻辑运算的需求 算数运算:两个32-bit数的加减法,结果为一个32-bit数;检查加减法的结果是否溢出逻辑运算:两个32-bit数…

如何优化大型语言模型,让AI回应更智能、更准确?

什么是检索增强生成(RAG)? 检索增强生成(RAG)是一种优化大型语言模型输出的过程,它在生成回应之前会参考其训练数据源之外的权威知识库。大型语言模型(LLM)在大量数据上进行训练,使…

MIT 6s081 blog 1.xv6内存管理

xv6内存管理部分 xv6内存布局 内核地址空间 如xv6指导书中图3.3:从0x80000000开始的地址为内核地址空间,CLINT、PLIC、uart0、virtio disk等为I/O设备(内存映射I/O),可以看到xv6虚拟地址到物理地址的映射&#xff0…

国产芯片应用于安防音频接口的选型分析,96KHZ 立体声ADC且高性能

在人工智能兴起之后,安防市场就成为了其全球最大的市场,也是成功落地的最主要场景之一。对于安防应用而言,智慧摄像头、智慧交通、智慧城市等概念的不断涌现,对于芯片产业催生出海量需求。今天,我将为大家梳理GLOBALCH…

牛客周赛 Round 2 解题报告 | 珂学家 | 字符串hash + 打家劫舍型DP + 离线双指针

前言 在黎明到来之前,必须有人稍微照亮黑暗。 整体评价 比赛的时候,A题用了字符串Hash,哭了。B题是经典题,C是模拟题,很怕的. D也是经典题,离散双指针,套路满满。 A. 小红的环形字符串 因为长…

识别卷子怎么弄?分享3款神奇的试卷识别软件!

在当今信息爆炸的时代,随着科技的飞速发展,人工智能已经深入到我们生活的方方面面。其中,试卷识别软件作为教育领域的一大亮点,正逐渐受到越来越多的关注。这类软件不仅能帮助教师减轻批改试卷的负担,还能提高工作效率…

创建YonBIP模块项目

设置UAP HOME: 新建项目:File > New > Other > YonBuilder Premium Development 创建工程和模块成功 新建业务组件currtype 新建业务组件成功

Docker容器(二)安装与初体验wordpress

一、安装 1.1关闭SeLinux SeLinux(Security-Enhanced Linux)是一种基于Linux内核的安全模块,旨在提供更严格的访问控制和安全策略。它通过强制实施安全策略来限制系统资源的访问,从而保护系统免受恶意软件和未经授权的访问。 在…

探索金融管理硕士项目:中国社科院与美国杜兰大学携手培养未来金融精英

在当今竞争激烈的金融行业中,拥有卓越的专业知识和技能是取得成功的重要因素。而中国社科院与美国杜兰大学金融管理硕士项目,以其严谨的学术要求和实践导向的教学方法,为学生提供了绝佳的学习和成长机会。 中国社科院与美国杜兰大学金融管理硕…

深度探讨 Golang 中并发发送 HTTP 请求的最佳技术

💂 个人网站:【 海拥】【神级代码资源网站】【办公神器】🤟 基于Web端打造的:👉轻量化工具创作平台💅 想寻找共同学习交流的小伙伴,请点击【全栈技术交流群】 在 Golang 领域,并发发送 HTTP 请求…

Java学习(十八)--网络编程

介绍 需求 如何准确地定位网络上一台或多台主机; 定位主机上的特定的应用 找到主机后如何可靠高效地进行数据传输 目的 直接或间接地通过网络协议与其它计算机实现数据交换,进行通讯; 网络通信 网络:两台或多台设备通过一…

详解SpringCloud微服务技术栈:Nacos服务搭建及服务分级存储模型

👨‍🎓作者简介:一位大四、研0学生,正在努力准备大四暑假的实习 🌌上期文章:详解SpringCloud微服务技术栈:强推!源码跟踪分析Ribbon负载均衡原理、Eureka服务部署 📚订阅…

MIT 6s081 lab 1.Xv6 and Unix utilities

Lab1: Xv6 and Unix utilities 作业网址:https://pdos.csail.mit.edu/6.828/2020/labs/util.html Boot xv6(easy) 下载,启动xv6系统 $ git clone git://g.csail.mit.edu/xv6-labs-2020 Cloning into xv6-labs-2020... ... $ cd xv6-labs-2020 $ git …