试图理解这个简短的汇编指令,但我不明白

2023-12-13

我们有一个任务,给定的是 2 寻址的汇编指令 机器:

mov 202, 100[r1+]

记下替代此的最小汇编指令序列 说明(见上文)

where

  • n[rx+]:按后增量索引的寄存器; n 是索引值,rx 是寄存器 x

  • 单个数值:直接寻址/存储

我们应该使用的地址是:

  1. rx- 寄存器直接寻址
  2. [rx]- 寄存器间接寻址
  3. #n- 直接寻址

而且我们只允许使用add、sub、mov。

我特别不明白 # 代表什么以及为什么我们需要减法,实际上我真的不明白任何东西...... 任务已经解决了,所以我不再寻找解决方案。我需要一个解释它是如何完成的,试图自己理解它,但它不起作用。 我希望有人能够帮助我,你会非常好!

解决方案:

add #100, r1
mov #202, r2
mov[r2],[r1]
sub #99, r1

了解汇编语言不是某种通用的标准化东西。它由读取它的程序(即汇编程序)正式定义。因此,无论该代码定义为该汇编程序的语言,就是该语言。机器代码对处理器来说很重要,因此您可以拥有与用户一样多的不同汇编程序和汇编语言,只要它们都生成正确的机器代码即可。因此,如果您期望这是普遍适用的,则一条规则适用于所有情况,但事实并非如此。

不过,您已经为有经验的人提供了足够的信息,让他们可以看到此处反映的其他汇编语言的习惯。

mov 202, 100[r1+]

因此,正如您所说,这似乎正在移动 202 寄存器直接寻址的地址。到地址 r1+100 寄存器索引的位置和后增量。

用更多指令替换它,因为就代码行而言,一行是最简单的一行(就复杂性和时钟数量而言不一定)。

  • 所以需要读取地址202的内容,
  • 你需要暂时给r1加100,
  • 您需要将地址202的内容写入到位置r1+100,
  • 然后你需要获取 r1 并递增它(不是 r1+100 递增,而是 r1 没有索引递增)。

给出的解决方案几乎可以做到这一点:

add #100, r1
mov #202, r2
mov[r2],[r1]
sub #99, r1

它将 100 添加到 r1 中,我们需要暂时执行此操作(并且稍后必须撤消,因为从长远来看,r1 现在是错误的)。 然后,因为它们限制了寻址模式,所以您需要一个寄存器来保存地址 202,因此值 202 被加载到 r2 中,就像值 100 被添加到 r1 中一样。 #number 表示仅使用该号码。

现在您可以使用 [rn],因此移动会读取地址 r2(地址 202)处的内容并将其写入地址 r1 处的内容(原始 r1 加 100)。最后,因为我们希望 r1 最终成为原始加 1,但我们将其设为原始加 100,所以我们需要减去 99 r1+100-99 = r1+1


在 C 语言中,它会是这样的:

unsigned *r1;
unsigned *r2;

//r1 is set somewhere in here to something that is not defined in your question or problem.

r1 += 100;  //add #100,r1
r2 = 202;   //mov #202,r2
*r1 = *r2; //mov [r2],[r1]
r1 -= 99;  //sub #99,r1

将目标放在右侧、将操作数放在左侧并不直观,因为我们大多数情况下都是将结果放在左侧、将操作数放在右侧进行编写和编码。

我们不编码202 = r2;我们改为写r2 = 202; so mov r2,#202更直观,但汇编语言是由编写汇编程序的人定义的,有些人喜欢从左到右,有些人喜欢从右到左。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

试图理解这个简短的汇编指令,但我不明白 的相关文章

  • 切换 C++ 函数的调用堆栈

    这是我的上一个问题 https stackoverflow com questions 1371547 explanation of asm code关于切换 C 调用堆栈 但是 C 使用不同的调用约定 thiscall 并且可能需要一些不
  • 使用汇编器 8086 显示表的总和

    我正在编写一些代码 允许我对表进行求和 然后使用汇编语言显示其结果 这是我到目前为止所想到的 data segment tab db 9 dup 3 5 8 4 7 1 6 7 0 resultat db data ends code se
  • 在 Windows 8/10 上调用静态链接函数每次都会崩溃,但在 Windows 7 上则不然

    问题 我已经建立了https github com reorg pg repack https github com reorg pg repack生成二进制文件的项目 该二进制文件与 postgres 9 6 可再发行组件链接 我使用由
  • 用于读/写 XMM 和 YMM 寄存器的内联汇编代码?

    我有 2 个变量来模拟 X86 XMM 和 YMM 如下所示 uint64 t xmm value 2 uint64 t ymm value 4 现在我想使用内联汇编来读取和写入 XMM YMM 寄存器 如何编写GCC内联汇编来复制xmm
  • 内联汇编 - cdecl 和准备堆栈

    我最近一直在尝试通过使用缓冲区和不同汇编运算符的原始十六进制等效项来实现 C 中的动态函数 为了说明一个简单的跳转 byte buffer new buffer 5 buffer 0xE9 Hex for jump uint buffer
  • NOP 雪橇如何工作?

    我找不到回答这个问题的好来源 我知道 nop sled 是一种用于规避缓冲区溢出攻击中堆栈随机化的技术 但我无法理解它是如何工作的 有什么简单的例子可以说明这种方法 128 字节 nop sled 等术语是什么意思 有些攻击包括使程序跳转到
  • 如何在汇编程序中使用 C 库?

    我想知道如何用汇编语言编写文本编辑器 但现代操作系统需要 C 库 特别是对于它们的窗口系统 我找到了这个page http pengu1n is programmer com posts 8304 html 这对我有很大帮助 但我想知道是否
  • arm-thumb指令集的blx指令如何支持4MB范围

    读自https www keil com support man docs armasm armasm dom1361289866046 htm https www keil com support man docs armasm arma
  • 当非特权用户运行 C/asm 程序时,会对 Linux 造成什么危害?

    我一直在考虑一种场景 让用户 可以是任何人 可能有恶意 提交在 Linux PC 我们称之为基准节点 上运行的代码 目标是为单线程例程创建一种自动化基准测试环境 假设一个网站向代理发布了一些代码 该代理将此代码交给基准节点 而基准节点仅与代
  • 推送 64 位 intel osx

    我想将 64 位地址压入堆栈 如下所示 asm pushq 0x1122334455667788 但我得到编译错误 我只能按以下方式推送 asm pushq 0x11223344 有人可以帮助我理解我的错误吗 我是装配新手 所以如果我的问题
  • 汇编语言中的全局_start是什么?

    这是我的汇编级代码 section text global start start mov eax 4 mov ebx 1 mov ecx mesg mov edx size int 0x80 exit mov eax 1 int 0x80
  • 左/右旋转进位的实际用途

    循环左进位和循环右进位指令有哪些实际用途 在我的汇编课上 我们无法想出一个有用的好例子 如果要将位从一个操作数移出并移入另一个操作数 SHL EAX 1 move sign bit of EAX RCL EDX into LSB of ED
  • 装配中出现奇怪的字符?

    我写了以下代码 386 model small stack 100h data text db Paper 0 code start lea dx text mov ah 9h int 21h mov ah 4ch int 21h end
  • 这段汇编语言代码是什么意思?

    我是一名学生 刚刚开始学习汇编语言 为了更好地理解它 我只是用 C 写了一个简短的代码并将其转换为汇编语言 奇怪的是我有点听不懂 代码是 include
  • Clang 使用 -nostdlib 生成崩溃代码

    我正在尝试为可执行文件设置自己的运行时环境 但无法使用 clang v3 4 1ubuntu1 目标 x86 64 pc linux gnu 来生成没有段错误的可执行文件 我已将问题简化为以下内容 如果我有一个文件 crt1 c 除了满足
  • 如何让c代码执行hex机器代码?

    我想要一个简单的 C 方法能够在 Linux 64 位机器上运行十六进制字节码 这是我的 C 程序 char code x48 x31 xc0 include
  • 取消的分支与常规分支有何不同?

    特别是对于 SPARC Assembly 取消的分支与常规分支有何不同 我一直认为 当我需要填充分支指令的 nop 延迟槽时 需要取消分支指令 但是 我认为我在这一部分上是不正确的 因为您可以在不取消分支的情况下填充 nop 如果不采用分支
  • 为什么 Solaris 汇编器生成的机器代码与 GNU 汇编器在这里不同?

    我为 amd64 编写了这个小汇编文件 对于这个问题来说 代码的作用并不重要 globl fib fib mov edi ecx xor eax eax jrcxz 1f lea 1 rax ebx 0 add rbx rax xchg r
  • NASM 轮班操作员

    您将如何在寄存器上进行 NASM 中的位移位 我读了手册 它似乎只提到了这些操作员 gt gt lt lt 当我尝试使用它们时 NASM 抱怨移位运算符处理标量值 您能解释什么是标量值并举例说明如何使用 gt gt and lt lt 另外
  • 为什么 RISC-V S-B 和 U-J 指令类型以这种方式编码?

    我正在读一本书 计算机组织与设计RISC V版 我遇到了 S B 和 U J 指令类型的编码 我上面提到的那些类型有奇怪的编码立即字段 S B 类型将直接字段分为两部分 这是有道理的 因为所有指令编码都必须相似 但我无法理解为什么立即字段以

随机推荐

  • WPF - ItemTemplate 未按预期运行

    我有一个UserControl我用它来显示列表UIElement是 该控制由一个单一的ItemsControl与它的ItemPanelTemplate切换为水平StackPanel its ItemsSource绑定到一个Dependenc
  • 插入表变量 CTE

    如何将 cte 的结果插入到表变量中 像这样的东西吗 DECLARE myData TABLE Title nvarchar 350 NOT NULL Id int NOT NULL INSERT INTO myData with CTE
  • 在所有窗口之上运行 hta

    我有一个 HTML 应用程序 我想保留在所有窗口的顶部 也就是说 如果打开 切换到另一个窗口 我希望这个窗口覆盖它 JavaScript 解决方案在 Windows 7 IE9 模式下不起作用 不确定是什么阻碍了它 也无法更改 而 VBSc
  • 没有表的映射关联的 Hibernate 标准投影

    我有 2 张桌子说 表1和表2 现在 Table1 有 3 列 即 t1 t2 t3 Table2 有 2 列 t4 和t5 我必须通过联接从两个表中获取数据 但注释或 xml 中的两个表之间没有映射关联 现在的主要问题是我必须使用休眠投影
  • 在 Visual Studio 2017 .NET Core 项目中支持 Roslyn 分析器(.ruleset)

    如何在 Visual Studio 2017 NET Core 项目中添加对 Roslyn 分析器 ruleset 的支持 在 project json 中 它是通过使用配置的buildOptions buildOptions additi
  • Varchar 或 Text 数据类型,字符串长度最多为数千个字符

    我有一个小型社交网站 包含帖子和评论 我决定让用户使用他们想要的任意数量的字符创建帖子 我认为存储此类内容的最佳数据类型是Text 但对于评论 大多数情况下用户只写一行或几行文字 这就是为什么我认为我必须将注释字符串长度限制为最大 3000
  • 从 C# 关闭最小化/图标化进程

    这是我的问题 我需要从 C 程序关闭一个已经运行的进程 问题是该进程现在作为图标运行 最小化到任务栏 除非用户至少打开它一次 这在无人值守的计算机上永远不会发生 否则它永远不会 有一个主窗口 我的另一个要求是应用程序是closed not
  • 尽可能均匀地分配数量

    我们有一定的数量 例如300 单位 该数量应尽可能均匀地分布在 40 个 槽 上 如果每个槽都相同 那就很容易了 所以每个槽都是 7 5 然而 插槽的大小各不相同 我们不能 填充 超过其 大小 允许的范围 例如如果只有 5 个 我们无法 填
  • 有没有直接的方法将 Informix 上的 Unix 时间转换为 YYYY-MM-DD HH:MM:SS?

    我知道使用 PHP 或 Perl 可以轻松完成类似的事情 但我想知道是否有一种方法可以直接在 Informix 上完成 例如函数FROM UNIXTIME 在 MySQL 上 我认为你可以使用 dbinfo 和 utc to datetim
  • 使用php将mysql表列表从mysql导出到csv文件

    我想知道是否有人可以向我展示一个示例 PHP 代码 说明如何将 MySQL 数据库中的大约 50 个表导出到 CSV 文件 我的数据库名称是 samples 该数据库下有大约 49 个表 我希望该数据库下的每个表 大约有 20 00 行 导
  • 使用 Google Sheets 脚本,为什么我的 if 语句在比较单元格值时总是返回 false?

    我需要比较两个单元格值并在它们不同时对其采取行动 然而 在比较单元格内容时 我的 if 语句总是返回 false 我不明白为什么 function onEdit var ss SpreadsheetApp getActiveSpreadsh
  • Haskell 继承、数据、构造函数

    所以我想为我的小行星游戏 作业定义多个数据类 data One One oneVelocity Velocity onePosition Position other properties unique to One data Two Tw
  • 如何在C#中从mysql结果中读取某些数据

    我想从 C 对 mysql 进行某些查询 这样我就可以返回例如姓名和姓氏 我不知道如何在 C 中处理这个问题 我想尽量减少 SQLinjection 这是我的代码 con new MySqlConnection server localho
  • 无法加载实体框架提供程序类型“Oracle.ManagedDataAccess.EntityFramework”

    我正在尝试在 MVC 应用程序中使用 Entity Framework v6 使用 Oracle Data Provider NET ODP NET 连接到 Oracle 我从这里安装了 ODP NET https www nuget or
  • 根据 WooCommerce 中的产品类别自定义“缺货”文本

    每件缺货产品都显示 缺货 有很多functions php覆盖文本的脚本 但我只是尝试覆盖特定于 类别 A 的文本 或者如果我知道类别 id 编号 那也可以工作 我找到了这个脚本 但它只允许您修改每个产品 ID 的 txt add filt
  • 视图内的 Rails 布局名称

    如何打印视图中当前布局的名称 Example puts controller current layout Thx 这适用于 Rails 3 0 7 controller send layout 显然 这是一种私有方法 因此使用时需要您自担
  • VHDL:IEEE std_logic 库中的真值表

    我研究了 IEEE 如何定义其库 当我打开的时候标准逻辑库 我看到了一些被定义为常数的真值表 我不知道真值表是如何运作的 请解释如何使用真值表返回结果 这是我找到的 AND 门 TYPE stdlogic table IS ARRAY st
  • SQL 创建 UDF 计算列

    我尝试创建一个计算列 但由于其中一列位于另一个表中 我知道我需要创建一个 udf 这是 ERD 的链接 以便您可以查看其中的关系 http imageshack us photo my images 23 databaseassignmen
  • 如何使用Androidfragmentmanager传递变量[重复]

    这个问题在这里已经有答案了 我有以下简单的代码可以在内容框架中从一个片段切换到另一个片段 在下面的代码中是否有一种简单的方法来传递变量 FragmentManager fm getActivity getFragmentManager fm
  • 试图理解这个简短的汇编指令,但我不明白

    我们有一个任务 给定的是 2 寻址的汇编指令 机器 mov 202 100 r1 记下替代此的最小汇编指令序列 说明 见上文 where n rx 按后增量索引的寄存器 n 是索引值 rx 是寄存器 x 单个数值 直接寻址 存储 我们应该使