C文件到可执行文件的四个步骤
1.预编译
先与编译器对源代码进行处理,对其中的伪指令(#开头的指令)和特殊符号进行处理
2.编译
确认所有的指令都符合语法规则,将其翻译成汇编代码
优化处理是编译系统中一项比较艰深的技术
3.汇编
把汇编语言翻译成目标机器指令,每一个C语言源程序,都会经过这一处理得到相应的目标文件
目标文件组成:代码段、数据段
4.链接
上一步生成的目标文件并不能立即被执行,不同的目标文件还存在函数调用的问题
链接就是将有关的目标文件彼此相连接,又分静态链接、动态链接
5.一些常见的汇编指令
a. MOV: 数据传送指令,用于将一个值从一个位置移动到另一个位置。
MOV DEST, SRC
b.ADD: 加法指令,用于将两个操作数相加并将结果存储在目标位置。
ADD DEST, SRC
c.SUB:减法指令,用于从目标操作数中减去源操作数并将结果存储在目标位置。
SUB DEST, SRC
d.MUL:乘法指令,用于将目标操作数与源操作数相乘并将结果存储在目标位置。
MUL SRC
e.DIV:除法指令,用于将目标操作数除以源操作数并将结果存储在目标位置。
DIV SRC
f.JMP:无条件跳转指令,用于将程序的执行流程跳转到指定的地址。
JMP LABEL
6.指令格式
操作码 [操作数A],[操作数B]
操作码:执行何种操作;
操作数A:目标操作数;
操作数B:源操作数;
7.寻址方式
a.立即寻址
操作数直接包含在指令中,作为指令的一部分。这种操作数称为立即数,可以是16位或8位。例如,MOV AX, 1234H
中,1234H
就是立即数。
b.寄存器寻址
操作数存储在CPU内部的寄存器中。指令中直接指定寄存器号。例如,MOV AX, BX
中,操作数在BX寄存器中。寄存器寻址速度通常很快,因为不需要访问内存。
c.直接寻址
操作数存储在内存中,指令直接包含操作数的有效地址。地址通常由段寄存器(如DS)和指令中给出的偏移量组合而成。例如,MOV AL, [1234H]
中,操作数的地址是 DS:1234H
。
d.寄存器间接寻址
操作数的有效地址存储在寄存器中,而不是直接在指令中。例如,MOV AX, [BX]
中,操作数的地址在BX寄存器中。
e.寄存器相对寻址
操作数的地址由一个指定的寄存器内容加上指令中给出的位移量计算得出。这种寻址方式常用于数组或循环操作。
f.基址寻址/变址寻址
操作数的地址由一个基址寄存器或变址寄存器的内容加上一个偏移量计算得出。例如,MOV AX, [BX+10H]
中,操作数的地址是 BX + 10H
。
g.基址变址寻址
操作数的地址由基址寄存器和变址寄存器的内容以及可能的位移量共同计算得出。例如,MOV AX, [BX][SI]
中,操作数的地址是 BX + SI
。