问题标签 [machine-language]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
assembly - 非可执行文件是否可能意外“代码注入”或执行
作为一名自学成才的“程序员”,除了由我的编译器将其转换为机器指令之外,我对软件的内部工作方式并不太了解。当我开始熟悉汇编语言和机器指令时,我想到了以下问题:
是否有可能有一个简单的数据文件,如文本文件或位图(或其他任何东西),它们的字节组合错误,导致计算机在读取时崩溃?由于某些文件是数十亿字节,我认为很可能有几个连续字节形成指令。
显然不会发生任何智能,但可能某些字节组合可能会导致指令指针指向错误的方向,或者只是跳过读取文件的其余部分。
也许操作系统开发人员和编译器开发人员已经在幕后处理了这个问题,但无法解释所有可能出错的情况,也许一些数据甚至可以通过这些意外事件。
我想这可以归结为与一群猴子用打字机生产莎士比亚的概念相同,只是机器指令比哈姆雷特短得多。
binary - 0 1 二进制编程
嘿伙计们,我正在寻找学习二进制编程的参考资料,比如只用 0 1 进行编码......如果有人能告诉我正确的方法或帮助我,我会很感激它对我学习 0 1 编程很有必要,但不幸的是我找不到资源学习它,每个人都说我知道,但我需要 0 1 而不是那个,所以请帮助我学习它............如果你们中的任何人知道它,请保持联系,或者如果你有参考请通过电子邮件发送给我:mohammadaminem97@yahoo.com 谢谢大家
assembly - 无法理解 Kip Irvine 的汇编语言书中的存储分配
我读了Kip Irvine 的《x86 汇编语言》一书。在第 85 页,他写了以下关于为什么要使用符号的内容:
使用
DUP
运算符:Section 3.4.4
展示了如何使用DUP
运算符为数组和字符串创建存储。使用的计数器DUP
应该是一个符号常量,以简化程序维护。在下一个示例中,如果已定义 COUNT,则可以在以下数据定义中使用它:
我不明白这个命令在做什么。有人可以向我解释这是什么意思吗?
c++ - 函数指针数组 C++ 性能的查找表
我有以下代码来模拟我的电脑(x86)上的基本系统:
我将这个“表”称为“表”,opcodes[opcode]()
因为我正在尝试提高我的口译员的性能。内联每个函数怎么样,比如
这样做有什么好处吗?
反正有没有让它跑得更快?谢谢
assembly - LPC111x 系列是否支持高位寄存器的 MOV 指令?
UM10398 LPC111x/LPC11Cxx 用户手册修订版 12.3 — 2014 年 6 月 10 日说
在这些说明中,Rd 和 Rm 只能指定 R0-R7
在“28.5.5.5 MOV 和 MVN”中的“28.5.5.5.3 限制”中。
另一方面,UM10398 中的“28.5.5.5.5 Example”说
在这个例子中R10
,R12
,R8
和SP
被使用,尽管它们看起来并不R0-R7
。(SP
似乎相当于R13
,根据 UM10398 28.4.1.3 核心寄存器)
还有一件事是,当我阅读re-ejected-thumbref2.pdf时,我发现
MOV Rd, Rm 0 1 0 0 0 1 1 0 H1 H2 _ Rm _ _ Rd _
这表明高位寄存器可用于MOV
指令。该文件还说
Rd 或 Rm 必须是 *high 寄存器*
关于这个MOV Rd, Rm
指令。
尽管带有S
(带有标志更新)的说明不在本文档中(在本文档中没有说明S
更新标志)并且本文档应该用于另一个 CPU(可能在 GBA 中使用,根据 URL 路径),我使用了这个文档作为参考,希望 LPC111x 的指令集与本文档中描述的相似。
总之,我可以做
MOV R0, R1
(低位寄存器到低位寄存器)MOV R8, R1
(低寄存器到高寄存器)MOV R0, R9
(高位寄存器到低位寄存器)MOV R8, R9
(高位寄存器到高位寄存器)
在 LPC111x(或 LPC1114FN28/102,如果您需要特定的 CPU)?
assembly - 如何将IAS计算机的内存内容翻译成汇编语言
给定以下内存内容
汇编代码是:
我的问题是,内容是如何翻译成汇编代码的。这里的操作码与内存内容中的操作数有什么区别?
c++ - 如何调用存储在char数组中的机器码?
我正在尝试调用本机机器语言代码。到目前为止,这是我所拥有的(出现总线错误):
它确实正确调用了该函数并进入了 ret 指令。但是当它试图执行 ret 指令时,它有一个 SIGBUS 错误。是因为我在一个没有被清除执行的页面上执行代码或类似的东西吗?
那么我在这里做错了什么?
stack - cpu如何从栈中获取返回地址
cpu如何从调用者函数推送的堆栈中获取返回地址。他怎么知道这是一个退货地址而不是别的什么?
assembly - 如何在 LEGv8 中将机器指令解码为汇编?
我无法弄清楚如何解码 LEGv8 机器指令。假设以下二进制文件:
1000 1011 0000 1111 0000 0000 0001 0011
我有以下图表可以帮助我解码:
前 11 位10001011000对应于十进制1112,根据图表,这是ADD指令。所以我知道如何确定指令的这一部分(除非有更好的方法,也许这不适用于不是 11 位的操作码?)。在这一点上,我对如何进行感到困惑。
我知道 ADD 是指令格式R 格式,因此位的布局如下:
操作码:11 位
Rm:5 位
shamt:6 位
Rn:5 位
Rd:5 位
我试图在知道这些字段大小的情况下布置初始二进制机器指令......
opcode = 1000 1011 000 0 1111 0000 0000 0001 0011 = 10001011000
这是初始二进制机器指令的前 11 位。
Rm = 1000 1011 000 0 1111 0000 0000 0001 0011 = 01111
这是操作码的初始 11 位之后的下 5 位。
shamt = 1000 1011 0000 1111 0000 00 00 0001 0011 = 000000
这是 Rm 的 5 位之后的下 6 位。
Rn = 1000 1011 0000 1111 0000 00 00 000 1 0011 = 00000
这是 shamt 的 6 位之后的下 5 位。
Rd = 1000 1011 0000 1111 0000 0000 000 1 0011 = 10011
这是二进制机器指令中的最后 5 位(Rn 的 5 位之后的 5 位)。
将 Rm、Rn 和 Rd 的二进制转换为十进制,我得到:
Rm = 15 = X15
Rn = 0 = X0
Rd = 19 = X19
因此,我将初始二进制机器指令解码为汇编语句的最终答案是ADD X19, X0, X15
然而,这个例子的教科书答案是ADD X16, X15, X5。我哪里做错了?