280 likes | 500 Views
Assembly Language Programming(3). 格式 # 伪指令 # ╳ DOS/BIOS 调用 ( 简单了解) 重点: 数据结构表示 变量、指针 程序结构 程序流控制(条件、分支、循环) 程序设计方法 ----- 程序设计举例. 第 4 章 汇编语言程序设计 ( 三). 汇编语言程序举例( 1 )分块传送. DATA SEGMENT STRG DB 256 DUP(1,2,3) STG1 EQU STRG+7 STG2 EQU STRG+27
E N D
Assembly Language Programming(3) 格式# 伪指令# ╳DOS/BIOS调用 (简单了解) 重点:数据结构表示 变量、指针 程序结构 程序流控制(条件、分支、循环) 程序设计方法-----程序设计举例 第4章 汇编语言程序设计(三)
汇编语言程序举例(1)分块传送 DATA SEGMENT STRG DB 256 DUP(1,2,3) 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 MS-DOS程序
程序举例(1)分块传送(续一) MOV ES,AX MOV 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 STAG1 STRSE STAG1+STRSE STAG2
程序举例(1)分块传送(续二) ……… MOV AX,4C00H ;返回DOS INT 21H CODE ENDS END MAIN 数据块传送:一般情况 P204
程序举例(1)分块传送(通用子程序) 通用子程序结构功能=串移动 ENTRY: DS:SI=源串首址 ES:DI=目标首址 CX=串长 -->考虑物理地址关系 数据块传送:一般情况
程序举例(1)分块传送(通用子程序) BLKMOV PROC PUSH DS PUSH ES PUSHAX 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
程序举例(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
程序举例(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: REP MOVSB MOVEXIT: POP ……. ;?子程序保护 RET BLKMOV ENDP
程序设计举例(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 +20 -->10ms 内循环
程序设计举例(三)查表波形发生 DAINDEX DB 0;? 波形发生 DOTNUM DB DATIME-$-1 DAVALUE DB 0,40H,80H,0C0H DB 255,0C0H,80H,40H;三角波 DATIME DW 100 DACTRL PROC FAR PUSH DS PUSH 0000 MOV AX,SEG DAVALUE MOV DS,AX MOV CL,DOTNUM LEA SI,DAVALUE INC SI
程序设计举例(三)查表波形发生(续一) 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 CALL KBINPUT ;读键盘 CMP AL,1BH; ESC键按下,结束 JNZ DALOOP RET DACTRL ENDP
程序设计举例(三)查表波形发生(续二) DAOUT PROC; 查表输出 LEA SI,DAVLUE XOR AH,AH ADD SI,AX MOV AL,[SI] MOV DX, DAPORT; DAC端口 OUT DX,AL RET DAOUT ENDP
程序设计举例—模块化: 过程/子程序调用与参数传递 术语 嵌套 递归 可重入 可重定位 参数传递 1、寄存器 2、数据单元变量(内存,含指针变量)(全局) 3、堆栈
程序设计举例—过程调用与参数传递 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 断点IP 断点CS OFFSET SUM OFFSET COUNT +8 OFFSET ARRAY 运行前SP
程序设计举例—过程调用与参数传递(续) 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 断点BP 断点CX 断点BX 断点AX +8
程序设计举例—过程调用与参数传递(续) LP: ADD AX,[SI] INC SI INC SI LOOP LP MOV [BX], AX POP BP POP CX POP BX POP AX RET 6 断点BP 断点CX 断点BX 断点AX +8
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) { int c; c=a+b; return c; } TCC –B –ms –Iinclude -Llib myprog.c
过程/子程序—模块化:调用与参数传递 计算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 ? 循环方式
过程/子程序调用--递归 计算N!(N<=8 WORD; N<=12 DWORD); 思考: 如N>12如何处理 MOV AX, N ;计算 CALL PCALC MOV RESULT,AX RET RESULT DW ? 课外选做:观察堆栈变化—数据流和程序流
递归调用(续) PCALC: CMP AX,1 ;递归函数 JNZ PCALC1 RET PCALC1: PUSH AX DEC AX CALL PCALC ;递归调用 POP BX MUL BX RET
实验:汇编.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
C语言函数(课外作业选做:观察汇编程序) 程序1 hello.c #include <stdio.h> int main() { printf("Hello, world\n"); return 0; } TCC -B -ms -Iinclude -Llib hello.c
‘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 CODE ENDS END START 用户堆栈 SSTACK SEGMENT STACK DB 256 DUP(?) SSTACK ENDS
汇编程序输入输出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
汇编程序输入输出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
汇编程序输入输出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
汇编程序输入输出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固化。
汇编程序输入输出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章