1、第 4 章4.14.24.34.44.5微机原理与接口技术 汇编语言是利用指令的助记符、符号地址、标号来编写的语言。汇编语言编写的程序称为源程序汇编语言编写的程序称为源程序。与机器 语言相比,汇编程序较直观,但不被计 算机所识别和运行,必须将汇编程序变成 机器代码程序(即目标程序),才能运行。汇编程序是分段的,一般有DATA段,CODE段,STACK段。其格式为:段名 SEGMENT .段名 ENDS 源程序最后以END作结束;DATA SEGMENT DATA SEGMENT ;数据段开始数据段开始 DA1 DB DA1 DB This is a sample program.This is
2、 a sample program.DATA DATA ENDS ENDS ;数据段结束;数据段结束STACK STACK SEGMENT SEGMENT ;堆栈段开始;堆栈段开始 ST1 DB 100 DUP(?)ST1 DB 100 DUP(?)STACK STACK ENDS ENDS ;堆栈段结束;堆栈段结束CODE SEGMENT CODE SEGMENT ;代码;代码段开始段开始 MAIN PROC FAR MAIN PROC FAR ASSUME CS ASSUME CS:CODECODE,DSDS:DATADATA,SSSS:STACKSTACK START START:MOV
3、 AX MOV AX,STACKSTACK MOV SSMOV SS,AXAX PUSH DS PUSH DS MOV AX MOV AX,0 0 PUSH AX PUSH AX MOV AX MOV AX,DATA DATA;送数据段地址;送数据段地址 MOV DS MOV DS,AXAX .RET RET MAIN ENDP MAIN ENDPCODE CODE ENDS ENDS ;代码段结束;代码段结束 END START END START END END ;程序结束;程序结束4.1 汇编语言源程序格式1.符号定义伪指令EQU TIMES EQU EQU 50 ;TIMES的值为50
4、2.数据定义伪指令DB/DW/DUP DT1 DB DB 50H,52H ;DT1开始分配字节单元,顺序存放50H,52H DT2 D DW W 2053H,54H ;DT2开始分配字单元,DT3 DBDB 3 DUPDUP(67H);67H字节属性重复3次3.过程定义伪指令 过程名 PROC PROC 类型(NEAR/FAR)过程体 RET 过程名 ENDPENDP 4.定位伪指令 ORG 2000HORG 2000H DT4 DB DT4 DB ABCDABCD4.2 常用伪指令DT1DT150H50H52HDT253H20H54H00HDT367H67H67H.2000H41H42H43
5、H44H1 1.算术运算算术运算符符 +、*、/、MOD(取余)、SHL(左移)、SHR(右移)例:MOV BL,12 MOD 5 ;结果为BL中为2 2 2.逻辑运算逻辑运算符符(按位操作)MOV AL,24H AND 0FH ;结果为AL中为04H 3.3.关系运算符关系运算符 逻辑判定,逻辑判定,关系关系为真时结果为全为真时结果为全1 1,为假时结果为全为假时结果为全0 0。EQ EQ(=)、NENE()、LT LT()、GE GE()例:例:若PP=20,则 MOV AL,20 EQ PP ;结果AL为0FFH MOV BX,20 LE PP ;结果BX为0FFFFH MOV CH,1
6、9 GE PP ;结果为CH为00H。4.4 运算符 4、取值运算符、取值运算符 SEG 符号名;求段地址 OFFSET 符号名;求偏移地址)例:MOV BX,OFFSET TABLE5.运算符:最后一个字符所在单元的下一个字节的地址的偏移量6.6.属性运算符属性运算符 PTRPTR MOV BYTE PTR 2000H,10H MOV WORD PTR 2002H,20H 4.5 程序设计方法程序设计步骤程序设计步骤 1.分析问题 2 2.画流程图画流程图,一般包括起始框、执行框、判断框、终止框 4.内存空间分配 5.编写程序 6.静态检查 7.上机调试,分析结果4.5.4.5.1 1 顺序
7、顺序结结构构 例4-2 编程计算z=(x2-3y)/2。x,y为单字节正整数,结果z用2个字节来存放。DATA SEGMENTDATA SEGMENTX DB 25X DB 25Y DB 32Y DB 32Z DW?Z DW?DATA ENDSDATA ENDS C CODE SEGMENTODE SEGMENT ASSUME CS ASSUME CS:CODE,DS:DATAEXPRE PROC FAREXPRE PROC FARSTARTSTART:PUSH DS SUB AXSUB AX,AX PUSH AXPUSH AX MOV AXMOV AX,DATA MOV DSMOV DS,A
8、XMOV AL,XMUL AL ;AX=X2 MOV BL,YADD BL,BLADD BL,Y ;BL=3Y MOV BH,0 SUB AX,BX ;AX=X2-3Y SHR AX,1 ;除2 MOV Z,AX ;存结果 RET EXPRE ENDP CODE CODE ENDSENDS END START;汇编结束 END开始计算X*X 计算3*Y 计算(X2-3Y)/2返回 计算(X2-3Y)/2Z 1.1.两路分支两路分支 例4-4 以SOURCE为首地址,连续存放两个无符号字节数,找出其中大数存入下一个单元。DATA DATA SEGMENTSEGMENT SOURCE DB X1,
9、X2,?DATA ENDSDATA ENDS CODE SEGMENTCODE SEGMENT ASSUME CS:CODE,DS:DATA .LEA BXLEA BX,SOURCE SOURCE MOV ALMOV AL,BX BX INC BX INC BX sourcesourcex1x1soure+1soure+1x2x2soure+2soure+2?4.5.4.5.2 2 分支结构分支结构 CMP ALCMP AL,BX BX;比较两数;比较两数 JAE BIG JAE BIG XCHG AL XCHG AL,BX BX BIGBIG:INC BX INC BX MOV BX MOV
10、 BX,AL AL RET CODE ENDSCODE ENDS END2.2.三路分支三路分支 例4-5 1 (X0)Y=0 (X=0)-1 (X0)X取值范围:-128+127。开 始A A L L X X 返 回 NA L 0?Y(B IG E R)NA L=0?Y(E Q U L)A L -1A L 1A L 0N E X TY A LDATA SEGMENT X DB -3 Y DB?DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA ;MOV AL,X CMP AL,0 JGE BIGER MOV AL,-1 ;X0,Y送1 JMP NEXT
11、EQUL:MOV AL,0NEXT:MOV Y,AL ;X=0,Y送0 RET CODE ENDS END START END4.5.4.5.2 2 分支结构分支结构3.3.多路分支多路分支 例4-6 系统中有8个按键,检测键盘输入命令,使系统分别转向8个加工子程序。MOV AH,1 INT 21H ;1号功能调用,键盘接收 CMP CMP ALAL,1 1 ;键值跟1比较 JE P1 JE P1 ;转1号加子程序 CMP CMP ALAL,2 2 ;键值跟2比较 JE JE P2 P2 ;转2号加工子程序 .JMP ST;键值非18,转向停止 P1:;1号加工子程序 P2:.;2号加工子程序
12、 .P8:;8号加工子程序 ST:HLT 开 始键键 盘盘 接接 收收 测 试 键 值 是 1号 键1号加工子程序8号加工子程序3号加工子程序是 2号 键是 3号 键是 8号 键2号加工子程序4.5.4.5.2 2 分支结构分支结构 1.1.循环程序结构形式循环程序结构形式 两种结构形式:先执行,后判断。循环次数固定 先判断,后执行。循环次数不固定4.5.4.5.3 3 循环结构循环结构例例4-84-8 先执行后判断结构(次数固定)先执行后判断结构(次数固定)编程对10个数求和:SUM=a1+a2+a10 DATA DATA SEGMENTSEGMENT BUF DW a1,a2,a10;SU
13、M DW?;存放和数 DATA ENDSDATA ENDS CODE CODE SEGMENTSEGMENT .MOV AX,0 ;AX为和,初始为0 LEA BX,BUF ;首地址送BX MOV CX,10 ;循环次数送CX LOOPLOOP1 1:ADD AXADD AX,BX BX ;累加;累加 (循环体)INC BX INC BX ;修改数据缓冲区地址;修改数据缓冲区地址 INC BXINC BX DEC CX DEC CX ;次数减;次数减1 1 JNZ LOOP1 JNZ LOOP1 ;不到10次,转LOOP1 MOV SUM,AX;到10次,存放结果 RET CODE CODE
14、ENDSENDS END START END4.5.4.5.3 3 循环结构循环结构 DATA SEGMENTDATA SEGMENT BUF DW X1,X2,X3,Xn ;COUNT EQU-BUF ;PLUS DB?;0个数 ZERO DB?;=0个数 MINUS DB?;0个数 DATA ENDS DATA ENDS CODE SEGMENT CODE SEGMENT ASSUME CS:CODE,DS:DATA,BEGIN:MOV AX,DATA MOV DS,AX MOV CX,COUNT SHR CX,1 ;CX除2=BUF中16位数据的个数 MOV DX,0 ;DH及DL都为0
15、 MOV AH,0 ;0 的个数 LEA BX,BUF例4-9 在BUF为首地址的内存缓冲区存放一串16位二进制数,统计其中大于零、等于零和小于零的个数。并分别存入PLUS、ZERO、MINUS单元。4.5.4.5.3 3 循环结构循环结构 AGAIN:CMP WORD PTR BX,0 JGE PLU INC AH JMP NEXT PLU:JZ ZER INC DL JMP NEXT ZER:INC DH NEXT:INC BX INC BX LOOP AGAIN MOV PLUS,DL ;MOV ZERO,DH MOV MINUS,AH RET CODE ENDS CODE ENDS E
16、ND BEGIN END4.5.4.5.3 3 循环结构循环结构例例4-10 4-10 先判断后执行的结构(次数不固定)先判断后执行的结构(次数不固定)AX寄存器中有一个16位二进制数,编程统计其中1的个数,结果放在COUNT存储单元 MOV CL,0 ;L1L1:CMP AX CMP AX,0 0 ;JZ STOP JZ STOP ;若AX为0,则退出 SAL AX,1 ;JC L2 ;JMP L1 ;L2:INC CL ;JMP L1 ;STOP:MOV COUNT,CL RET 思考:本题若是统计思考:本题若是统计0的的个数,如何编程个数,如何编程?提示:取反4.5.4.5.3 3 循环结构循环结构 1.汇编语言的格式 2.伪指令 3.运算符 4.汇编程序设计:流程图、顺序结构、分支结构、循环结构(难点)循环结构(难点)本章重点本章重点 4-34-3、4-94-9作业作业