第四章 8086汇编语言程序设计,,汇编语言的语句类型,指令语句 由CPU执行,可产生机器代码,CPU根据这些代码才能执行相应的操作 伪指令语句 由编译器处理,为编译和连接提供控制信息,不产生机器代码 宏指令语句 以一个宏名定义的一段指令序列,在汇编中凡是出现宏指令语句的地方,都会有相应的指令语句序列的目标代码插入汇编语言格式,指令语句 标号: 指令助记符 操作数,操作数 ;注释 例如: mov cx,8 ;2操作数指令 s:nop ;0操作数指令(nop空操作) loop s ;1操作数指令 伪指令语句 名字 伪指令助记符 参数,参数 ;注释 例如: data1 db 0,1,2 ;数据定义伪指令DB,在内存中定义 ;3个连续的字节单元,初值是0,1,2 ;data1表示第一个数据0的偏移地址,,,,,,DATA SEGMENT ;定义数据段 DATA1 DW 1234H ;定义被加数 DATA2 DW 5678H ;定义加数 DATA ENDS ;数据段结束 ESEG SEGMENT ;定义附加段 SUM DW 2 DUP(?) ;定义存放结果区 ESEG ENDS ;附加段结束 CODE SEGMENT ;定义代码段 ASSUME CS:CODE,DS:DATA,ES:ESEG START: MOV AX,DATA ;START为程序的启动标号 MOV DS,AX ;初始化DS MOV AX,ESEG MOV ES,AX ;初始化ES LEA SI,SUM ;存放结果的偏移地址送SI MOV AX,DATA1 ;取被加数 ADD AX,DATA2 ;两数相加 MOV ES:SI,AX ;和送附加段的SUM单元中 MOV AH,4CH INT 21H CODE ENDS ;代码段结束 END START ;源程序结束,定义数据段,定义附加段,定义代码段,程序结束,汇编伪指令语句,1.段定义伪指令(segment与ends) 格式: 段名 segment 定位组合段字类别 . 段名 ends,,段的起始地址,PAGE PARA(默认) WORD BYTE,段间关系,NONE(默认) PUBLIC STACK,,多个类别 连续存放,STACK CODE DATA,,在程序中,段名就代表段地址 定位默认para,段起始地址低4位是0,所以默认 情况下数据段的偏移地址从0开始 初学者暂不考虑后面的参数,会定义段就可以了,汇编伪指令语句,2.指定段寄存器伪指令(assume) 格式: assume 段寄存器:段名,段寄存器:段名... 功能:设定段寄存器与段名之间的对应关系。
例如:code segment assume cs:code . code ends 本例中用assume cs:code将用作代码段的 段code和cpu中的段寄存器cs联系起来 书本p81,更正segment与ends成对出现,,段寄存器的装入,伪指令assume cs:code,ds:data,ss:stack只 是将cs、ds、ss和code、data、stack相连, 并没有给cs、ds、ss赋相应的段地址 CS的装入 源程序结束定义伪指令:END 标号 每个源程序都必须以END伪指令结束 例如:start: end start end后面的标号start说明了程序的入口,cpu的cs:ip将被设置指向这个入口段寄存器的装入,DS与ES的装入 用ASSUME将DS/ES与相应的段建立联系 用数据传送指令mov装入段地址 MOVAX,段名 MOVDS/ES,AX SS的装入(两种办法) 第种:在定义段时,用组合类型STACK说明 STACK1SEGMENT PARA STACK DW 20H DUP(0) STACK1ENDS CODESEGEMNT ASSUME CS:CODE,SS:STACK1 ,段寄存器的装入,第(2)种:SS的装入(类似于DS/ES的方法) STACK1 SEGMENT DW 40H DUP(0) TOPLABEL WORD STACK1 ENDS CODESEGEMNT ASSUME CS:CODE,SS:STACK1 MOV AX,STACK1 MOV SS,AX MOV SP,OFFSET TOP;SP=80H ,汇编伪指令语句,3.过程定义伪指令(proc和endp) 格式: 过程名 proc near/far . ret 过程名 endp 功能:定义过程(子程序)段供其他程序调用 near可以被同一代码段中的其他程序调用, far可以被不用代码段中的程序调用, 缺省为near 把具有独立功能的程序段定义为子程序, 便于程序的阅读和调试。
p82,例4.10,汇编伪指令语句,4.模块通信伪指令 (1)格式:public 符号, 功能:当一个符号允许被其他模块调用应该用 public声明 这里的符号可以是常量、变量、标号、过程名 (2)格式:extrn 符号:类型, 功能:指明符号是由其他模块用public定义 的,该符号在本模块中被引用 p83 例4.11,汇编伪指令语句,5.数据定义伪指令(定义变量) 格式:变量名 DB/DW/DD 初值表 功能:定义一个变量,并给它赋初值 例如:DATA SEGMENT A DB 0,?,3 B DW 100,1200H,-5 C DB A, XY D DW XY E DW 3,4466H,2DUP(1,0) DW 1123H,0015H F DW C DATA ENDS,,重复分配操作符,,重复次数,,重复数据列表,相当于1,0,1,0,汇编伪指令语句,6.符号定义伪指令 格式:符号名 EQU 表达式(常量.变量.标号.寄存器.内存单元) 符号名 = 表达式(数值) 功能:“=”作用等同于EQU。
“=”的表达式只能是数值表达式 用=,EQU定义的不占内存空间 例如:DATA SEGMENT A DB 0,?,3 B =1 C EQU B+1 D EQU SI+2 E EQU 25 DATA ENDS,汇编伪指令语句,7.地址计数器和ORG伪指令 (1)地址计数器($表示当前地址计数器的值) 例:DATA SEGMENT A DW 66 B DB 18 DUP(?) C EQU $-A DATA ENDS 定位默认para,A的偏移地址为0,$=0014H 所以,C=0014H-0000H=14H=20D 实际上,就是计算C到A内存单位的个数 如果换成 C EQU $-B 则 C=18D,汇编伪指令语句,(2) ORG伪指令(origin起始) 格式: ORG n 功能:设置当前地址计数器的值 例:DATA SEGMENT A DW 66 ORG 30H C DB 2,4,6 DATA ENDS 这个时候,C的偏移地址就不再是0002H, 而是0030H。
即从偏移地址0030H开始存放2,4,6,汇编伪指令语句,8.源程序结束伪指令END 格式:END 标号 功能:该语句标志整个程序的结束, 是源程序的最后一条语句汇编语言中的数据,在指令中,操作数可以是立即数(常数)、寄存器、存储单元,标号,变量,数值表达式、地址表达式 例:mov ax,0010h mov bx,ax mov ax,2012h jmp near ptr s add ax,bx s:mov bx,ax,汇编语言中的数据,1常量 数值常量、字符串常量、符号常量 2变量 例:用数据定义伪指令DB、DW、DD定义变量 DATA SEGMENT DA1 DB 12H ;定义一个字节数据 DA2 DD 0FEDCBA90H ;定义一个双字数据 DA3 DW 5678H ;定义一个字数据 DATA ENDS 3标号 标号是一条指令的符号地址在无条件转移指令、条件转移指令、循环指令和子程序调用指令的操作数位置上,通常用标号作为程序转移指令的目标地址汇编语言中的数据,4数值表达式 数值表达式可以出现在指令和伪指令语句中,数值表达 式由编译器负责计算。
Cpu执行指令的时候已经是一个 数值了 例1: 逻辑运算符的应用 MOV AL,NOT 10101010B ;(AL)01010101B MOV AL,11110000B AND 10111101B;(AL)10110000B MOV AL,10100000B OR 00000101B ;(AL)10100101B 例2: 关系运算符的应用 MOV AX,5 EQ 101B ;(AX)0FFFFH MOV BH,10H GT 16 ;(BH)0 例3: 算术运算符的应用 MOV AX,5*(7-3) ;(AX)20 MOV BH,1 SHL 3 ;(BH)8,,算术运算符:+,-,*,/,mod,shl,shr 逻辑运算符:and,or,xor,not 关系运算符:eq(等于),ne,gt,lt,ge,le 若关系成立,即结果为真,返回0ffffh 若关系不成立,即结果为假,返回0000h 运算符的优先顺序 p74,汇编语言中的数据,5特殊运算符 强制类型运算符PTR 例:PTR运算符的应用 N1 DB 3,6,9 MOV AX,WORD PTR N1 ;临时指定N1为 ;字类型,(AX)0603H 定义类型运算符THIS 例:THIS运算符的应用 ABC EQU THIS BYTE ;从本语句开始变量ABC的类型属性指定为字节,不管它原来的类型是什么,汇编语言中的数据,5特殊运算符 短取代运算符SHORT 例:SHORT运算符的应用 JMP SHORT S 段转移范围-128+127 数值返回操作符 OFFSET 变量或标号 ;返回偏移地址 SEG 变量或标号 ;返回段地址 TYPE 变量或标号 ;返回类型(db=1,dw=2,dd=4) LENGTH 变量 ;长度(仅对DUP语句有效,其他=1) SIZE 变量 ;LENGTH*TYPE,汇编语言中的数据,数值返回操作符 例4.3:BUF的段地址是0500H,偏移地址为0015H, BUF为字类型变量。
BUF DW 1111H,2255H,3333H BUF1 DB 9DUP(1) 求下列指令执行后寄存器的值? MOV SI,OFFSET BUF ;SI=0015H MOV BX,SEG BUF ;BX=0500H MOV DI,TYPE BUF ;DI=2 MOV CX,LENGTH BUF1 ;CX=9 MOV DX,SIZE BUF1 ;DX=9,,标识符由字母、数字、专用符号? - $ 约定: 最长31个字符 第一个字符不能是数字 ? - $可出现在标号的任意位置,但? $ 不能单独使用 . 不能出现在起始位置 一个程序中,每个标识符的定义是唯一的,且不能与任何保留字相同,,错误的命名 Mov ;指令保留字MOV、ADD Db ;伪指。