发布于 2026-01-06 0 阅读
0

在 Assembly x86 中构建 Web 服务器,第 III 部分,código de máquina

在 Assembly x86 中构建 Web 服务器,第 III 部分,código de máquina

该集是内存层次结构、CPU 结构和注册器的基础,适用于实践示例:构建计算机程序。

计算机程序是什么?

Teremos a resposta para esta pergunta ao longo deste artigo。 Vamos abordar muitos conceitos, desde código de máquina (o mais importante na minha opinião), 二进制、十进制和十六进制的数字系统。

Iremos também 编译器操作码、chamadas de sistema、modo 内核、libc、ASCII、标准流;更改为十六进制二进制文件。

最后,我们将介绍 CPU 的整体程序和解释。

Ainda não entraremos em Assembly。凭借直觉和直觉,我们将完成传奇故事,并以最大程度地完成任务,并通过组装程序来了解原始概念。

但是,如果您想通过这种方式获得更多信息,您可以立即将其连接到二进制文件,然后将其作为您使用的设备的一部分。如果没有任何二进制文件或可执行文件的链接,则需要执行此操作chmod +x

Lembrando 是 Linux 环境中最重要的,但与功能相反。在环境和虚拟化之外的环境中,您可以与我们的传奇故事一起度过,并从一些基本概念中获得想法和实现

Ainda não será o código do web server, o programa proposto Neste post é bastante simples, mas estamos quase lá. Vamos focar em conceitos basic para que futuros artigos, que cobrem or desenvolvimento do web server, possam ser melhor compreendidos.

只要准备好,就可以在集会中准备好与记忆相关的代码和操作。


议程


计算机程序

在第二部分中,CPU 的原始功能是内存指令、解码、执行和设置内存结果。

CPU解码指令

进入一个大模式,将计算机程序与 CPU 处理器的指令结合起来。以下是一些不同的程序

程序和记忆

潜在的问题是,在不同的程序中可能会出现以下问题:

记忆冲突

解析器是最重要的,因为它是一个“孤立”的程序说明,​​但它不是计算机的程序。

这是有关程序操作系统的全部内容

Lembrando que nesta saga,vamos focar apenas em sistemas UNIX-like,mais precisamente distruibuições GNU/Linux

🔵 操作和流程系统

Cada 程序的执行不是封装在 uma estrutura chamada processo中,而是虚拟的内存主体。

实际操作中,程序本身就是“0x10000”,孤立的。

操作和流程系统

🔵 嗯,永远的计划

Como o SO aloca recursos de memória (dentre outros) para o processo, nosso programa precisa indicar quando termina.

这是一个保留记忆的空间,以便在处理过程结束时使用。这是一个在结尾处出现问题的记忆。

程序退出

如果您不这样做,那么您将无法执行程序。


Nosso primeiro programa

Vamos trabalhar inicialmente com um 示例 bastante simples。嗯,程序是虚无缥缈的

Nossa Leandro,como assim umprograma que não faz nada?

Sim,这是一种中音语言。 CPU 的设计是这样的,在程序中的指令是“não faz nada”:程序的终点是lembra?

🔵 CPU 的语言,或二进制系统

CPU 与电子设备一起工作,是电子脉冲的一部分。 Mas conseguimos Abstrair tais pulsos como 0 ou 1.

因此,CPU 的运行模式将使用二进制系统的指令,组合为 0 或 1。

Nossoprograma que não faz nada além de “terminar” pode serpresentado então pelo seguinte conjunto de instruções:

不要担心编写程序。 Por enquanto são so exemplos de código de máquina para que possamos entender bem os conceitos



10111111 00000001 00000000 00000000 00000000   
10111000 00111100 00000000 00000000 00000000  
00001111 00000101                            


Enter fullscreen mode Exit fullscreen mode

没有二进制系统、卡达符号和查马多德比特。这是与 8 位 CADA 结合使用的 12 个简单程序。Conte você mesmo para recognizer!

二进制系统由代表数字的符号组成的。瓦莫斯简介:



0
1


Enter fullscreen mode Exit fullscreen mode

阿卡布。 Com 1 dígito podemos ter 2 组合 apenas。 Mas e se quisermos 代表多个数字吗?这是所有数码产品的组合。

Para 2 dígitos, conseguimos aumentar para 4 组合:



00
01
10
11


Enter fullscreen mode Exit fullscreen mode

如果连续,请输入 3 个数字,然后再进行一次操作,即可获得 8 种组合:



000 
001 
010 
100
100 
101 
110 
111


Enter fullscreen mode Exit fullscreen mode

Com isto, temos um padrão:

  • 1 数字:2 个组合
  • 2 位数字:4 种组合
  • 3 位数字:8 种组合

不修理指数垫片。 Estamos pegando 或数字 2 的基础和应用程序或数字的指数:

符号编号 ^ 数字编号

  • 2^1 = 2
  • 2² = 4
  • 2³ = 8

Extrapolando para 4 ou mais dígitos, podemos chegar na seguinte conclusão:

  • 2^4 = 16 种组合
  • 2^5 = 32 种组合
  • 2^6 = 64 种组合
  • 2^7 = 128 种组合
  • 2^8 = 256 种组合

E assim por diante...

你知道 Leandro 的名字吗? Vim aqui pra ficar escovando 位?

Não exatamente。没有程序,与 8 位(chamado de byte)结合使用的 CPU 表示 12 字节的程序。

与 CPU 一样,我们还需要关注以位表示的指令,以及以简单和直观的方式表示十进制系统的转换器。

🔵 著名的十进制系统

我习惯使用十进制系统。 Muitos números no nosso dia-dia são 代表十进制系统的数字。

Falamos de números como “dez”、“cento e quinze”、“quarenta e dois” sem qualquer Problema,pois foi o que aprendemos desde a primeira infância。我们要解决内在的问题,然后再考虑数字系统的问题。

Vamos por um momento esquecer que sabemos sistema October 和 aplicar as mesmas regras que aplicamos para o sistema binário.

重复这些操作,没有任何二进制系统可以设置符号:0 和 1。

E 没有小数位?

配置符号如下:



0 1 2 3 4 5 6 7 8 9


Enter fullscreen mode Exit fullscreen mode

在没有二进制系统的情况下,您可以使用 1 种数字方式获得 10 种可能的结果。

Já chegou 没有新意吗? Acabaram 作为组合? Não tem Problema,vamos subir pra dois dígitos semper começando pelo dígito mais à equerda possível:



00 01 02 03 04 05 06 07 08 09
10 11 12 13 14 15 16 17 18 19
20 21 22 23 24 25 26 27 28 29
...
...........................99


Enter fullscreen mode Exit fullscreen mode

那么,com apenas dois dígitos no sistemadecimal,podemos 组合 100 个不同的数字!

O padrão é o mesmo no sistema binário, podemos logo aplicar exponenciação da base, sendo:

符号编号 ^ 数字编号

Portanto:

  • 10^2 = 100 种组合
  • 10^3 = 1000 种组合
  • 10^4 = 10000 种组合
  • 等等等等

将二进制转换为十进制

二进制和十进制的数字系统是这样的,“紧凑”程序是二进制和十进制的初始程序,是直观的术语,不是吗?

需要注意的是,对话中并不存在困难:

  • 0 é semper 0, pois este símbolo está Presente em ambos sistemas de numeração
  • Mesmo vale para 1, pois está Presente em ambos

Se quisermos então converter 10(que é o próximo número depois de 1 em binário) de binário pra October, vamos aplicar a seguinte regra:

数字 x 2^数字位置

...数字操作的结果,可以直接将零定位到,将 acordo 定位到 senhora matemática,将数字提升到é UM *。

Com isto:

  • 10 = (1 × 2^1) + (0 × 2^0) = 2 + 0 = 2

Vamos 极地外 um pouquinho?

  • 11 = (1 × 2^1) + (1 × 2^0) = 2 + 1 = 3
  • 100 = (1 × 2²) + (0 × 2¹) + (0 × 2⁰) = 2 + 0 + 0 = 4

耶!不错吧?

Agora vamos 转换器字节一个字节执行此程序:



10111111 00000001 00000000 00000000 00000000   
10111000 00111100 00000000 00000000 00000000  
00001111 00000101                            


Enter fullscreen mode Exit fullscreen mode
  • 10111111 = (1 x 2^7) + (0 x 2^6) ... = 191
  • 00000001 = (0 × 2⁷) + (0 × 2⁶) ... + (1 + 2⁰) = 1
  • 等等 等等 até chegar ao 12° 字节

将十进制程序转换为接下来的格式:



191 1 0 0 0
184 60 0 0 0
15 5


Enter fullscreen mode Exit fullscreen mode

在 CPU 指令中,não é comum 表示十进制系统,在每个十进制系统中都没有串行分割的字节(8 位),因此,需要存储内存

问题的格式是 10 个符号的十进制组合(恢复 2),是位和字节的量化

8 的数字量化系统是什么?

Sabendo que 16 é divisível por 8 (resto 0) e não causaria desalinhamento entre bits pra代表性的程序,será que存在于系统中的数字16符号para podermos compar ainda mais a representação nosso程序?

Sim,十六进制系统的estamos falando 。

🔵 十六进制,或计算者的查询

请注意,您可以使用十六进制。类似地,您可以使用十进制系统,也可以使用十六进制系统以及应用程序。

Quantos símbolos temos à disposição? 16.

大名: hexa , 代表 6, e十进制代表 10. DEZ + SEIS!!!!!!111

Os primeiros 10 símbolos são exatamente como 无小数:



0 1 2 3 4 5 6 7 8 9


Enter fullscreen mode Exit fullscreen mode

E Quanto aos 6 símbolos Restantes? Poderíamos 代表表情符号、GIF 动画或 derivados de batata,mas seria muito mais simples 代表 Armos 作为 primeiras 6 字母 do alfabeto,não?



0 1 2 3 4 5 6 7 8 9 A B C D E F


Enter fullscreen mode Exit fullscreen mode

当将其与 mesmas 组合在一起时,请始终保持以下状态:



0 1 2 3 4 5 6 7 8 9 A B C D E F
10 11 12 13 14 15 16 17 18 19 ?


Enter fullscreen mode Exit fullscreen mode

Qual seria o próximo? 20?

Não、jovem、vamos 组合 com 作为letras Restantes



...
19
1A
1B
1C
1D
1E
1F


Enter fullscreen mode Exit fullscreen mode

Agora sim,与 dígito 2 组合:



20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 
30 31 32 33 34 ............................. 3F 
...........................99................9F
100


Enter fullscreen mode Exit fullscreen mode

Com apenas 2 digital no sistema hexadecimal, podemos ter 256combinações de números differenterentes!

  • em binário, 2 位数 = 4 组合
  • em 十进制,2 位数字 = 100 个组合
  • em hexa,2 位数字 = 256 个组合

例如,256 个组合包括 2 个符号FF,8 个符号的详细信息,无需1111 1111任何二进制系统,可以直接使用代表可视化程序的空间。

O céu é o limite 🚀

应用程序将十进制的指数转换为十进制:

  • do 0 ao 9 é tudo igual
  • A = 10,B = 11,C = 12,D = 13,E = 14,F = 15

Onde:

dígito do sistema * 16^posição do dígito

Com isto,转换1AFF十进制,ficaria:

  • 1A = (1 * 16^1) + (10 * 16^0) = 16 + 10 = 26
  • FF = (15 * 16^1) + (15 * 16^0) = 240 + 15 = 255

好的,二进制到六进制的转换器

十六进制的字节11111111是什么意思?十进制转换的推论,例如:

  • sabendo que o byte 11111111代表 255 em 十进制,e sabendo que FFem 十进制 é 255,portanto concluímos que11111111 = FF
  • 两个字节分开,计算结果,1111 = Fportanto chegamos no mesmo resultado

Geralmente empregamos 是一个 4 位 CADA 的 2 部分字节分割技术。 Assim 可以轻松实现可视化。

O简单的程序是二进制的原始脚本,可转换为十六进制的连续形式:



BF 01 00 00 00 
B8 3C 00 00 00 
0F 05          


Enter fullscreen mode Exit fullscreen mode

欧巴! Já conseguimos ter uma leitura mais intuitiva,certo?CPU有何意义BF 01B8 3C0F 05

🔵 操作码

Cada CPU 具有特定的结构。对于 x64(或 x86_64),它与操作码结合使用,无需手动表示为 CPU 操作之外的指令、注册器。

De acordo com o manual :

  • o 操作码BF移动 um valor imediato para o 注册器 RDI
  • 01 00 00 00: valor imediato hexa que 代表1十进制,mas na ordem inversa no formatto little-endian (vamos falar de endianness mais a seguir)
  • o 操作码B8移动 um valor imediato para o 注册器 RAX
  • 3C 00 00 00: valor imediato hexa que 代表60十进制,mas na ordem inversa 无小端格式
  • o 操作码0F 05entra no modo “kernel” do SO e aguarda a resposta de uma chamada de sistema (syscall)

字节数代表了 CPU 结构的相反顺序吗?

🔵 字节序

字节顺序与 CPU 内存中的进程字节数有关。

Vamos trazer 是二进制的字节示例,是10000001十进制129的。 Prestando atenção nos expoentes:

2⁷ + 2⁶ + 2⁵ + 2⁴ + 2³ + 2² + 2¹ + 2⁰

  • 一个位可能是 esquerda,1 x 2^7 = 128
  • somado com o bit mais à direita, 1 x 2^0 = 1
  • o Restante dos bits está tudo a Zero, não precisam entrar pra soma

Podemos inferir que os bits mais à direita não têm tanto peso no valor Final, por isso são chamados bits menos senseificativos

O bit da direita incorporou apenas o valor 1 pro resultado Final

Da mesma forma, os bits mais esquerda têm no valor Final, por isso são chamados de bits mais importantivos .

O bit da esquerda incorporou 128 pro resultado Final, trazendo mais importantância

这是定义位的意义和字节顺序的属性。 CPU 的结构有多种,分别是大端和大端(大端)和小端(小端)。

做出有关历史或便于操纵蓬泰罗斯的决定。不同的系统决定了逆变器的空闲/书写或无字节。

CPU x86_64,采用小端格式,以 6 进制或 4 字节格式传输,00 0D 00 3C不采用3C 00 0D 00小端格式。

结论是,对我们的伪程序进行了补充评论:



BF 01 00 00 00  ; MOVE 1 PARA RDI
B8 3C 00 00 00  ; MOVE 60 PARA RAX
0F 05           ; CHAMADA DE SISTEMA (SYSCALL)


Enter fullscreen mode Exit fullscreen mode

CPU 是否可以作为系统调用开发执行程序?由 padrão 提供,系统调用编号为注册商RAX。 E como saber qual 或 número da syscall?

嵌套链接exit,作为 x64 架构的系统调用的完整列表,以及所有表示 60 十进制数或3C十六进制数的内核系统调用。这是一个简单的说明B8 3C

接下来,我们将深入讨论系统调用和内核的操作。


Nosso segundo programa

打开 apenas 或 máquina de umprograma que não faz nada (apenas termina),mas foi bastante util para entendermos sistema binário, hexadecimal e outros conceitos。

继续探索 máquina 的代码。 Não precisa escrever nada,mas pode acompanhar com o código que disponibilizei no início do artigo and rodar os comandos em Linux

Vamos agora elaborar um hipotético 程序 que imprime “Hello, World” na saída (STDOUT)。 Para isto, devemos:

  • alocar memória 字符串“Hello, World”

Sim,dados ficam na memória junto com o programa,lembra?

  • escrever a string na saída STDOUT, que é a saída padrão do programa (em outras palavras, a "tela")

有关 STDOUT、标准流和流重定向的详细信息,请参阅UNIX 管道的结束语

  • 终止程序

Alocar、imprimir、terminar。打开系统中的 STDOUT,这是系统外程序的终端。波坦托,特莫斯:

  • 程序存储器中的数据分配
  • 2 chamadas de sistema

🔵 Alocando bados na 程序记忆

在图形语言中,一个字节一个字节地排列,例如“Hello, World”字面意思,代表了一行字,一个字符在记忆中的空间

十进制或十六进制表示的字符翻译说明。这是ASCII的意思。

🔵 ASCII

ASCII(美国信息交换标准代码),在通信中使用的字符代码,编号为 60。

O padrão ASCII etabeleceu inicialmente 7bits para cadacharacteres and foiconcebidoparasuportarcharacterespresentes一些英语语言。根据限制,最多可支持 128 个字符 (2^7),包括数字十进制、特殊字符和字母、大字符和小字符。

tabela ASCII

稍后,我们将在表格中扩展一些主要特性,以支持更多特性,但也限制了惯用语和特殊特性的支持。

Unicode的运行速度、各种不同的编码能力、允许使用多种字符和各种习语的字母。

Unicode 考虑到了 ASCII 码中的 128 个字符,以解决系统中的兼容性问题。 Portanto,现代系统中使用的 Unicode 编码以 UTF-8 为例,在 ASCII 术语中嵌套有足够的示例

使用 Tabela ASCII 验证字符串中的十六进制字符:



H: 0x48     
e: 0x65     
l: 0x6C     
l: 0x6C     
o: 0x6F
,: 0x2C

W: 0x57
o: 0x6F
r: 0x72
l: 0x6C
d: 0x64



Enter fullscreen mode Exit fullscreen mode

0x é uma notação, um 前缀确定x的数字

下列程序中的第一个字节是这样的:



48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 0A


Enter fullscreen mode Exit fullscreen mode

很好,agora vamos“montar”作为系统调用的指令,没有STDOUT。 Como o 内核 faz isso?

🔵 系统调用

系统调用包括“用户”程序和“内核”程序。基本的程序是系统操作核心执行的一项功能。

打开嵌套链接,进行编译,这是对内核最重要的影响,也是Linux 内核的一部分

Linux 内核C 上编写了 80 至 90 段的文件,并且在 C 上编写了 escrito,实际上是在 C 上声明的系统。

例如,没有手动系统调用可以解决系统或命令实用程序中的内核问题。

一个使用chamada pra escrever no STDOUT se chama write的方法,定义了功能:



ssize_t write(int fd, const void buf[.count], size_t count);


Enter fullscreen mode Exit fullscreen mode

...这是在 C 图书馆 (libc) 中提出的,是内核合并的。

作为 GNU 发行版,我可以使用 Ubuntu,并glibc在 GNU/Linux 系统中使用 C 语言镜像存储库。

修复writeespera 3 功能的争论:

  • fd, ou 文件描述符, que nosso caso é o STDOUT, 代表 pelo valor 1

💡 STDIN代表 0 和STDERR代表 2。

  • buf,或缓冲区,que é o ponteiro para o início do buffer de bados。无法从内存中读取“Hello, World”字符串,或启动字符串“Hello, World\n”。
  • count, que éo tamanho do buffer de bados a ser escrito。字符串“Hello, World\n”,计数为 13,包含 12 个字符,字符串最多 1 个字节。

🔵 Montando a syscall write

对于系统来说,需要一个接口来确定系统运行的通信程序。

决定因素是 ABI(应用程序二进制接口),它定义了数据的结构或计算功能。

对于 Linux 内核的功能来说,我们可以使用CPU 结构和操作系统的约定来确定该问题。

您可以使用系统调用的注册器来操作它write。 Novamente seguindo esta tabela (que ajuda muito), vamos fazer instrução por instrução:

👉 ARG0
是 RDI 注册器功能的主要参数,它1代表文件描述符STDOUT。 Em hexa,o手册 x86 diz que o 操作码 hexa é BF,seguido do hexa 00 00 00 01em 格式小端:



BF 01 00 00 00


Enter fullscreen mode Exit fullscreen mode

👉 ARG1
是第二个参数,是一个内存中的字符串,用于注册器 RSI 的缓冲区。

程序中没有出现任何字符串,因此渲染效果是这样的0x401000。 Portanto,o 操作码para o moveno registrador é 48 BEeo valor do endereço de memoria no formatto little-endian em hexa,00 10 40



48 BE 00 10 40 


Enter fullscreen mode Exit fullscreen mode

👉 ARG2
是注册器 RDX 功能的第三个参数,它代表缓冲字节,没有文件描述符定义,没有注册器 RDI (ARG0)。

O opcode é o BAeo valor é 13em hexa, que é 00 00 00 0Dsó que no formatto little-endian:



BA 0D 00 00 00


Enter fullscreen mode Exit fullscreen mode

Agora,vamos colocar no registrador RAX on número da syscall write,que de acordo com esta tabela(sempre esta tabela,habitue-se a ela),éo número 1,mas em hexa e little-endian:



B8 01 00 00 00


Enter fullscreen mode Exit fullscreen mode

Falei bastante desta tabela,de syscalls 和 little-endian aqui,nos próximos artigos vou falar cada vez menos。一个想法,集中在其他方面,并且是最基础的

最后,请参阅系统调用指令,操作码如下:



0F 05


Enter fullscreen mode Exit fullscreen mode

Trecho final da syscall write:



48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 0A ; "Hello, World"

BF 01 00 00 00                 ; MOV 1 para RDI
48 BE 00 10 40                 ; MOV 0x401000 para RSI
BA 0D 00 00 00                 ; MOV 13 para RDX
B8 01 00 00 00                 ; MOV 1 para RAX (write)
0F 05                          ; SYSCALL


Enter fullscreen mode Exit fullscreen mode

系统调用writejá tá montada,agora falta 程序终点。

🔵 Montando a syscall exit

A API da chamada de sistema exit pode ser Consultada no Manual , e tem a seguinte assinatura no glibc:



void _exit(int status);


Enter fullscreen mode Exit fullscreen mode

👉 ARG0
最初的参数和终端状态,与特定的POSIX一致,可在 0 到 255 秒内发送或 0 指示程序终端出现错误。



BF 00 00 00 00


Enter fullscreen mode Exit fullscreen mode

Agora,vamos ao trecho 最后的系统调用退出



BF 00 00 00 00          ; MOV 0 para RDI
B8 3C 00 00 00          ; MOV 60 para RAX (exit)
0F 05                   ; SYSCALL


Enter fullscreen mode Exit fullscreen mode

完整程序:



48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 0A
BF 01 00 00 00 
48 BE 00 10 40
BA 0D 00 00 00 
B8 01 00 00 00 
0F 05          
BF 00 00 00 00 
B8 3C 00 00 00 
0F 05          


Enter fullscreen mode Exit fullscreen mode

Tomando 是一个二进制示例,其中的一些字节包含了程序运行所需的系统所需的标头。

Vamos executar o binário:



$ ./example

Hello, world


Enter fullscreen mode Exit fullscreen mode

耶!Que dia, hein?


Manipulando o nosso programa

存储库中的二进制文件、存储库中的文件、二进制文件的十六进制转储、xxd二进制文件的修复、字节4096的一部分、字节的量化信息内斯特阿蒂戈:



xxd -s 4096 -g1 -c8 -l52 example

00001000: 48 65 6c 6c 6f 2c 20 57  Hello, W
00001008: 6f 72 6c 64 0a bf 01 00  orld....
00001010: 00 00 48 be 00 10 40 00  ..H...@.
00001018: 00 00 00 00 ba 0d 00 00  ........
00001020: 00 b8 01 00 00 00 0f 05  ........
00001028: bf 00 00 00 00 b8 3c 00  ......<.
00001030: 00 00 0f 05              ....


Enter fullscreen mode Exit fullscreen mode

太棒了,不是吗?

因此,从这起故事开始,我们就可以直接使用二进制文件进行操作hexedit

这是Blau Araújo 的视频。这是一段梦幻般的真实故事和第一部的故事。 Pra mim é a melhorreferência para conteúdo de baixo nível em pt-BR

Para mudar o binário, rodamos o comando:



hexedit --color example


Enter fullscreen mode Exit fullscreen mode

Que vai abrir um editor bastante específico。 com /,以 6 进制巴士为例,以“48”为例,可以从字符串开始。

Vamos trocar o "W" maiúsculo por "w" minúsculo, diretamente em código de máquina, quesignifica trocar o byte 57 da tabela ASCII por 77 :

Então:



48 65 6C 6C  6F 2C 20 57  6F 72 6C 64  0A 


Enter fullscreen mode Exit fullscreen mode

Passa a ser:



48 65 6C 6C  6F 2C 20 77  6F 72 6C 64  0A 


Enter fullscreen mode Exit fullscreen mode

按下ctrl+s并保存ctrl+c 即可。新执行者 e:



$ ./example

Hello, world


Enter fullscreen mode Exit fullscreen mode

MEO DEOS,令人印象深刻!!!!111


一个vida de quem programa é assim?

Leitores mais atentos devem estar se perguntando:

永远是一个生活计划吗? Ficar escovando 位和 mudar ditamente código de máquina 十六进制?

Para a maioria esmagadora dos casos, não。

翻译者是否可以在一个温和的危机中以人性化的语言来指导翻译程序?

汇编器作用是允许使用汇编语言和操作码转换器,如 CPU 指令。

重新设计后,我们将在 GNU/Linux 系统中使用 64 位 x86 语言程序集来构建 NASM。


结论

Jornada longa essa,hein?基本概念多种多样,二进制系统、十六进制、操作码、系统调用、libc、ASCII...

这是关于组装组件的基本概念或主要内容。

没有 próximo artigo,vamos abordar conceitos básicos de Assembly,buscando converter 或 simplesprograma que fizemos Neste artigo em um asm(atalho pra dizer“Assembly”)是组织的。

接下来,我将进入套接字系统调用,并绑定并接受与网络服务器相关的内容。 Vamos também 操作缓冲器 de arquivos、 alocar dados dinamicamente na memória、 trabalhar com 线程、 锁、 criar fila na mão、 enfim、 ainda há muita coisa por vir。 Isto aqui é apenas a ponta do 冰山

还提供教程、助记符、内存实现、内存段、程序内存布局、在其他地方调试 com gdb 。

Fiquem ligades!


参考资料


Blau Araújo,汇编材料
https://codeberg.org/blau_araujo/assemble-nasm-x86_64/raw/branch/main/pdf/aula01.pdf
Felix Cloutier,“x86 指令参考”
https://www.felixcloutier.com/x86/
ASCII 表
https://upload.wikimedia.org/wikipedia/commons/thumb/1/1b/ASCII-Table-wide.svg/2560px-ASCII-Table-wide.svg.png
POSIX,维基百科
https://en.wikipedia.org/wiki/POSIX
ASM x86 手册
http://ref.x86asm.net/coder64.html
系统调用表
https://x64.syscall.sh/
Linux内核,维基百科
https://en.wikipedia.org/wiki/Linux_kernel
ABI,维基百科
https://en.wikipedia.org/wiki/Application_binary_interface
x86 调用约定
https://en.wikipedia.org/wiki/X86_calling_conventions

文章来源:https://dev.to/leandronsp/construindo-um-web-server-em- assembly-x86-parte-iii-codigo-de-maquina-bgk