目录
1. 汇编
汇编语言源程序转换为机器码(存在CS段)这个过程,称之为汇编
实验过程:
首先有一个源文件.asm,可以在txt文件里输入汇编程序,然后将文件后缀名改为.asm
后使用MASM.exe或TASM.exe进行汇编,若语法没问题,会生成.obj文件
再使用LINK.exe文件对.obj文件进行连接,这个过程会为.obj文件分配内存,并生成.exe文件。
2. 寻址方式
寻址方式(Addressing Mode): find the address of location of data or instruction.
上图中红色的是寄存器,绿色是存储器,1234H是立即数。
有三种操作数:存储器、寄存器、立即数
SP、BP寄存器中一般放偏移地址
在寻址时,不考虑段超越的一般情况下:
SI、DI、BX、AX对应DS段,SP、BP对应SS段,当出现例如[BP+SI]的情况,对应SS段
3. 指令系统
3.1 数据传输指令
1)MOV指令
MOV dest, src ;(dest)<-(src)
2)堆栈操作指令
堆栈:内存中开辟的特定区域,用以存放CPU寄存器或存储器中暂时不用的数据。堆栈所在的内存的段称为堆栈段,其段地址放在SS中。先进后出,后进先出。
堆栈指针SP:指向当前栈顶的偏移地址。
PUSH src ;(SP)<-(SP)-2 ((SP)+1:(SP))<-(src)
POP dest ;(dest)<-((SP)+1:(SP)) (SP)<-(SP)+2
3)交换指令
XCHG dest, src ;(dest)<-->(src)
4)查表指令
XLAT src_table ;(AL)<-((BX)+(AL))
执行指令前:序号->AL,表首址->BX
执行指令后: AL<-表中序号对应的字节内容
5)输入输出指令
完成累加器和I/O端口之间的数据传送,立即数都是地址
IN acc, port ;(acc)<-(port)
OUT port, acc ;(port)<-(acc)
端口号为8位时,直接寻址,端口地址为16位时,间接寻址,端口地址必须先放在DX寄存器中
6)目标地址传送指令
讲内存单元的有效地址(而不是内容)传送到目标寄存器
LEA SI, AREA1
MOV SI,OFFSET AREA1 ;两句指令相同
*7)标志传送指令
LAHF、SAHF、PUSHF、POPF
3.2 算数运算指令
ADD dest,src ;(dest)< (dest)+(src)+(CF)
ADC dest,src ;(dest)< (dest)+(src)+(CF)
INC dest ;(dest)< (dest)+1
SUB dest,src ;(dest)< (dest)-(src)
SBB dest,src ;(dest)< (dest)-(src)-(CF)
DEC dest ;(dest)<(dest)-1
NEG dest ;(dest)< 0-(dest) 求补指令,操作数可能是存储器或寄存器。
CMP dest,src ; (dest)-(src)
MUL src ;字节乘法(AX) <(src)*(AL) 字乘法(DX: AX) < (src)*(AX) 无符号数乘法指令
IMUL src ;字节乘法(AX) <(src)*(AL) 字乘法(DX: AX) < (src)*(AX) 带符号数乘法指令
DIV src ;无符号数除法指令
IDIV src ;带符号数除法指令
3.3 逻辑运算和移位指令
1)逻辑运算指令
AND dest, src ;(dest)<- (dest)&(src)
OR dest, src ;(dest)<- (dest)^(src)
XOR dest, src ;(dest)<- (dest)异或(src)
NOT dest ;字节求反(dest)<- FFH-(dest) 字求反(dest)<- FFFFH-(dest)
TEST dest, src ;(dest)&(src),结果不送回
2)移位指令
SHL dest, 1
SHL dest, CL
移位指令:SHL、SAL、SHR、SAR H:无符号数,A:带符号数
循环移位指令:RCL、ROL、RCR、ROR
3.4 串操作指令
总是SI放源操作数的偏移地址,而DI放目的操作数的偏移地址。
源操作数隐含的段寄存器是DS,但允许段超越;目标操作数隐含的段寄存器是ES,不允许段超越
每一次操作后自动修改地址指针。
有的串操作指令可以加重复前缀:REP、REPZ ( REPE )、REPNZ ( REPNE )
串操纵汇编指令的格式可以加上操作数,或直接加上字母B (字节操作)或W (字操作)
MOVS串传送指令 ;将源串(DS:SI)->目的串(ES:DI),SI和DI自动加1或减1。
CMPS串比较指令 ;将源串(DS:SI) 和目的串(ES:DI) 比较,不影响内容,SI和DI自动加1或减1。
SCAS串扫描指令 ;将关键字->AL(AX),和目的串(ES:DI)的内容比较,SI不变,DI自动加1或减1。
LODS串装入指令 ;将源串(DS:SI)->AL(AX),SI 自动加1或减1,DI不变。
STOS串送存指令 ;将AL(AX)->目的串(ES:DI),SI不变,DI自动加1或减1。
串操作方向由CLD和STD指令设置:
CLD,地址递增方向(DF=0) STD,地址递减方向(DF=1)
REPZ表示相等重复,即(CX)≠0且(ZF) = 1继续比较
REPNZ表示不等重复,即(CX)≠0且(ZF) = 0继续比较
3.5 控制转移指令
1)转移指令
无条件转移
JMP NEXT
条件转移
JZ、JNZ、JC、JNC、JO、JNO、JS、JNS、JP、JNP
2)循环控制指令
LOOP short lable ;short lable 相等或等于0循环,如果不为0,则循环到短标号处
3)过程调用指令
CALL delay
RET
4)中断指令
INT n ;n为中断类型号,取值在0~255之间
IRET ;中断返回指令,自动将推入堆栈的段地址和偏移地址弹出,同时恢复标志寄存器的内容。
3.6 处理器控制指令
标志位操作(CLC、STC、 CMC、CLD、STD、CLI、STI)
空操作指令NOP
*处理器暂停指令HLT
*处理器等待指令WAIT
*处理器脱离指令ESC
*总线锁定指令LOCK
4. 伪操作指令
指令性语句:可以产生相应的机器码 eg.LOOPER: MOV AL,DATA[SI]
指示性语句(伪操作指令):不产生机器码。 eg.DATA1 DB 0F8H,60H,0ACH,74H
格式:[名字] 操作码/伪操作[操作数]; [注释]
指令助记符: MOV, ADD,...
指示性(伪指令)操作符: DB, DW,SEGMENT,ENDS,ASSUME,END,
保留字: SEGMENT ENDS OFFSET SIZE DB DW DD MOV PUSH ADD SUB MUL DIV INC DEC I OOP PROC ENDP CALL RET END
5. DOS系统功能调用
DOS ( Disk Operation System)和BIOS(Basic Input andOutput System)是为用户提供的两组系统服务程序。
BIOS是IBM PC/XT的基本I/O系统,负责管理系统的测试程序、初始化引导程序、一-部分中断矢量装入程序及外部设备的服务程序,用户可以直接调用。
DOS是IBM PC/XT的操作系统,负责管理系统的所有资源,协调微机的操作,其中包括大量的可供调用的服务子程序,完成设备的管理和磁盘文件的管理。
用户控制PC机硬件的方法:
高级语言->调用DOS程序->使用BIOS程序->直接访问硬件
DOS系统功能调用(INT 21H)
调用方法:
1、子程序规定的入口参数送指定的寄存器。
2、系统功能调用号送AH
3、INT 21H
举例:02H功能是显示字符。4CH功能返回DOS。0AH功能从键盘输一个字符入内存。
MOV AH,OAH
INT 21H
6. 汇编语言源程序格式
DATA SEGMENT
DATA1 DB 0F8H, 60H, 0ACH, 74H, 3BH
DATA2 DB 0C1H, 36H, 9EH, 0D5H, 20H
DATA3 DB 5 DUP (?)
DATA ENDS
CODE SEGMENT
ASSUME DS: DATA, CS: CODE
START: MOV AX, DATA
MOV DS, AX
XOR SI, SI
MOV CX, 5
NEXT: MOV AL, DATA1[SI]
SBB AL, DATA2[SI]
MOV DATA3[SI], AL
INC SI
LOOP NEXT
MOV AH, 4CH
INT 21H
CODE ENDS
END START