prefácio
Como programadores, fomos expostos a mais ou menos em nosso processo de desenvolvimento e aprendizado, então 汇编
pensamos sobre 汇编
o que é e o que podemos fazer se dominarmos a montagem?
Simplificando, é o processo de 汇编语言
traduzir em algo que um computador pode entender 机器语言
, o que chamamos de 汇编
. Aprender a montar permite que você faça engenharia reversa e entenda os princípios dos computadores. Uma parte muito importante no processo de análise reversa é 静态分析
que um APP pode ser executado em um celular porque um arquivo executável é instalado no celular, 静态分析
que é essencialmente um arquivo binário. Para analisar binário você precisa saber 汇编
.
O desenvolvimento da linguagem assembly
- O que é
机器语言
?
Na verdade, é composto de 0s e 1s 机器指令
. 加
: 0100 0000, 减
: 0100 1000, 乘
: 1111 0111 1110 0000, 除
: 1111 0111 1111 0000. 汇编语言
(linguagem assembly), que usa mnemônicos em vez de linguagem de máquina. 加
:INC EAX via compilador 0100 0000, 减
:DEC EAX via compilador 0100 1000, 乘
:MUL EAX via compilador 1111 0111 1110 0000, 除
:DIV EAX via compilador 1111 0111 1111 0000. Como o código que desenvolvemos diariamente é transformado no dispositivo terminal? Através da figura acima, você pode ver o processo de conversão do código de forma bem intuitiva. Devemos também perceber que existe uma correspondência um-para-um entre linguagem assembly e linguagem de máquina, e cada instrução de máquina tem sua contraparte 汇编指令
. A linguagem assembly pode ser obtida compilando 机器语言
e 机器语言
desmontando 汇编语言
. Linguagens de alto nível podem ser compiladas em linguagem assembly e linguagem de máquina, mas linguagem assembly\machine language é quase impossível de restaurar para linguagens de alto nível.
- Características da linguagem assembly
Ele pode acessar e controlar diretamente vários dispositivos de hardware, como 存储器
, CPU
etc., que podem maximizar a função do hardware. O código do objeto é curto, ocupa menos memória e é executado rapidamente. As instruções de montagem são os mnemônicos das instruções de máquina, que correspondem um a um com as instruções de máquina. Cada um CPU
tem seu próprio conjunto de instruções de máquina\conjunto de instruções de montagem, portanto, a linguagem assembly não é portátil. Insensível a maiúsculas e minúsculas, como mov e MOV são os mesmos. Atualmente, as linguagens assembly mais comuns são: 8086汇编
, Win32汇编
, Win64汇编
, ARM汇编(嵌入式、Mac、iOS )
.iPhone usa ARM
assembly, mas dispositivos diferentes têm diferenças porque suas arquiteturas de CPU são diferentes.
armv6
: iPhone, iPhone2, iPhone3G, 1ª e 2ª geração iPod Touch
armv7
: iPhone3GS, iPhone4, iPhone4S,iPad, iPad2, iPad3(O novo iPad), iPad mini, iPod Touch 3G, iPod Touch4
armv7s
: iPhone5, iPhone5C, iPad4( iPad com Retina Display)
arm64
: iPhone5S e posterior iPhoneX, iPad Air, iPad mini2 e posterior O Assembler gerará instruções diferentes, que CPU架构
corresponderão a diferentes conjuntos de instruções. Como o aplicativo é executado no telefone ou no computador? Através da figura acima, podemos entender basicamente o processo de execução do programa. Relacionado ao hardware é a coisa mais importante CPU
. A maioria das instruções em assembly está associada CPU
a e 内存
. Geralmente o que dizemos 32位
e64位
Sistema, a diferença está na diferença na taxa de transferência de dados, que está relacionada ao barramento de dados. O princípio de funcionamento da CPU é descarregar externamente. A CPU do sistema de 32 bits descarrega o bit de throughput de cada vez 4字节
, e a CPU do sistema de 64 bits descarrega o bit de throughput de cada vez 8字节
. Então o que são dados 总线
? 总线
é uma coleção de fios. Cada chip da CPU possui muitos 管脚
, e estes são 管脚
conectados ao barramento, e a CPU interage com dispositivos externos através do barramento. O ônibus é dividido em três categorias: 地址总线
, 数据总线
, 控制总线
. 地址总线
Existem várias linhas que determinam o ônibus, 宽度
e é 宽度
decidido 寻址的能力
. Durante a execução do programa, geralmente nos referimos a um arquivo de imagem de substantivo (image()). Na verdade, é uma representação de arquivos executáveis carregados do disco para a memória. 8086
A largura do barramento de endereço é 20
, portanto, a capacidade de endereçamento é 1M
. 8080
A largura do barramento de endereço é 16
, portanto, a capacidade de endereçamento é 64K
. Bem, vamos explorar a compilação desta edição primeiro, e continuaremos a estudá-la na próxima edição.