第 4 章 汇编语言程序设计 ( 三)
description
Transcript of 第 4 章 汇编语言程序设计 ( 三)
微机系统与接口技术 东南大学 1
第 4章 汇编语言程序设计(三)
Assembly Language Programming(3)
• 格式 #
• 伪指令 #
• ╳ DOS/BIOS 调用 ( 简单了解)
重点:数据结构表示 变量、指针
程序结构
程序流控制(条件、分支、循环)
程序设计方法 ----- 程序设计举例
微机系统与接口技术 东南大学 2
汇编语言程序举例( 1 )分块传送
DATA SEGMENTSTRG DB 256 DUP(1,2,3)STG1 EQU STRG+7STG2 EQU STRG+27STRSE EQU 50 ; 串长DATA ENDSSSTACK SEGMENT STACK
DB 256 DUP(?)SSTACK ENDSCODE SEGMENTASSUME CS : CODE , DS : DATA , ES :
DATAMAIN: ….
MOV AX,DATAMOV DS,AX
MS-DOS 程序
微机系统与接口技术 东南大学 3
MOV ES,AXMOV CX,STRSE;MOV SI,OFFSET STG1; 源串首址MOV DI,OFFSET STG2 ;目标首址CLD ;增量方式PUSH SI
ADD SI,STRSE-1 ; SI= 源串末址 CMP SI,DI
POP SI JL OK ;不重叠
STD ;重叠,按减量 ADD SI,STRSE-1 ; 指向串末 ADD DI,STRSE-1
OK: REP MOVSB
程序举例( 1 )分块传送 ( 续一)
STAG1
STAG2
STRSESTAG1+STRSE
微机系统与接口技术 东南大学 4
程序举例( 1 )分块传送 ( 续二) ………
MOV AX,4C00H ; 返回 DOS INT 21H
CODE ENDS END MAIN
数据块传送:一般情况 P204
微机系统与接口技术 东南大学 5
程序举例( 1 )分块传送 ( 通用子程序)
通用子程序结构 功能 = 串移动
ENTRY: DS:SI= 源串首址 ES:DI= 目标首址 CX= 串长
--> 考虑物理地址关系
数据块传送:一般情况
微机系统与接口技术 东南大学 6
BLKMOV PROC PUSH DS PUSH ES PUSH AX PUSH BX
PUSH DXPUSH CX
MOV AX,SIMOV CL,4SAR AX,CL ;右移 4 位MOV DX,DSADD AX,DSMOV DS,AX
AND SI,0FH
程序举例( 1 )分块传送 ( 通用子程序)
微机系统与接口技术 东南大学 7
MOV BX,DISAR BX,CL ; 右移 4 位MOV DX,ESADD BX,DXMOV ES,BXAND DI,0FHCMP AX,BX
;比较 SRC/DST 起始地址高16位JA MOVDOWN; 从低往高JB MOVUPCMP SI,DI ;高16位相等,比低4位JA MOVUPJB MOVDOWN
程序举例( 1 )分块传送 ( 通用子程序)
微机系统与接口技术 东南大学 8
POP CX ; 相等,不移动 JMP MOVEXITMOVUP: STD
POP CXMOV AX,CXDEC AXADD SI,AXADD DI,AXJMP DOMOV
MOVDOWN: CLDPOP CX
DOMOV: REP MOVSBMOVEXIT: POP ……. ;? 子程序保护
RETBLKMOV ENDP
程序举例( 1 )分块传送 ( 通用子程序)
微机系统与接口技术 东南大学 9
多重循环:例—软件延时 (nT,T=210ns )SOFTDLY PROC
MOV BL,10 ; 4T
DELAY0: MOV CX,2801; 4T
DELAY1: LOOP DELAY1; 17T/5T
DEC BL ;3T
JNZ DELAY ;16T/4T
RET ;20T
SOFTDLY ENDP
n=4+10*(4+2801*17-12)+3+16)-12 +20 -->10ms
内循环
程序设计举例( 2 )循环软件延时
微机系统与接口技术 东南大学 10
DAINDEX DB 0;? 波形发生DOTNUM DB DATIME-$-1DAVALUE DB 0,40H,80H,0C0H DB 255,0C0H,80H,40H; 三角波DATIME DW 100DACTRL PROC FAR PUSH DS
PUSH 0000 MOV AX,SEG DAVALUE MOV DS,AX
MOV CL,DOTNUMLEA SI,DAVALUE
INC SI
程序设计举例(三)查表波形发生
微机系统与接口技术 东南大学 11
MOV DAINDEX,0DALOOP: MOV AL, DAINDEX CMP AL, DOTNUM JC DACYCLE
XOR AL, AL MOV DAINDEX, AL; 复位计数DACYCLE: CALL DAOUT INC SI INC DAINDEX CALL DELAY CALL KBINPUT ;读键盘 CMP AL,1BH; ESC 键按下,结束 JNZ DALOOP
RET DACTRL ENDP
程序设计举例(三)查表波形发生 ( 续一 )
微机系统与接口技术 东南大学 12
DAOUT PROC; 查表输出 LEA SI,DAVLUE
XOR AH,AH
ADD SI,AX
MOV AL,[SI]
MOV DX, DAPORT ; DAC 端口 OUT DX,AL
RET
DAOUT ENDP
程序设计举例(三)查表波形发生 ( 续二 )
微机系统与接口技术 东南大学 13
程序设计举例—模块化:过程 / 子程序调用与参数传递
术语 嵌套 递归 可重入 可重定位参数传递1、寄存器2、数据单元变量(内存,含指针变量)(全局)3、堆栈
微机系统与接口技术 东南大学 14
程序设计举例—过程调用与参数传递START: MOV AX,DATA
MOV DS, AX
LEA BX,ARRAY
PUSH BX
LEA BX,COUNT
PUSH BX
LEA BX,SUM
PUSH BX
CALL PRO_ADD
: ;ADD SP,6
OFFSET ARRAY
OFFSET COUNT
OFFSET SUM
断点 CS
断点 IP调用后 SP
运行前 SP
堆栈段
+8
微机系统与接口技术 东南大学 15
PRO_ADD PROC FAR
PUSH AX
PUSH BX
PUSH CX
PUSH BP
MOV BP, SP
MOV BX, [BP+14];
MOV CX, [BX] ; count
MOV BX,[BP+12]; SUM 指针 MOV BX,[BP+16]
MOV AX,0
断点 AX
断点 CX
断点 BX
断点 BP
+8
程序设计举例—过程调用与参数传递(续)
微机系统与接口技术 东南大学 16
LP: ADD AX,[SI]
INC SI
INC SI
LOOP LP
MOV [BX], AX
POP BP
POP CX
POP BX
POP AX
RET 6
断点 AX
断点 CX
断点 BX
断点 BP
+8
程序设计举例—过程调用与参数传递(续)
微机系统与接口技术 东南大学 17
#include <stdio.h> /* 程序 2 */int T_calc(int,int);int main(){int a=20,b=100,c; T_calc(a,b);
return 0;}int T_calc(int a,int b){ int c;c=a+b;return c;}
TCC –B –ms –Iinclude -Llib myprog.c
C 语言函数(课外作业选做:观察汇编程序)
微机系统与接口技术 东南大学 18
过程 / 子程序—模块化:调用与参数传递计算N!( N<=8 WORD; N<=12 DWORD ); MOV AX, N ; 计算 MOV CX, AX
DEC CX
LP: MUL CX
LOOP CX
MOV RESULT,AX
RESULT DW ?
循环方式
微机系统与接口技术 东南大学 19
过程 / 子程序调用 -- 递归计算N!( N<=8 WORD; N<=12 DWORD );思考 : 如 N>12 如何处理
MOV AX, N ; 计算 CALL PCALC
MOV RESULT,AX
RET
RESULT DW ?
课外选做:观察堆栈变化—数据流和程序流
微机系统与接口技术 东南大学 20
递归调用( 续 )
PCALC: CMP AX,1 ; 递归函数JNZ PCALC1
RET
PCALC1: PUSH AX
DEC AX
CALL PCALC ;递归调用POP BX
MUL BX
RET
微机系统与接口技术 东南大学 21
实验:汇编 .ASM-->.OBJ-->.EXE
单模块程序工具: EDIT.EXE MASM.EXE LINK.EXE
编辑器 汇编器 链接器D:>MASM myprog; -->myprog.OBJ
D:>LINK myprog; -->myprog.EXE
多模块程序D:>MASM myprog1; -->myprog1.OBJ
D:>MASM myprog2; -->myprog2.OBJ
D:>LINK myprog1+myprog2+xxx.lib;
-->myprog1.EXE
微机系统与接口技术 东南大学 22
程序 1 hello.c
#include <stdio.h>
int main()
{
printf("Hello, world\n");
return 0;
}
TCC -B -ms -Iinclude -Llib hello.c
C 语言函数(课外作业选做:观察汇编程序)
微机系统与接口技术 东南大学 23
‘Hello World’ 与系统调用DATA SEGMENTszHello DB ‘Hello,World!’,0dh,0ah,’$’DATA ENDSCODE SEGMENTASSUME CS : CODE , DS : DATA , ES : DAT
ASTART: MOV AX,DATA
MOV DS,AXMOV AH,9MOV DX,OFFSET szHelloINT 21HMOV AH,4CHINT 21H
CODE ENDSEND START
用户堆栈SSTACK SEGMENT STACK
DB 256 DUP(?)SSTACK ENDS
微机系统与接口技术 东南大学 24
汇编程序输入输出 BIOS/BDOS(P174-204)
概念和使用DOS 和 BIOS 调用 (Disk OS---Basic I&O system)
两组系统服务程序 OS 与 MS-DOS, MS-DOS OS: 处理机 / 存储 / 文
件 / 设备 / 作业管理 --- 资源管理硬件裸机: BIOS-DOS- 高级语言。硬件控制:直接
IO-BIOS-DOS- 高级语言。移植性:直接 IO 《 BIOS 《 DOS 《高级语言。关键: DOS 与设备无关 ----BIOS 与设备相关应用 : 系统功能调用 ---
软中断 PC—MS-DOS---BIOS INT XXH
微机系统与接口技术 东南大学 25
汇编程序输入输出 BIOS/BDOS(P180)
. 系统功能86PC:4 种中断: NMI, INTR, 内部中断、软中断向量中断技术 0-3FFH 中断向量表0~255 中断号对应中断例程入口 INT n
INT 10H~1FH ROM-BIOS
I/O 控制程序 物理地址 0F000 起始INT 20~3FH DOS 中断INT 40H~FFH 自由中断区P449-458附录 3.2 和 3.3
微机系统与接口技术 东南大学 26
汇编程序输入输出 BIOS/BDOS(P178)
读键盘(阻塞) (非阻塞)MOV AH,1 KBSCAN: MOV AH, 0BH
INT 21H INT 21H
CMP AL,’Y’ CMP AL,0FFH
JZ KBINPUT
;其他例行处理操作 ;
JMP KBSCAN
KBINPUT:MOV AH,1
BOIS 调用:MOV AH,0 MOV AH,1
INT 16H INT 16H
微机系统与接口技术 东南大学 27
汇编程序输入输出 BIOS/BDOS 显示字符: (DOS仅字符方式 ) MOV AH,2 MOV DL,’A’ ; 07 Bell INT 21H; ^C 可退出特点: (MS-DOS)(1) 不用 CALL(2) 软中断 INT n (3) 用户程序不必与服务程序代码相连==>向量(同一般 OS: 代码简洁、可读性好,调试、使用方便)==》基础 CP/M-DOS /BIOS ,。(4)BIOS-ROM固化。
微机系统与接口技术 东南大学 28
汇编程序输入输出 BIOS/BDOS
1. 发展 (1.06.22+,4.0 后为多任务) /IBM –PCDOS 2 局限性 (80x86实模式 ,640K/1M) 3. 系统层次 DOS引导块 ; DOS 自身模块 (3个文件 ); DOS外部命令块 (.COM/EXE/.SYS); PC 用户系统层次结构 : 应用层 /DOS 服务层 /ROM-BIOS 服务层 / 硬件控制层 -- 接口技术 外部( SHELL )命令行— COMMAND.COM // 内部控制: INT n 调用 ==》系统资源管理使用。4. 内存映像 中断向量 /DOS 设备驱动 /DOS 内核 / 系统配置/DOS-SHELL常驻 / 用户程序 5. 不可重入 DOS Kernal :3个堆栈区 :Ker_Stk1错误处理与字符设备处理 ; Ker_Stk2正常处理文件与服务 ;Ker_Stk3正常处理字符设备服务 ; 6. 系统资源 系统堆栈 (3) 、系统链指针块、(系统扇区缓冲区链、系统句柄文件控制块链、 PSP 链。 第 4章