- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试为考试练习注释反汇编 block 。这是我到目前为止所做的:
00000190 <mystery>:
190: 2300 movs r3, #0 // move address 190 (offset 0) into r3 ?
192: e004 b.n 19e <mystery+0xe> // if 19e then branch to mystery
194: f010 0f01 tst.w r0, #1 ; 0x1 // update flags to 1 in status register
198: bf18 it ne // if 198 not equal to ??? then ???
19a: 3301 addne r3, #1 // add to r3 if not equal to 19a offset 1?
19c: 1040 asrs r0, r0, #1 // shift r0 right one spot (leave it in r0)
19e: 2800 cmp r0, #0 // compare contents of r0 against 0 ?
1a0: d1f8 bne.n 194 <mystery+0x4> // branch to 194 if not equal to something at line 194?
1a2: 4618 mov r0, r3 // move r3 wholecloth into r0
1a4: 4770 bx lr // branch(return from the mystery function)
1a6: bf00 nop // No operation
所以我的评论非常简陋,可能有很大的不正确之处,但最重要的是,我真的不明白诸如 190 或 19a 之类的指令是什么意思。只有两个参数而不是三个参数,那么这些参数是如何工作的呢?
举个例子
19a: 3301 addne r3, #1
到目前为止,我对此的解释是:如果不等于 X,那么将 Y 添加到 r3? X 和 Y 是什么?我应该使用上一行的结果吗?如果是这样,它取代了(标准三中的)哪个论点?
废话!
我愿意接受我不知道自己在做什么并且完全误解了一切。
请发送帮助!
最佳答案
1) TST 指令与ANDS 指令基本相同,只是它不改变第一个操作数。因此,TST r0, #1
根据 (r0 & 1) 的结果设置标志。具体来说,如果结果为零,即未设置 r0 的第 0 位,它将设置 Z(零)标志。
2) IT 代表 "If-Then" .它检查指示的条件,并有条件地执行最多 4 条以下指令。在您的示例中,您只有一条条件指令,反汇编程序提供了 IT 指令中的 NE 后缀(后缀未在 Thumb-2 的指令本身中编码)。 NE 的意思是“不相等”,但在这种情况下没有比较,那么给出了什么?诀窍是相等检查检查 Z 标志,因此您可以将其视为“非零”。因此,我们的 ADD 将在 Z 标志未设置的情况下执行,即 r0 did 设置了位 0。
3) CMP/BNE 周围也会发生类似的情况。 CMP 基本上减去操作数并根据结果设置标志。在我们的例子中,如果 r0 等于 0,它将设置 Z。接下来,BNE 将测试 Z 标志并在未设置时分支(即 r0 不等于 0)。
将其全部转换为伪 C,我们得到:
r3 = 0
goto test_loop;
loop:
Z = (r0 & 1) == 0;
if (!Z)
r3 += 1;
r0 = r0 >> 1
test_loop:
Z = (r0 - 0) == 0;
if (!Z) goto loop;
r0 = r3;
return;
或者,在“正常”C中:
r3 = 0;
while ( r0 != 0 )
{
if ( r0 & 1 )
r3++;
r0 >>= 1;
}
return r3;
看起来它正在计算 r0 中的位数。
看看here对于条件代码表以及它们检查的标志。 This描述设置标志的方式和时间。
编辑:我刚刚重读了您的问题,并意识到您的困惑之一。像这样排列:
b.n 19e <mystery+0xe>
有一个操作数,而不是两个。反汇编程序试图提供帮助,不仅显示绝对目标地址 (19e),还显示其表示为与最近符号的偏移量(神秘在 190,因此 19e 是神秘+0xe)。
您需要意识到的另一件事是,在 ARM(和许多其他处理器)中,设置标志和使用标志通常在单独的指令中完成。这就是为什么您首先执行 TST 或 CMP(或其他标志设置指令),然后使用条件指令、IT 或条件分支。
关于assembly - ARM反汇编程序输出: When there are two arguments instead of three,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6305844/
例如,如果我的程序名称是 test.c 然后对于以下运行命令,argc = 2 而不是 4。 $test abc pqr* *xyz* 最佳答案 尝试运行: $ echo abc pqr* *xyz*
我正在尝试使用一个容器来显示TextField,但是该容器不喜欢我的操作顺序。这是我的代码: Widget build(BuildContext context) { return Scaffol
我有以下代码: class MetricGoogleGateway extends AMetricGateway{ constructor(id, name, token) {
我像这样调用下面的对象方法。 new Cout( elem1 ).load( 'body' ) new COut( elem1 ).display( 'email' ) 我一次只使用一个实例。因为我一
我正在尝试使用 C++11 中的可变参数函数模板,并通过如下代码了解了基本思想: void helper() { std::cout void helper( T&& arg ) {
在学习 ExtJS 4 时,我发现在定义一个新类时,在 initComponent 中方法可以使用 this.callParent(arguments) 调用父类的构造函数. 我想知道这个 argum
使用 XCode 9,Beta 3。Swift 4。 statsView.createButton("Button name") { [weak self] Void in //stuff st
以下代码将打印1: (function (arguments) { console.log(arguments); }(1, 2)); 实际上,arguments 对象已被覆盖。是否可以恢复函
/** * @param $name * @return Response * @Route ("/afficheN/{name}",name="afficheN") */ public fu
我习惯使用Scala scopt用于命令行选项解析。您可以选择参数是否为 .required()通过调用刚刚显示的函数。 如何定义仅在定义了另一个参数时才需要的参数? 例如,我有一个标志 --writ
所以这是我的代码: def is_valid_move(board, column): '''Returns True if and only if there is an o
我试图在这里运行此代码: threads = [threading.Thread(name='ThreadNumber{}'.format(n),target=SB, args(shoe_type,m
在静态类型函数编程语言(例如 Standard ML、F#、OCaml 和 Haskell)中,编写函数时通常将参数彼此分开,并通过空格与函数名称分开: let add a b = a + b
function validateArguments(args) { if(args.length 2) { throw new RangeError("Invalid amo
我正在使用 Django 1.5 并尝试将参数传递到我的 URL。当我使用前两个参数时,下面的代码工作正常,使用第三个参数时我收到错误。我已经引用了新的 Django 1.5 更新中的 url 用法,
我刚刚开始使用 ember js 并且多次被这个功能绊倒 有人可以简要介绍一下 this._super() 的使用,并解释 ...arguments 的重要性 谢谢 最佳答案 每当您覆盖类/函数(例如
这个问题在这里已经有了答案: How to fix an "Argument passed to call that takes no arguments" error? (2 个答案) 关闭 3
我正在创建一个简单的登录注册应用程序。但是我遇到了错误,我不知道如何解决,请帮忙!这是我的代码: // // ViewController.swift // CHLogbook-Applicati
我是 Swift 的初学者。我尝试创建一个表示 Meal 的简单类。 它有一些属性和一个返回可选的构造函数 但是当我尝试测试它或在任何地方实例化它时,我得到的只是一个错误。似乎无法弄清楚发生了什么。
我有一个在特殊环境下运行其他程序的系统程序: cset shield -e PROGRAM .现在要运行一个 java 程序,我输入了 cset shield -e java PROGRAM ,但这不
我是一名优秀的程序员,十分优秀!