最原始机器码是二进制指令,但是这种指令对人不友好,于是就出现了汇编语言,便于人来编写代码。但是机器只认识二进制指令,这是就需要汇编器来完成转译。

    汇编语言主要三类组成

    • 汇编指令:它是一种机器码的助记符,与机器指令一一对应
    • 伪指令:没有对应的机器码,由编译器执行,计算机并不执行
    • 其他符号,比如 +、-、*、/ 等,由编译器识别,没有对应的机器码
    1. #include <unistd.h>
    2. char msg[14] = "Hello, world!\n";
    3. #define len 14
    4. int main(void)
    5. {
    6. write(1, msg, len);
    7. _exit(0);
    8. }

    编译后的汇编

    ; hello.asm 
    section .data            ; 数据段声明
            msg db "Hello, world!", 0xA     ; 要输出的字符串
            len equ $ - msg                 ; 字串长度
    section .text            ; 代码段声明
    global _start            ; 指定入口函数
    _start:                  ; 在屏幕上显示一个字符串
            mov edx, len     ; 参数三:字符串长度
            mov ecx, msg     ; 参数二:要显示的字符串
            mov ebx, 1       ; 参数一:文件描述符(stdout) 
            mov eax, 4       ; 系统调用号(sys_write) 
            int 0x80         ; 调用内核功能
                             ; 退出程序
            mov ebx, 0       ; 参数一:退出代码
            mov eax, 1       ; 系统调用号(sys_exit) 
            int 0x80         ; 调用内核功能
    

    千万注意:以下都是自己臆测的

    术语说明
    指令: 指挥CPU干活的命令。比如:加法;加法;跳转;
    数据:表示某个值。比如变量;
    信息:包括指令或数据;

    CPU有三条总线:
    控制总线:负责向外部各个部件发送控制信号。
    数据总线是CPU与存储器、CPU与I/O接口设备之间传送数据信息(各种指令数据信息)的总线,这些信号通过数据总线往返于CPU与存储器、CPU与I/O接口设备之间,因此,数据总线上的信息是双向传输的。

    地址总线:负责发送地址,所谓的寻址,定位信息的位置。
    地址总线上传送的是CPU向存储器、I/O接口设备发出的地址信息,地址总线上传送的地址信息仅由CPU发出,因此,地址总线上的信息是单向传输的,CPU是通过地址总线来指定存储单元的,它决定了CPU访问内存的寻址能力和范围大小

    数据总线:负责读取/发送数据或者读取指令
    控制总线传送的是各种控制信号,实现对外部器件进行控制,由CPU至存储器、I/O接口设备的控制信号,有I/O接口送向CPU的应答信号、请求信号,因此,控制总线是上的信息是双向传输的。控制信号包括时序信号、状态信号和命令信号(如读写信号、忙信号、中断信号)等。

    所有的信息都是由数据总线输入/输出CPU,信息中有指令有数据,而且都是二进制,那么CPU怎么区分这呢?
    从语法格式上,汇编语言的基本格式是:指令:操作数

    通过数据总线进入到CPU的指令,CPU就会调度相对应功能的电路去干活。
    通过数据总线进入到CPU的数据,都会进入相应功能的寄存器内,供指令操作。

    问题:
    地址总线和数据总线不能合并成一个总线吗?
    比入增多一个信息来区分是地址还是数据实现共用一个总线,难道仅仅为了高效,还是有别的说法?