第三章汇编语言程序设计 ( 三 ) Assembly Language Programming(3) 格式 # 伪指令 # DOS/BIOS 调用 ( 简单了解 ) 重点 : 数据结构表示 程序结构 变量 指针 程序流控制 ( 条件 分支 循环 ) 程序设计方法 ----- 程序设计举例 微机系统与接口东南大学 1
DATA 汇编语言程序举例 (1) 分块传送 SEGMENT STRG DB 256 DUP(1,2,3), MS-DOS 程序 STG1 EQU STRG+7 ; 可变源串首址 STG2 EQU STRG+27 ; 可变目标首址 STRSE EQU 50 ; 串长 DATA ENDS SSTACK SEGMENT STACK DB 256 DUP(?) SSTACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA MAIN:. MOV AX,DATA MOV DS,AX 微机系统与接口东南大学 2
OK: 程序举例 (1) 分块传送 ( 续一 ) MOV ES,AX MOV CX,STRSE; MOV SI,OFFSET STG1; 源串首址 MOV DI,OFFSET STG2; 目标首址 CLD ; 增量方式 PUSH SI ADD SI,STRSE-1 STRSE ;SI= 源串末址 CMP SI,DI STAG1 POP SI STAG1+STRSE JL OK ; 不重叠 STAG2 STD ; 重叠, 按减量 ADD SI,STRSE-1 ; 指向串末 ADD DI,STRSE-1 REP MOVSB STRSE 微机系统与接口东南大学 3
程序举例 (1) 分块传送 ( 续二 ) MOV AX,4C00H INT 21H CODE ENDS END MAIN ; 返回 DOS 分析建模 数据块传送 : 一般情况 P204 微机系统与接口东南大学 4
程序举例 (1) 分块传送 ( 通用子程序 ) 通用子程序结构功能 = 串移动 ENTRY: DS:SI= SI 源串首址 ES:DI= 目标首址 --> 考虑物理地址关系普遍适用 CX= 串长 数据块传送 : 一般情况 微机系统与接口东南大学 5
程序举例 (1) 分块传送 ( 通用子程序 ) BLKMOV PROC PUSH DS PUSH ES PUSH AX PUSH BX PUSH DX PUSH CX MOV AX,SI MOV CL,4 SAR AX,CL ; 右移 4 位 MOV DX,DS ADD AX,DS MOV DS,AX AND SI,0FH 微机系统与接口东南大学 6
程序举例 (1) 分块传送 ( 通用子程序 ) MOV BX,DI SAR BX,CL ; 右移 4 位 MOV DX,ES ADD BX,DX MOV ES,BX AND DI,0FH CMP AX,BX ; 比较 SRC/DST 起始地址高 16 位 JA MOVDOWN; 从低往高 JB MOVUP CMP SI,DI; 高 16 位相等, 比低 4 位 JA MOVUP JB MOVDOWN 微机系统与接口东南大学 7
程序举例 (1) 分块传送 ( 通用子程序 ) POP CX ; 相等, 不移动 JMP MOVEXIT MOVUP: STD POP CX MOV AX,CX DEC AX ADD SI,AX ADD DI,AX JMP DOMOV MOVDOWN: CLD POP CX DOMOV: REPMOVSB MOVEXIT: POP. ;? 子程序保护 RET BLKMOV ENDP 微机系统与接口东南大学 8
程序设计举例 (2) 循环软件延时 多重循环 : 例 软件延时 (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 12)+3+16) 12 +20 -->10ms 微机系统与接口东南大学 9
程序设计举例 ( 三 ) 查表波形发生 DAINDEX DB 0;? 波形发生 DOTNUM DB DATIME-$-1 DAVALUE DB 0,40H,80H,0C0H 0C0H DB 255,0C0H,80H,40H; 三角波 DATIME DW 100 DACTRL PROC FAR PUSH DS XOR AX,AX PUSH AX MOV AX,SEG DAVALUE MOV DS,AX MOV CL,DOTNUM LEA SI,DAVALUE INC SI 微机系统与接口东南大学 10
程序设计举例 ( 三 ) 查表波形发生 ( 续一 ) MOV DAINDEX,0 DALOOP: MOV AL, DAINDEX CMP AL, DOTNUM JC DACYCLE XOR AL, AL MOV DAINDEX, AL; 复位计数 DACYCLE: CALL DAOUT INC SI INC DAINDEX CALL DELAY DACTRL ENDP CALL KBINPUT ; 读键盘 CMP AL,1BH; ESC 键按下, 结束 JNZ DALOOP RET 微机系统与接口东南大学 11
程序设计举例 ( 三 ) 查表波形发生 ( 续二 ) DAOUT PROC; 查表输出 LEA SI,DAVLUE XOR AH,AH ADD SI,AX MOV AL,[SI] MOV DX, DAPORT; DAC 端口 OUT DX,AL RET DAOUT ENDP 微机系统与接口东南大学 12
术语 程序设计举例四 模块化过程 / 子程序调用与参数传递 嵌套递归可重入可重定位 参数传递 1 寄存器 2 数据单元变量( 内存, 含指针变量 )( 全局 ) 3 堆栈 微机系统与接口东南大学 13
程序设计举例 过程调用与参数传递 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 堆栈段 调用后 SP 运行前 SP +8 断点 IP 断点 CS OFFSET SUM OFFSET COUNT OFFSET ARRAY int BLKCHEK(*sum:int, *count:int, *array:char); C 微机系统与接口东南大学 14
程序设计举例 过程调用与参数传递 ( 续 ) PRO_ADD PROC FAR PUSH AX PUSH BX PUSH CX PUSH BP MOV BP, SP MOV BX, [BP+14]; MOV CX, [BX] ;count +8 MOV BX,[BP+12]; SUM 指针 MOV BX,[BP+16] MOV AX,0 断点处 BP 断点处 CX 断点处 BX 断点处 AX 微机系统与接口东南大学 15
程序设计举例 过程调用与参数传递 ( 续 ) LP: ADD AX,[SI] INC SI INC SI LOOP LP MOV [BX], AX POP BP POP CX POP BX POP AX RET 6 +8 断点 BP 断点 CX 断点 BX 断点 AX 微机系统与接口东南大学 16
C 语言函数 ( 课外作业选做 : 观察汇编程序 ) #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) {intc; c=a+b; return c; } TCC B ms Iinclude -Llib myprog.c 微机系统与接口东南大学 17
过程 / 子程序 模块化 : 调用与参数传递 计算 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? 循环方式 ; 计算 微机系统与接口东南大学 18
过程 / 子程序调用 -- 递归 计算 N!(N<=8 WORD; N<=12 DWORD); 思考 : 如 N>12 如何处理 MOV AX, N CALL PCALC MOV RESULT,AX RET RESULT DW? ; 计算 课外选做 : 观察堆栈变化 数据流和程序流 微机系统与接口东南大学 19
递归调用 ( 续 ) PCALC: PCALC1: CMP AX,1 ; 递归函数 JNZ PCALC1 RET PUSH AX DEC AX CALL PCALC ; 递归调用 POP BX MUL BX RET 微机系统与接口东南大学 20
C 语言函数 ( 课外作业选做 : 观察汇编程序 ) 程序 1 hello.c #include <stdio.h> int main() { } printf("hello, world\n"); return 0; TCC -B -ms -Iinclude -Llib hll hello.c 微机系统与接口东南大学 21
Hello World 与系统调用 DATA SEGMENT szhello DB Hello,World!,0dh,0ah, $ DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA START: MOV AX,DATA MOV DS,AX MOV AH,9 MOV DX,OFFSET szhello INT 21H MOV AH,4CH INT 21H 用户堆栈 SSTACK SEGMENT CODE ENDS END START STACK DB 256 DUP(?) SSTACK ENDS 微机系统与接口东南大学 22
MS-Visual Studio--VC++ 获取 ASM XXX.COD 文件 微机系统与接口东南大学 23
汇编程序设计举例五 -- 控制台 (Console) 输入输出及转换 控制台 (Console) 输入 / 输出 数据转换 1 直接 I/O 2 OS 功能调用 (DOS/BIOS) 3 API 函数 Windows/TD/User Screen 键盘 / 鼠标 微机系统与接口东南大学 24
概念和使用 BIOS/MS-DOS(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/DOS (P174-204) 功能调用 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.33 常用 :09/0AH 字符串输出 / 输入 01/02H 单字符输入 / 输出 ( 带回显 ) 微机系统与接口东南大学 26
BIOS/DOS (P174-204) 功能调用 读键盘 ( 阻塞 ) ( 非阻塞 ) MOV AH,1 INT 21H CMP AL, Y KBSCAN: MOV AH, 0BH INT 21H CMP AL,0FFH JZKBINPUT ; 其他例行处理操作 ; JMP KBSCAN KBINPUT:MOV AH,1 BOIS 调用 : MOV AH,0 MOV AH,1 INT 16H INT 16H 微机系统与接口东南大学 27
BIOS/DOS (P174-204) 功能调用 显示字符 :(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.0 6.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 SHELL 常驻 / 用户程序 5. 不可重入 DOS Kernal :3 个堆栈区 :Ker_Stk1 错误处理与字符设备处理 ; Ker_ Stk2 正常处理文件与服务 ;Ker _ Stk3 正常处理字符设备服务 ; 6. 系统资源系统堆栈 (3) 系统链指针块 ( 系统扇区缓冲区链 系统句柄文件控制块链 PSP 链链 微机系统与接口第 4 章东南大学 29