核心:消息机制,内存保护机制。
计算机语言:机器语言,汇编语言,高级语言。
汇编的优点:
- 直接访问与硬件相关的存储器或I/O端口。
- 对生成的二进制代码进行完全的控制。
- 避免因共同访问或硬件设备共享引起的死锁。
- 根据特定的代码进行优化,提高运行速度。
- 最大限度的发挥硬件的功能。
8086处理器:16条数据线,20条地址线,寻址范围2^20=1MB
通用寄存器:
- AX:累加器,存放操作数或者运算结果。
- BX:基址寄存器,存放操作数的偏移地址,或者数据。
- CX:计数寄存器,用于循环指令、移位指令的隐含计数控制。
- DX:源变址寄存器,与AX组合存放双字型寄存器,DX存高位。DX也用来存储I/O的端口地址。
- SI:源变址寄存器,源操作数的地址指针。
- DI:目的变址寄存器,目的操作数的地址指针。
- BP:堆栈基址寄存器,堆栈中操作数的偏移地址。
- SP:栈顶指针,栈顶的地址。
段寄存器:是一种专用寄存器,用于存储器寻址。
- CS:代码段,存放当前正在运行的程序代码。
- DS:数据段,当前程序所用的数据,源操作数。
- SS:堆栈段,存放子程序的入口地址。
- ES:数据段,辅助的数据存储区,目的操作数的存放位置。
字符三属性:
1)变量的段属性
变量的段属性(地址)是指定义变量所在段的段首址,当需要访问该变量时,该段首址一定要在某一段寄存器中。
2)变量的偏移属性
变量的偏移属性(地址)是指变量所在段的段首址到该变量定义语句的字节距离。
3)变量的类型
是指存取变量中的数据时所需要的字节数,也是存取变量数据的交换单位。它可以是字节类型、字类型、双字类型、四字类型、十字节类型。这些类型的选择由定义该变量时所使用的数据定义伪指令确定。
变量的定义:
变量一般在数据段或附加数据段中使用数据定义伪指令DB、DW、DD、DQ和DT来定义。定义变量的一般格式:
[变量名] 数据定义伪指令 表达式 [,…]
其中,用DB定义的变量为字节类型的变量;用DW定义的变量为字类型变量;用DD定义的是双字类型的变量;用DQ定义的是四字类型的变量;用DT定义的是十字节类型的变量。变量名由用户所取,定义变量时可以省略。表达式确定了变量的初值。
Count db 10
Buf dw 1,2,3,4,5
Char db ‘AB’
高级语言的变量定义:
Char c1,c2,c3;
Int a,b,c,d
Float x,y,z
数据传送指令:
数据传送指令负责在寄存器或内存单元之间进行数据、地址或立即数的传输。
主要包括:一般数据传送指令(MOV、XCHG)、堆栈操作指令(PUSH、POP)、标志寄存器传送指令(PUSHF、POPF、LAHF、SAHF)、地址传送指令(LEA、LDS、LES)、输入/输出指令(IN、OUT)。在这些指令中,除了SAHF、POPF两指令外,其它均不影响标志位。
这里主要介绍MOV、XCHG、LEA、LDS、LES指令的语句格式和功能。见课本例题。
算数运算指令:
算术运算指令是指对二进制数进行加、减、乘、除运算的指令。
主要包括:加法指令(ADD、ADC、INC),减法指令(DEC、NEG、SUB、SBB、CMP),乘法指令(IMUL、MUL),除法指令(IDIV、DIV)和符号扩展指令(CBW、CWD、CDQ)。
在这些指令中,除符号扩展指令之外,均会不同程度地影响标志寄存器中的标志位。
下面将主要讨论以上各指令的汇编语句格式及功能。见课本例题。
移位指令:
(1)算数逻辑移位指令
1)算术左移和逻辑左移指令
语句格式;SAL OPD,1 或 SHL OPD,1
SAL OPD,CL 或 SHL OPD,CL
2)算术右移指令
语句格式:SAR OPD,1或SAR OPD,CL
3)逻辑右移指令
语句格式:SHR OPD,1或SHR OPD,CL
1)循环左移指令
语句格式:ROL OPD,1或ROL OPD,CL
2)循环右移指令
语句格式:ROR OPD,1 或ROR OPD,CL
3)带进位的循环左移指令
语句格式:RCL OPD,1或RCL OPD,CL
4)带进位的循环右移指令
语句格式:RCR OPD,1或RCR OPD,CL
字符串操作指令共有五条,包括:
传送字节(或字)串的指令MOVS,
搜索字节(或字)串的指令SCAS,
比较字节(或字)串的指令CMPS,
取字节(或字)串的指令LODS,
存储字节(或字)串的指令STOS。
程序结构
NAME <模块名> ;可有可无
TITEL <正文> ;可有可无
STACK PARA STACK ‘STACK’
;此处输入堆栈段代码
STACK ENDS
DATA SEGMENT
;此处输入数据段代码
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START:MOV AX,DATA
MOV DS,AX
;此处输入代码段代码
MOV AH,4CH
INT 21H
SUB_NAME PROC <TYPE>
;此处输入子程序指令
RET
SUB_NAME ENDP.
CODE ENDS
END START
例子:
NAME E456.ASM
TITLE DISPLAY-STRING
DATA SEGMENT ;定义数据段
STRING DB ‘HOW DO YOU DO !’,13,10,‘$’ ;定义输出字符串,$为串结束符
DATA ENDS
STACK SEGMENT PARA STACK ;定义堆栈段
DW 20H DUP (0)
STACK ENDS
CODE SEGMENT ;定义代码段
ASSUME CS:CODE,DS:DATA,SS;STACK
START: MOV AX, DATA
MOV DS, AX ;置数据段基地址
CALL DISPLAY ;调子程序DISPLAY
MOV AH, 4CH
INT 21H ;并返回DOS
DISPLAY PROC
MOV DX, OFFSET STRING
MOV AH, 9 ;9号DOS功能调用,输出字符串
INT 21H
RET ; 返回子程序调用处
DISPLAY ENDP
CODE ENDS
END START ;主程序结束
软件环境:
为运行汇编语言程序,需要用到以下工具软件:
(1)编辑程序,如EDIT.COM;
(2)汇编程序,如MASM.EXE;
(3)连接程序,如LINK.EXE;
(4)调试程序,如DEBUG.EXE。
寻址方式:
通常,执行一条带有操作数的指令需要指明两个问题,一是进行什么操作?二是操作数在那里?我们将寻找数据和指令存放地址的方式称为寻扯方式。操作数在计算机运行过程中可能存储的物理位置有指令、CPU、存储器、接口等;不同的存储位置所采用的寻址方式不同。
有效地址的组成:
如果一个操作数存放在存储器中,那么有效地址可以由以下四部分组成。
1.位移量(displacement)是存放在指令中的一个8位、16位和32位的数,但它不是立即数,而是一个地址。
2.基址(base)是存放在基址寄存器中的内容。它是有效地址中的基址部分,通常用来指向数据段中数组或字符串的首地址。
3.变址(index)是存放在变址寄存器中的内容。它通常用来访问数组中的某个元素或字符串中的某个字符。
直接寻址:
例3.2 MOV AX,[2000H]
说明:源操作数采用直接寻址方式,指令码下一字单元的内容2000H为源操作数的EA,操作数存放在存储器中。
执行前:(DS)=3000H,
执行后:(AX)=5050H
例3.3 MOV AX,BUFA
说明:源操作数采用直接寻址方式,指令码下一字单元的内容为变量BUFA的EA,操作数存放在存储器变量BUFA所指向的存储单元中。指令功能是将字类型变量BUFA的内容送入AX之中。
执行前:假定BUFA在数据段中定义,EA=1000H,(DS)=2000H,(AX)=1122H,(21000)=1259H,
执行后:(AX)=1259H
综合例题1
编程实现把buf1存储空间的内容移动到buf2存储空间中去。
STACK SEGMENT STACK
DB 200 DUP(0)
STACK ENDS
DATA1 SEGMENT
BUF1 DB 20H,21H,22H,23H,24H,25H,26H,27H,28H,29H
DATA1 ENDS
DATA2 SEGMENT
BUF2 DB 10 DUP(0)
DATA2 ENDS
CODE SEGMENT
ASSUME
CS:CODE,DS:DATA1,ES:DATA2,SS:STACK
START: MOV AX, DATA1
MOV DS, AX
MOV AX, DATA2
MOV ES, AX
MOV SI,OFFSET BUF1 ;BUF1的EA→SI,确定SI指向
MOV DI,OFFSET BUF2 ;BUF2的EA→DI,确定DI指向
MOV CX, 10 ;10→CX
NEXT:MOVAL,DS:[SI ;([SI]])→AL
MOV ES:[DI],AL ;(AL) →[DI]
INC SI ;(SI)+1→SI,SI指针下移
INC DI ;(DI)+1→DI,DI指针下移
DEC CX ;(CX)-1→CX,循环次数减1
JNZ NEXT ;若(CX)≠0段内直接跳转NEXT指令处
结束用户程序,返回DOS状态
EXIT: MOV AH,4CH
INT 21H
CODE ENDS
END START
汇编语句:
种类:
汇编语言有3种语句类型,指令语句、伪指令语句、宏指令语句。指令语句是可执行语句,在汇编时可产生供机器执行的二进制目标代码。
例4.1 mov ax, 1000h
反汇编代码:0B10:0100 B80010 MOV AX,1000
伪指令语句是不可执行语句,在汇编时不产生目标代码,汇编程序主要利用它分配存储单元和定义程序段等。
例4.2 X dw 1000h
汇编程序在汇编时为变量X分配1个字存储单元,初值是1000h。
宏指令语句要求先定义后使用,它是一个宏名代替宏体的过程。
键盘输入任一按键,用十进制输出相应按键的ASCII值
CODE SEGMENT
ASSUME CS:CODE
START: MOV AH, 1
INT 21H ;读入一个按键
MOV AH, 0 ;AX保存按键的ASCII
MOV BL, 100
DIV BL ;ASCII除以100,取百位数字
MOV CL, AL ;CL存放百位数字
ADD CL, 30H ;CL存放百位数字的ASCII
MOV AL, AH
MOV AH, 0
MOV BL, 10
DIV BL ;ASCII除以10,取十位数字
ADD AL, 30H
ADD AH, 30H
MOV BX, AX ;AX存放十位数字和个位数字
MOV AH, 2
MOV DL, 13
INT 21H ;输出回车
MOV DL, 10
INT 21H ;输出换行
MOV DL, CL
INT 21H ;输出百位数字
MOV DL, BL
INT 21H ;输出十位数字
MOV BL, BH
INT 21H ;输出个位数字
MOV AH, 4CH
INT 21H
CODE ENDS
END START
计算Z=((W-X)/10*Y)的平方值
DATA SEGMENT
W DB -128
X DB 127
Y DB -100
R DB 0
Z DD 0
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
BEGIN: MOV AX,DATA
MOV DS,AX
MOV AL,X
CBW
MOV BX,AX
MOV AL,W
CBW
SUB AX,BX
MOV BL,10
IDIV BL
MOV R,AH
IMUL Y
IMUL AX
MOV WORD PTR Z,AX
MOV WORD PTR Z+2,DX
MOV AH,4CH
INT 21H
CODE ENDS
END BEGIN
以X为首地址的存储单元中存放20个无符号数,试从中找出最大值送入Y单元中
程序编写如下:
DATA SEGMENT
X DB 11,22,13,24,56,76,78,55,64,44
DB 56,64,63,45,43,32,47,89,99,69
Y DB ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATE
MAIN PROC FAR
START: PUSH DS
MOV AX,0
PUSH AX
MOV AX,DATA
MOV DS,AX
MOV AL,X
MOV BX,OFFSET X
MOV CX,19 ;置比较次数
L1: INC BX
CMP AL,[BX]
JAE L2
XCHG AL,[BX]
L2: LOOP L1
MOV Y,AL
RET
MAIN ENDP
CODE ENDS
END START
汇编语言高级编程
1、宏汇编
2、结构和记录
3、32位字长编程
4、汇编语言混合编程
汇编语言高级编程汇编语言高级编程