最原始机器码是二进制指令,但是这种指令对人不友好,于是就出现了汇编语言,便于人来编写代码。但是机器只认识二进制指令,这是就需要汇编器来完成转译。
汇编语言主要三类组成
- 汇编指令:它是一种机器码的助记符,与机器指令一一对应
- 伪指令:没有对应的机器码,由编译器执行,计算机并不执行
- 其他符号,比如 +、-、*、/ 等,由编译器识别,没有对应的机器码
#include <unistd.h>
char msg[14] = "Hello, world!\n";
#define len 14
int main(void)
{
write(1, msg, len);
_exit(0);
}
编译后的汇编
; 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的数据,都会进入相应功能的寄存器内,供指令操作。
问题:
地址总线和数据总线不能合并成一个总线吗?
比入增多一个信息来区分是地址还是数据实现共用一个总线,难道仅仅为了高效,还是有别的说法?