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

news2024/11/15 9:14:49

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

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

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

而$符号是告诉汇编程序,这个符号后的数值为一个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"。这个机器码我们会经常用到。

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

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

相关文章

Dtop环球嘉年华“全球Web 3.0商业场景应用峰会暨2024战略研讨会”曼谷圆满举办

Dtop环球嘉年华“全球Web 3.0商业场景应用峰会暨2024战略研讨会” (Global Web 3.0 Business Scene Application Summit And 2024 Strategic Symposium)在2024年1月12日于泰国曼谷举办,峰会以“全球Web 3.0商业场景应用生态”为主题&#xff…

vue3中,vue-echarts基本使用(柱状图、饼图、折线图)

注意:vue-echarts在使用前要先安装echarts,不要只安装vue-echarts这一个 echarts官网地址:Apache EChartsApache ECharts,一款基于JavaScript的数据可视化图表库,提供直观,生动,可交互&#xf…

SpringMVC中五种数据提交的方式

单个数据注入:在方法中声明一个和表单提交的参数名称相同的参数,由框架按照名称直接注入。对象封装注入:在方法中声明一个自定义的实体类参数,框架调用实体类中相应的setter方法注入属性值,只要保证实体类中成员变量的…

JAVAEE初阶 多线程进阶(二)

多线程进阶相关知识点 一.CAS1.1 CAS的原子类1.2 实现自旋锁1.3CAS中的ABA问题1.4 ABA问题的解决 二. callable接口三.reentrantLock3.1 reentrantLock与synchronized区别 四.信息量 semaphore五. CountDownLatch六. concurrentHashMap6.1 concurrentHashMap的优点 一.CAS CAS …

【SpringMVC】—— 如何配置使用SpringMVC(详细步骤)

目录 引言 使用 1、新建模块 2、导入坐标 3、创建SpringMVC控制器类 4、初始化SpringMVC环境 5、初始化Servlet容器,加载SpringMVC环境 6、配置运行 引言 SpringMVC是一种基于Java实现MVC模型的轻量级Web框架,SpringMVC是表现层(web层)的框架,也…

评职称到底能给你带来什么❓❓

对于个人来说的用处: ①升职加薪 职称等级越高,职位越高,可享受的待遇就越高 ②前置资格 早评职称,前置职称就可以早几年拿,才能更快 评审更高级职称 ③提高个人身份 职称是专业技术人员能力和水平的表现,是…

吼!原来教师这样发布学生期末成绩,轻松没烦恼

​随着科技的进步和教育的不断创新,教师发布学生期末成绩的方式也在逐渐发生变化。传统的方式,如纸质成绩单和口头通知,已经不能满足现代教育的需求。那么,教师应该如何更有效地发布学生期末成绩呢? 一、电子成绩单 电…

Unity | AudioSource 无声音

Unity | AudioSource 无声音 你是否也会遇到相同的问题?AudioSource没声音? 解决: 注意查看一下几处声音设置:

Java多线程——并发和并行、实现方法

多线程 并发和并行 实现方法 代码演示 方式一 package com.qiong.thread1;public class MyThread extends Thread{Overridepublic void run() {for (int i 0; i < 20; i) {System.out.println(getName() "Hello World");}} }package com.qiong.thread1;public…

linux 时间同步后还是偏移

通过crond 设置定时一分钟同步一次时间&#xff1b; 查看日志每次同步都偏移几秒 怀疑是其他程序又做了时间同步&#xff1b; 检查发现有chronyd服务在运行。chronyd也是同步时间的服务 最终解决&#xff1a;关闭chronyd或者用chronyd同步时间 systemctl stop chronydsystemc…

如何优雅地使用Jupyter?基本用法及Jupyter插件使用

Jupyter是一种常用的交互式编辑器&#xff0c;下面我将分享Jupyter的基本用法&#xff0c;以及在日常写代码中使用最多的两个Jupyter插件&#xff0c;一个是JupyterLab&#xff0c;另一个用于给代码生成目录&#xff0c;熟练使用这两个插件&#xff0c;可极大提高我们的代码效率…

腾讯云服务器购买指南,2024更新购买步骤

腾讯云服务器购买流程很简单&#xff0c;有两种购买方式&#xff0c;直接在官方活动上购买比较划算&#xff0c;在云服务器CVM或轻量应用服务器页面自定义购买价格比较贵&#xff0c;但是自定义购买云服务器CPU内存带宽配置选择范围广&#xff0c;活动上购买只能选择固定的活动…

开源笔记工具AFFiNE本地部署并结合内网穿透

前言 本篇文章讲解Notion开源平替全能知识库工具AFFINE如何本地部署&#xff0c;并实现公网远程访问。AFFiNE 是一个全新的开源项目&#xff0c;旨在克服 Notion 和 Miro 在安全和隐私方面的一些局限性。它的设计目标是帮助用户将会议记录、待办事项、文档中的目标、视频会议白…

L1-025 正整数A+B(Java)

题的目标很简单&#xff0c;就是求两个正整数A和B的和&#xff0c;其中A和B都在区间[1,1000]。稍微有点麻烦的是&#xff0c;输入并不保证是两个正整数。 输入格式&#xff1a; 输入在一行给出A和B&#xff0c;其间以空格分开。问题是A和B不一定是满足要求的正整数&#xff0…

基于Simdroid电子散热模块的电子设备机箱散热设计与优化

一、背景介绍 热设计就是通过合理的散热方式保证良好的热环境&#xff0c;确保电子设备可靠的工作。随着电子技术的迅速发展&#xff0c;电子设备的结构越来越复杂&#xff0c;且越来越趋于小型化&#xff0c;散热问题成为了影响设备可靠性的重要因素。据统计&#xff0c;电子…

NLP(十八):LLM 的推理优化技术纵览

原文&#xff1a;NLP&#xff08;十八&#xff09;&#xff1a;LLM 的推理优化技术纵览 - 知乎 目录 收起 一、子图融合&#xff08;subgraph fusion&#xff09; 1.1 FasterTransformer by NVIDIA 1.2 DeepSpeed Inference by Microsoft 1.3 MLC LLM by TVM 二、模型压…

freerRTOS

使用计数型信号量设计&#xff1a;生产者和消费者模型 代码&#xff0b;结果图

如何检查Post body并作出响应?

如果需要针对POST body中包含的参数对传入的请求作出响应&#xff0c;你打算怎么做&#xff1f;其实在使用Akamai EdgeWorkers的情况下&#xff0c;只需要一些高级MD&#xff08;MetaData&#xff09;技巧&#xff0c;这一切实现起来可以变得非常简单。 Akamai EdgeWorkers是什…

20240115在ubuntu20.04.6下查看显卡信息

20240115在ubuntu20.04.6下查看显卡信息 2024/1/15 17:33 百度&#xff1a;ubuntu查看显卡型号命令 https://linux.xiaosiseo.com/post/6037.html#id4 Ubuntu查看显卡信息命令 小四LINUX7个月前 (05-22)Ubuntu3230 小四LINUX&#xff0c;是小四运营旗下网站&#xff0c;专注LIN…

Kubernetes (十三) 存储——持久卷-动静态分配

一. 简介 二. NFS持久化存储步骤&#xff08;静态分配&#xff09; 1. 集群外…