1.标号:标号是由指令语句中所定义的标识符,它与助记符之间用冒号间隔,用于指示相应指令的地址。
2.与高级语言一样,汇编语言中也可以使用变量。变量必须首先进行定义,然后才能使用。变量是由伪指令来定义的。
DB 定义字节变量,即8位(1字节)变量
DW 定义字变量,即16位(2字节)变量
DD 定义双字变量,即32位(4字节)变量
DQ 定义长字变量,即64位(8字节)变量
DT 定义一个10字节的变量
例如:
各个数据定义伪指令均可以连续定义变量。
示例如下:
DATAS SEGMENT ;定义数据段
BUF0 DB 1 ;定义一个字节型变量,名称是BUF0,初始值是01H
BUF1 DB "2" ;定义一个字符型变量,名称是BUF1,初始值是"2"
BUF2 DW 1 ;定义一个字型变量,名称是BUF2,初始值是0001H
BUF3 DD 2 ;定义一个双字型变量,名称是BUF3,初始值是00000002H
BUF4 DB 1 DUP(50) ;定义连续50个字节型变量,名称是BUF4,初始值是01H
BUF5 DB "12345678" ;定义一个字符型变量,名称是BUF5,初始值是"12345678"
DATAS ENDS ;数据段定义结束
微处理器主要包含两个独立的逻辑单元:执行单元EU(executeion unit)和总线接口单元BIU(bus interface unit)。ALU的数据总线(16位)。数据总线的位数就是计算机的位数。
8086CPU内部有14个16位的寄存器,按功能可以分为8个通用寄存器、4个段寄存器和2个控制寄存器。寄存器是汇编语言中指令可以使用的操作数,具有至关重要的地位,我们应该切实掌握。
通用寄存器又称数据寄存器,既可作为16位数据寄存器使用,也可作为两个8位数据寄存器使用。当用作16位时,称为AX、BX、CX、DX。当用作8位时,AH、BH、CH、DH存放高字节,AL、BL、CL、DL存放低字节,并且可独立寻址。这样,4个16位寄存器就可当作8个8位寄存器来使用。
指针和变址寄存器:
堆栈指针SP用以指出在堆栈段中当前栈顶的地址。入栈(PUSH)和出栈(POP)指令由SP给出栈顶的偏移地址。
基址指针BP指出要处理的数据在堆栈段中的基地址,故称为基址指针寄存器。
变址寄存器SI和DI用来存放当前数据段中某个单元的偏移量。
段寄存器共有4个CS、DS、SS、ES。
代码段寄存器CS表示当前使用的指令代码可以从该段寄存器指定的存储器段中取得,相应的偏移值则由IP提供;
堆栈段寄存器SS指定当前堆栈的起始地址;
数据段寄存器DS指示当前程序使用的数据所存放段的起始地址;
附加段寄存器ES则指出当前程序使用附加段地址的起始位置,该段一般用来存放原始数据或运算结果。
指令指针与标志寄存器:
指令指针IP的功能跟程序计数器PC的功能类似。正常运行时,IP中存放的是BIU要取的下一条指令的偏移地址。它具有自动加1功能,每当执行一次取指令操作时,它将自动加1,使它指向要取的下一内存单元,每取一个字节后IP内容加1,而取一个字后IP内容则加2。某些指令可使IP值改变,某些指令还可使IP值压入堆栈或从堆栈中弹出。
标志寄存器PSW是16位的寄存器,8086共使用了9个有效位,标志寄存器格式如图2.5所示。其中的6位是状态标志位,3位为控制标志位。状态标志位是当一些指令执行后,表征所产生数据的一些特征。而控制标志位则可以由程序写入,以达到控制处理机状态或程序执行方式的表征。
/*******************************2018.04.24 23:04******************************/
汇编指令: mov、lea、push、pop、ret、call、jmp、jn。
mov为通用传送类指令。
lea指令:取地址操作。
eax、ebx、ecx、edx、eip、esp、edp。
ebp寄存器:控制栈帧,它指向栈帧的栈底。
esp寄存器:指向栈帧的顶端。
esi寄存器:地址寄存器(也叫程序计数器),esi中存即将执行的6条连续指令的地址。
参考书目《深入理解计算机系统》第五章。
《Linux内核设计原理》
格式:MOV DST,SRC ; // (DST)<===(SRC)将源操作数传送到目的操作数中。
说明:将SRC(源操作数)中的一个字节或一个字传送到DST(目标操作数)所指定的位置。MOV指令可以在立即数、存储单元、寄存器和段寄存器之间传送数据。
push和pop为堆栈操作指令。
(1)压入堆栈指令(PUSH)
格式:PUSH SRC ;将SRC压入堆栈,即(SP)《===(SP)_2,(SP)《===(SRC)
PUSHF ;将PSW压入堆栈,即(SP)《===(SP)_2,(SP)《===(PSW
说明:压入堆栈指令PUSH(push word onto stack)将先修正堆栈指针SP的内容,然后再将SRC或PSW的内容送入堆栈。SRC必须是字型。sp指针指向栈顶元素。
(2)弹出堆栈指令(POP)。
格式:POP DST ;从堆栈弹出DST,即(DST)《===(SP),(SP)《===(SP)+2
说明;弹出堆栈指令POP(pop word off stack)可以堆栈的内容送人DST所指定的寄存器、存储单元或PSW,然后修正SP的内容。
jmp为无条件转移指令
格式:JMP LABEL ; 转移到标号LABEL处执行执行程序
JMP REG16 ;转移到由通用寄存器REG指定的位置执行程序
JMP MEM ;转移到由存储单元MEM指定的位置执行程序
说明:在jmp label中,label为标号,当label与该转移指令位于同一个段内时,则为段内转移,转移目的地址(CS)不变,(IP)《===(IP)+DISP16.其中DISP16表示转移目标地址与JMP转移指令的16位偏移量。
call子程序调用指令。
ret为子程序返回指令。