问题标签 [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.
mips - lw add 和 sw 的行如何转换为下图?
我刚刚开始学习这个材料。我不明白图表中的 35、9、8 等数字是从哪里来的。我在装配线上看到的只是数字 300。
embedded - 微程序与嵌入式系统之间的连接
微程序和嵌入式系统之间有什么联系?
微程序是一种机器语言吗?
微编程和微代码一样吗?
嵌入式系统是否仅使用微编程制造?
或者它不是使用微编程的嵌入式系统的排他性吗?
如果可能,请举例说明。谢谢!
assembly - 操作码到字节的主要图表
我正在尝试使用这个简单的hello world 汇编程序并从头开始将其生成为机器语言(最终目的是制作汇编程序,但现在我只想了解此特定程序所需的十六进制值):
所以我知道一般的想法是机器语言只是输入/输出操作中“_start”中提到的部分。它还与 AX 寄存器和 DX 一起用于涉及大值的乘法和除法运算。但不是用文本写出来,每个命令都用数字(或二进制等)表示。
例如,“mov”将是一个数字,“edx”,数据寄存器,将由另一个寄存器表示,“myLength”将由另一个表示。此外,命令“int 0x80”——在“128”处中断,这意味着(我认为)调用存储在主寄存器中的任何命令,即 AX,将对应于表示命令“int”的某个数字加上 0x80( 128),我猜这只是二进制的128。
我也猜想所有额外的东西,比如section .text,segment .data,只是为了让汇编器找到和替换上面使用的变量,但我猜机器语言本身不会保留任何一种变量或常量,虽然如果我错了,请纠正我。
所以理论上在机器语言中,我不需要定义一个变量来“coby”(消息变量)以便将它插入计数器寄存器(CX);而是我只插入原始字符串,或者在这种情况下,不是字符串,而是字符代码字符,直接在代表 eCx 的任何数字之后(尽管我也不确定为什么在这个例子中使用了计数器寄存器,我猜它不仅用于存储递减的东西吗?)
无论如何,如果我的假设是正确的,那么我需要某种图表来告诉我哪些数字与哪些操作码(如本例中的mov和int)以及哪些寄存器(如 edx、eax 等)完全对应,而且我也需要知道这些字节命令到底是什么顺序存储在二进制文件中的。我尝试使用 NASM(使用命令nasm -f elf yo.asm && ld -m elf_i386 -s -o yoman yo.o
)并查看 ANSI 中的内容,这是我从 JavaScript 控制台打印到 HTML 页面时得到的结果,每个数字都标记在自己的行上,以及它的二进制值、字符代码和实际unicode 文本(在 HTML 中并不总是可见):
366:00000000、000:367:00000000、000:368:00000000、000:369:00000000、000:370:00000000:00000000,000:371:00000000、000:372:372:372:00000001、001:373:373:373:373:373:000000000000000000000000000000000000000000000000000000个00000000, 000: 375: 00000000, 000: 376: 00000000, 000: 377: 00000000, 000: 378: 00000000, 000: 379: 00000000, 000:
所以文件很大。380 字节,这有点令人惊讶,我认为这与来自 NASM 的一堆标头和 ELF 的东西有关,从顶部可以看出,所以我不知道实际的汇编程序从哪里开始,如果可能的话把它减少到那个程度。
因此,一些立即突出的东西显然是打印到控制台的字符串值,它出现在160
上述输出中的行 (AKA byte#) 处。字符串的长度恰好是 36,它应该对应于存储在数据寄存器中的第一个值(在汇编程序中称为“myLength”),尽管我找不到任何对应于“36”的字节所以我不确定该长度是如何准确存储的,是否被分解等。
其他一些值得注意的字节是数字 128,它对应于内核调用或上面的中断号 (0x80),它出现在第 156 行 (/byte#) 和第 149 行的输出中。它也出现在其他地方,但是在那个特定的地方,它出现在另一个字符串附近,所以我猜它可能对应于传递给“int”中断命令的值,并且这些位置中的每个字节前面也都有字节“205”,作为 ANSI 字符看起来像这个 Í,它可能以某种方式暗示它对应于命令“int”,特别是因为它紧接在数字 0x80 之前,但我不确定。
因此,我尝试查看intel 文档以及一个非常长的 PDF 文件,但我找不到任何谈论的地方:
1. 哪些字节码与哪些操作码和命令一一对应
2. 究竟是什么顺序/格式,将它们放入编译的输出中(不求助于像 NASM 这样的任何第 3 方汇编程序)
我找到了第 3 方参考表,但我更想知道他们从原始文档中得到它的位置,虽然它显示了寄存器的一些代码,但我找不到将它们放入的格式生成的版本。我还看到了类似问题的这些答案:
如何在没有 EXE 或 ELF 等容器的情况下手动编写和执行 PURE 机器代码?
但我真正要寻找的是对所有寄存器和操作码的完整和官方参考
cross-platform - 什么文件格式可以跨windows、linux和mac执行
给定一些纯机器语言命令,例如以下字节:
(取自:如何在没有 EXE 或 ELF 等容器的情况下手动编写和执行 PURE 机器代码?)?我知道通常需要一个 .EXE、ELF 或 .OUT 包装器,但据我所知,这些格式是特定于平台的,只是为了能够双击并运行它们。
是否存在可以在 windows、linux 和 mac 之间双击并运行相同机器代码的文件格式(假设没有外部依赖项)?
assembly - 如何将机器语言命令直接写入 ELF 可执行文件
我目前正在使用 NASM 获取一些汇编代码命令,制作一个 .o 文件,然后使用 ld 将其链接到 ELF 可执行文件。我的汇编文件 ok.asm:
然后nasm -f elf ok.asm
生成ok.o
然后ld -m elf_1386 -s -o yo ok.o
生成成品。
问题是我希望能够测试纯机器语言(不一定是汇编),而不需要任何依赖项来构建和链接它,比如 NASM 和 LD。我所拥有的只是将(/生成)纯字节写入文件的能力,所以我想采用机器语言纯命令(我可以处理那部分)并将其写入可执行的 .ELF 格式(我需要帮助的部分)。
如果我反对转储它,我可以对架构有所了解。首先objdump -x ./yo
(获取标题信息):
现在objdump -s ./yo
获取内容:
很确定“.text”部分包含从上述命令生成的纯机器代码字节(例如,m ov edx, len
;等)
当我在 JavaScript 中逐字节读取它以及字符串时,我得到了这个(360 行,每个字节一行,第一行号,然后是基数 2 中的字节,然后是 charCode,然后是实际字符):
一个简单的hexdump
命令也会产生以下结果:
我也看过https://docs.oracle.com/cd/E19455-01/806-3773/6jct9o0bs/index.html
以及这个https://linux-audit.com/elf-binaries-on-linux-understanding-and-analysis/
问题:
确切地说,我怎样才能简单地将纯机器语言命令列表直接“插入”到 ELF 文件格式中(可能使用基于上述的模板?)而不使用任何外部依赖项(如 NASM、LD 等),只有一个纯二进制作家?
我尝试简单地更改字符串“Hello, World!” 到更长的时间,但是(显然)它被切断了,因为长度仅设置为特定数量,但我不知道在哪里可以找到二进制代码中的长度属性,如果有人至少可以指出的话,那么这将是有帮助的
assembly - 强制 RIP 相对寻址?
有没有办法强制编译器或汇编器只生成 RIP 相对寻址代码?
我试图找到一种方法来提供从传统编程模型到图灵完备的计算抽象模型的映射。
assembly - 需要帮助找出 ARM 中的分段错误
所以我最近收到了一个第二年计算机科学模块的项目,我们在那里做计算机体系结构。我们被指示编写 ARM 汇编代码以输出 n=15 和 n=30 的斐波那契数列。
我曾尝试在线查看多个资源,但 ARM 的使用不那么广泛,在 2020 年也不再受支持。我已经能够编译和运行我的代码,但是它告诉我“分段错误”并输出错误的数字(139)。
上周末我一直被困,尝试了多次修复,但没有运气。如果有人可以指导我正确的方向,或者帮助我识别我的逻辑或语法错误,那就太好了。我将在下面发布代码,并在此先感谢您!!!
assembly - 用简单的英语解释这个汇编语言程序的作用
该问题没有更多信息。我认为程序将数字 1-5 相乘,直到达到 0 然后停止。我对此是否正确?
c - 二进制中点的不同表示
我在 C 中有一个代码,它只是打印 hello world,就像这样
为了在 ubuntu 中编译代码,我使用了这个命令
make filename
,它给了我这样的汇编代码:
然后我使用它翻译成机器语言xxd -b hello
,这给了我(输出的子集)
我的问题是:为什么(点“。”)在二进制中具有不同的表示形式,就像在第一行和第四行中我们有连续的点但具有不同的表示形式一样?
我知道这是一个奇怪的问题,但这只是为了兴趣和知识,任何帮助将不胜感激
assembly - 如何获取 x86 指令大小来计算物理地址
我在 x86 (intel 8086) 的 CISC 程序集中的可变大小指令上遇到了一些问题。
概括
我的时间非常有限,我想在给定的代码段中找到每个 asm 源指令的物理地址(我假设是 MASM 汇编器)。所以我不想知道获得确切操作码(又名机器码指令)的过程。我的意思是我不需要组装后每条指令的实际字节,只需要位置。
问题陈述
有没有办法在不知道确切操作码的情况下确定指令操作码的大小(例如 2 个字节或 3 个字节)?请记住,我唯一需要的是每条机器代码指令的大小。基本上,我正在寻找一个一般规则/技巧来提取大小。
原因
这是一个示例,说明计算有关操作码的物理地址可能会出现问题的原因:
offset+2
因为我们将字节存储在内存中,而前一条指令也是 2 个字节。
这就是问题所在!由于前一条指令的 3 字节长度。我怎么知道这条指令有 3 个字节长?
到目前为止我做了什么
我已经安装了 DOSBox 和 dosemu ,它们都有一些与此无关的其他问题。(在 Linux 和 Windows 中)。这样我就可以获得操作码而不必太担心。
问题参考
问题从(MAZIDI THE 80x86 IBM PC AND COMPATIBLE COMPUTERS 4th Edition Book in Chapter 1. question 34. in pages 47-48.)的作业开始。