- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在编写一个 8086 汇编器,它接受指令并生成 8086 机器代码。我使用《Intel 8086 用户手册》作为引用。
为了说清楚,我将解释一下情况。假设我想汇编这条指令 mov ax, bx
。我查了一下手册,发现当mov
的操作数是2个16bit寄存器时,mov
的操作码是0x89
,并指定操作数(源和目标),在本例中 mov
后跟一个 ModRegRm 字节,用于指定源和目标,在本例中为 0xd8
。该字节二进制 = 11011000
。
Mod 为 2 位,Reg、Rm 各为 3 位。因此,Mod = 11,Reg = 011,Rm = 000。这里很简单,但有一点我不明白,那就是寻址模式和位移。
查看表格和以下三个指令及其机器代码。
mov [bx+0x6], ax ;894706
mov [bx+0xbf],ax ;8987BF00
mov [bx+0xffff],ax ;8947FF
我假设每条指令的位移长度分别为8位、8位、16位,这是否错误?
我认为我是对的,因为很明显,0x6
和 0xbf
是 1 个字节,0xffff
是两个字节。
问题是,为什么第二条指令中的MOD字段是10b或0x02
而不是01b或0x01
?应该是0x01
,因为位移是8位位移,不是吗?为什么第三条指令中的MOD是0x01
,尽管位移是16位?为什么汇编器忽略其余的位移并仅捕获 1 个字节?
最佳答案
位移的大小取决于“MOD”字段(例如,如果 MOD=001b,则为 8 位;如果 MOD=010b,则为 16 位),并通过符号扩展至预期大小。
这意味着像 mov [bx+6], ax
这样的指令可以编码为 mov [bx+0x0006], ax
(MOD=010b 和16 位位移)或者可以编码为 mov [bx+0x06], ax
(MOD=001b 和 8 位位移)。
同样,mov [bx+65535],ax
可以以任何一种方式编码(8 位位移或 16 位位移);因为 0xFF 可以符号扩展为 0xFFFF。
但是; mov [bx+191],ax
不能编码为 8 位位移,因为当 191 (0xBF) 进行符号扩展时,它会变成 0xFFBF,不等于 191。它必须使用16 位位移。
本质上;如果完整 16 位位移的最高 9 位全部相同(值 0x0000 到 0x007F 全部清零,或者值 0xFF80 到 0xFFFF 全部设置),则可以将其编码为 8 位位移或 16 位位移;否则它必须使用 16 位位移。
当需要在不同的编码之间进行选择时;一个好的汇编器会选择最小的可能性(并使用 8 位位移,因为它使指令短 1 个字节)。如果避免了填充的需要(如果以下指令需要在某个边界上对齐),更好的汇编器可能会使用更大的版本。例如,考虑 .align 2
然后 mov [bx+6], ax
然后 .align 2
然后 clc
- 对于较小的(3 字节)mov
,您必须在 clc
之前插入额外的 nop
指令作为填充,以确保指令对齐2 字节边界(由 align 2
指令请求),而对于较大的(4 字节)mov
则不需要(因此少了 1 条指令,但结果代码的字节数相同)。
关于assembly - 位移值对 ModRegRm 字节的 Mod 字段有什么影响?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61707459/
如何在 Mod Security 中获取响应/请求正文的大小? 我不断收到此错误,例如: [Mon Sep 17 23:34:38 2012] [error] [client 192.168.1.1]
我要计算的值 对于给定的 N 值,F(N) = (F(N-1) * [((N-R+1)^(N-R+1))/(R^R)]) mod M, R 和 M. 这里 A^B 显示 A 的幂 B 而不是任何位操作
这个程序中的ans = (ans + mod) % mod语句需要什么? 假设 mod = 10^9+7。此函数在 O(log(n)) 复杂度的模运算下计算 a 的 b 次方: long long p
我正在尝试做简单的思考。在循环中使用 ng-include 将多个 html 页面包含到渲染页面。 $scope.modules = ["mod_nav","mod_feature"
我有一个使用moodle库的项目。由于客户端请求,我不得不将 URL 从moodle.example.com 更改为learn.example.com。 我认为这将是一个简单的更改,但唉,moodle
我正在尝试制作一个 Taskfile.yml 文件来构建 go 应用程序,但我不太明白在 go build main.go 之前需要“GOFLAGS=-mod=mod”命令。 引用:https://d
我正在尝试制作一个 Taskfile.yml 文件来构建 go 应用程序,但我不太明白在 go build main.go 之前需要“GOFLAGS=-mod=mod”命令。 引用:https://d
首先,我想说,我从谷歌尝试了很多方法,但 mod_rewrite 不起作用! 我从 httpd.conf 尝试了我在谷歌上找到的 1000000 种方式,但仍然无法正常工作。 我想从 example.
你好我试图安装 libapache2-mod-fcgid mod 但总是出错。 root@mail:~# sudo apt-get install libapache2-mod-fcgid Readi
我需要在 URL 中使用 + 字符。我将 Apache 与 PHP 结合使用。 ([A-Za-z0-9/_%-@\+]*) 不起作用。 我需要的是www.domain.com/c++/ => inde
关闭。这个问题需要更多 focused .它目前不接受答案。 想改进这个问题?更新问题,使其仅关注一个问题 editing this post . 2年前关闭。 Improve this questi
我正在尝试在新的 Ubuntu 14.04 上设置一个 apache2 Web 服务器。我一直按照找到的说明进行操作 here一切都很顺利,直到我到达被告知编辑 mod-security.conf 的
当我运行“go mod tidy”时它会中断,因为我的项目导入的包使用路径“github.com/coreos/bbolt”导入了另一个包,但是当它从该路径获取包时,它的 go.mod 说它的路径是“
这种脚本语言没有 % 或 Mod()。我确实有一个 Fix() 可以去掉数字的小数部分。我只需要积极的结果,所以不要太健壮。 最佳答案 威尔 // mod = a % b c = Fix(a / b)
在我的小项目中,我有一个脚本通过运行静态代码检查来确保正确的代码质量,例如,我使用 errcheck验证我是否处理了代码中的每个错误。 在 dep ,对于这种依赖有一个特殊的部分,称为 require
我使用 sudo apt install golang-go 在我的 ubuntu 中安装了 go 语言. 它已成功安装。当我运行 go version我收到 go version go1.10.4
谁能帮我解决这个问题: RewriteCond %{HTTP_HOST} !^www\.(.*)$ [NC] RewriteRule ^(.*)$ http://www.$1 [R=301,L] 我想
BigIntegerValue.pow(IntegerValue) Java 上的指数是整数,但我有 Biginteger 值。 我曾尝试验证签名 GOST 3410,我得到了这个代码 pow,但它太
所以我才开始使用 Forge。我只是有一个非常简单的示例 mod 用于学习目的。当我使用 gradlew build 导出 mod 时,一切正常,它将 mod 放入 forge 的 build\lib
在玩 jmh 时,我遇到了一件我无法解释的奇怪事情。 @BenchmarkMode(Mode.SingleShotTime) @Measurement(iterations = 10, batchSi
我是一名优秀的程序员,十分优秀!