汇编和机器码不就是文本吗?

汇编和机器码不就是文本吗?

我无法理解一个事实:源代码是文本,它会被翻译成汇编语言(大致如此),但如果我能看到汇编语言,那就意味着它也是文本,机器码也是如此。这个“文本”在什么时候变成 CPU 中的信号。

答案1

当然都是文本,区别在于抽象层次。汇编语言和 C 语言的 Hello World

SECTION .data           ; initialised data section

Msg: db "hello world", 10           ; message to print
MsgLen: equ $ - Msg                 ; length of message


SECTION .text           ; code section

global start
start:

    ; printing message, use write()
    ; system call 4 syntax: 
    ; user_ssize_t write(int fd, user_addr_t cbuf, user_size_t nbyte)

push dword MsgLen   
push dword Msg      
push dword 1        
sub esp, 4          
mov eax, 4          
int 80H             
add esp, 16         

; program exit, use sys_exit()
push dword 0        
sub esp, 4          
mov eax, 1         
int 80H     

相对

#include <stdio.h>

int main(void)
{
    printf("Hello, World!\n");
}

换句话说,没有打印到屏幕命令,但 C 允许我们使用。这意味着 PRINT 实际上代表了一堆 CPU 可以处理的低级代码。汇编更接近 CPU 可以处理的指令。

我们不能告诉它打印到屏幕上,我们必须告诉它如何一步一步地做。像 C 这样的语言更接近人类语言,但它需要将命令翻译成 CPU 可以理解的东西。汇编语言是告诉 CPU 做什么的更直接的方式,机器语言以更文本的形式表示。

它与我们在计算机中随处可见的数据表示的低级到高级级别相同。例如,“HELLO”(ascii)表示为十六进制“48 45 4C 4C 4F”,二进制表示为“01001000 01000101 01001100 01001100 01001100 01001111”。一般来说,越接近“计算机语言”,我们人类就越难理解。

甚至更低的级别,零和一也会变成编码脉冲或电信号和电荷。简化,除了“HELLO”之外还有一些抽象层,例如要写入 SSD 的是“01001000 01000101 01001100 01001100 01001100 01001111”>,它被转换为电荷以对单个 NAND 单元进行编程。是的,0100 等是可读文本,但它是模拟信号的解释/表示。

答案2

一切都是文本,文本是二进制编码的...所以无论您看到什么(无论是源代码、机器代码、音乐文件还是介于两者之间的任何内容)实际上始终是 1 和 0(开和关)。

机器代码只是 CPU 被设计用来读取的语言中的指令(CPU 不会读取十六进制或其他什么,它知道读取 1 和 0,并使用每组二进制数据来找出要执行的操作的指令。)

答案3

源代码是文本,

没错,但是“源代码“是含糊的。有高级编程语言,也有汇编语言。如果你用汇编语言编写,那么汇编语言就是你的源代码。

它被翻译成汇编语言(大致),但如果我能看到汇编语言,那也意味着它是文本,机器代码也是一样。

是的,编译器通常将高级编程语言转换为汇编语言,然后再转换为机器代码。

不要将汇编语言与机器代码混为一谈。
汇编语言有象征性的标签和变量名。
机器代码仅使用数字地址。
尝试用机器代码(仅由数字甚至操作码助记符组成)手写程序,您就会开始理解与汇编语言的实际区别。

编程语言(高级语言或汇编语言)的一个显著特点是使用语句标签和命名变量的能力。语句标签允许您插入或删除其他语句,并让编译器(或汇编器)处理地址更改。命名变量的能力意味着您让编译器分配存储位置并处理地址引用。

这个“文本”在CPU中变成信号的时刻是什么时候。

这 ”源代码“需要编译并组装成机器代码。

该机器代码可能以可加载到内存并执行的程序(称为二进制可执行文件)的形式存在。此类可执行文件通常是独立程序,不需要操作系统(请参阅可执行文件是否需要操作系统内核才能运行?)。

在操作系统下执行的机器代码通常以指定依赖项(例如动态链接器和共享库)的文件格式打包。操作系统将验证权限、分配资源、将可执行文件加载到内存中、执行地址重定位和/或与共享库链接,然后允许程序执行。

机器代码(在主内存中)由 CPU 指令组成,可以显示为数字。
基本 CPU 不断执行一个周期的

  • 获取存储在寄存器中的内存地址的(下一条)指令Program Counter
  • 增加Program Counter寄存器;
  • 将该指令解码为操作码和操作数;
  • 执行该指令。

处理器缓存、指令流水线、预测分支、等等是 CPU 增强功能,不会影响对数字计算机基本操作的理解

答案4

从回复的问题评论来看:

为了更好地解释:我认为作为机器代码的“一”和“零”的存储方式与作为文本的“一”和“零”的存储方式不同

那是对的。

test让我们创建一个包含数字0的文件ASCII 文本

$ echo 0 > test
$ cat test
0

test现在,让我们看一下二进制表示的文件:

$ xxd -b test | cut -d ' ' -f 2
00110000

这个二进制数可以转换成十进制。在 ASCII 表中查找,这是文本字符的代码0

$ python3 -c 'print(chr(48))'
0

现在,让我们以二进制(机器码的存储方式)向文件写入 0,然后查看:

$ dd if=/dev/zero bs=1 count=1 of=test
1+0 records in
1+0 records out
1 byte copied, 0.000234102 s, 4.3 kB/s
$ $ xxd -b test | cut -d ' ' -f 2
00000000

tl;dr 文本使用编码(例如 ASCII)存储,以将字符映射到一系列二进制数字。

相关内容