在我可以找到的关于 MOV 助记符的操作码的所有文档中,每个操作码都没有单独记录。操作码B8h+记录为将 16 位或 32 位数据移动到 16 位或 32 位注册表。究竟关注什么注册表,取决于B8h操作码高出多远。也就是说,要获得B8h类型为 MOV 指令的操作码,您需要B8h将寄存器的编号相加。问题是,我没有找到有关每个注册表数量的任何信息。以下是我的猜测,但我不确定。
目的地登记处。操作码。
AX B8
CX B9
DX BA
BX BB
EAX BC
ECX BD
EDX BE
EBX BF
Run Code Online (Sandbox Code Playgroud) 我需要帮助了解如何在 RISCV 中解决这个问题。提供以下十六进制值的汇编语言指令:
地址 1000:b3 地址 1001:0b 地址 1002:9c 地址 1003:41
我知道我必须更改为二进制,并且 RISCV 是小端字节序,但除此之外我不知道如何继续。我有几个这样的问题,但我想自己解决剩下的问题。
有没有办法强制编译器或汇编器只生成 RIP 相关的寻址代码?
我试图找到一种方法来提供从传统编程模型到图灵完备抽象计算模型的映射。
assembly x86-64 machine-language machine-code relative-addressing
我有一个我正在尝试逆向工程的设备。我试图避免打开物理设备,所以我在进行固件更新时嗅探了收到的数据包。但是我不知道这个微处理器是什么架构。
这是一个示例:
df f8 0c d0 01 f0 06 f8 20 48 20 47 31 15 06 20 f8 f5 03 20 09 4b 1e f0 04 0f 1c bf ef f3 09 80 18 47 ef f3 08 80 06 49 06 4a 88 42 01 d8 90 42 02 d8 8d 46 4f f0 20 20 18 47 20 20 51 77 03 20 f8 f5 03 20 70 e2 03 20 30 b4 50 e8 01 2f …
汇编代码和机器代码是由架构指定的吗?我知道你如何实现架构对你来说是不重要的(微架构可以实现架构)。但我不明白汇编或机器代码是否是由架构指定的?
assembly instruction-set cpu-architecture machine-code micro-architecture
While typing a program as a high level programmer, n = 0; looks more efficient and clean.
But is n = 0; really more efficient than if (n != 0) n = 0;?
when n is more likely to be 0.
when n is less likely to be 0.
when n is absolutely uncertainty.
Language: C (C90)
Compiler: Borland's Turbo C++
Minimal reproducible code
void scanf();
void main()
{
int n; // 2 bytes
n=0; // Expression …Run Code Online (Sandbox Code Playgroud) 对于一个新手/愚蠢的问题,我很抱歉,但这让我困扰了一段时间,而且似乎很难找到直接的答案。问题是关于计算机如何在低级别工作 - 更具体地说,是否有计算机可以执行的命令未包含在x86-64指令中。换句话说,您可能会问是仅使用 x86-64 指令编程的操作系统,并且操作系统运行的程序也是如此。请注意,我不是在询问特定于处理器的隐藏命令或附加命令,我们可能假设这些不存在。
提问的动机:
通常的说法是编译器将特定语言的程序编译为机器码。但是,有许多命令不能(据我所知)仅使用 x86-64 指令用汇编语言编写。甚至像“malloc”这样简单的东西。所以看起来为操作系统编写的实际程序由机器代码和操作系统指令组成?
如果查看 x86-64 指令集,似乎 I/O 命令(例如访问键盘、鼠标、硬盘驱动器、GPU、音频接口、时间、显示器、扬声器等)并没有针对它的所有命令,尽管可以使用 INT 命令来完成某些任务。根据这个答案“在现代体系结构上,外围设备的访问方式与内存类似:通过总线上的映射内存地址。”,无论在代码方面意味着什么。所以看起来甚至操作系统也不是只用 x86-64 指令编写的?
assembly operating-system cpu-architecture machine-code low-level
我使用 GCC 为 Windows 10 (mingw-64) 编译了以下 C 代码:
#include <stdio.h>
int main(){
printf("Hello World!");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
用命令
gcc.exe -o 测试 test.c
它有效是因为当我执行生成的文件时,我确实得到了一个 Hello World!在控制台中,但是我很惊讶,因为当我在记事本 ++ 中打开 test.exe 时,它有 220 行长,其中包含一些可读文本,例如
地址 %p 没有图像部分 VirtualQuery 在地址 %p 处失败了 %d 个字节
并且
未知的伪重定位协议版本 %d。未知的伪重定位位大小 %d。
然而,当我在 Sublime Text 3 中打开同一个文件时,我得到了超过 3300 行的一些看似随机的数字和字母,例如:
4d5a 9000 0300 0000 0400 0000 ffff 0000
b800 0000 0000 0000 4000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 …Run Code Online (Sandbox Code Playgroud) 在学校里,我被告知要描述机器语言、汇编语言和高级计算机语言之间的区别。
给出机器语言代码和汇编语言代码的例子,然后命名两种高级语言
这是我的回答:
“机器和汇编由计算机直接执行的指令组成。高级是比机器语言更接近英语的编程语言。对于机器代码,我的例子是二进制,如 1101 或 1001。C 是一种汇编语言代码。Java 和 Python 是高级语言。”
machine-code ×9
assembly ×7
c ×2
high-level ×1
if-statement ×1
low-level ×1
masm ×1
notepad++ ×1
opcode ×1
riscv ×1
sublimetext3 ×1
variables ×1
x86-16 ×1
x86-64 ×1