290 likes | 531 Views
DATA SEGMENT BNUM DW 270FH ASTR DB 5DUP(?) DATA ENDS CODE SEGMENT ASSUME CS:CODE… START PROC FAR BEGIN: … MOV AX,BNUM LEA BX,ASTR MOV DL,0 AGA1:SUB AX,2710H JS NEXT1 INC DL
E N D
DATA SEGMENT BNUM DW 270FH ASTR DB 5DUP(?) DATA ENDS CODE SEGMENT ASSUME CS:CODE… START PROC FAR BEGIN: … MOV AX,BNUM LEA BX,ASTR MOV DL,0 AGA1:SUB AX,2710H JS NEXT1 INC DL JMP AGA1 NEXT1:ADD AX,2710H ADD DL,30H MOV [BX],DL INC BX MOV DL,0 AGA2:SUB AX,03E8H JS NEXT2 INC DL JMP AGA2 NEXT2:ADD AX,03E8H ADD DL,30H MOV [BX],DL INC BX MOV DL,0 AGA3: SUB AX,0064H JS NEXT3 INC DL JMP AGA3 NEXT3:ADD AX,0064H 二进制到BCD的转换
ADD DL,30H MOV [BX],DL INC BX MOV DL,0 AGA4:SUB AX,000AH JS NEXT4 INC DL JMP AGA4 NEXT4:ADD AX,000AH ADD DL,30H MOV [BX],DL INC BX ADD AL,30H MOV [BX],DL RET START ENDP CODE ENDS END BEGIN 接上
从二进制到ASCII串的转换 设串1地址指针,设串长度 修改地址指针 用‘0’填满串 N 完成否? 取要转换的数 Y 返回 左移1位 N C=1? Y 存入‘1’
1、加1个项至1个无序列 例3-19 缓冲区中有一无序列,列的长度放在缓冲区的第1个字节,要把内存某单元的1项加入到此列中。 DATA SEGMENT BUF DB 10,’abcdefghij’ DB ? KEY DB ‘$’ DATA ENDS CODE SEGMENT ASSUME CS:COED… START PROC FAR BEGIN: PUSH DS …… LEA DI,BUF MOV CH,0 MOV CL,[DI] INC DI MOV AL,KEY REPNZ SCASB JE DONA MOV [DI],AL INC BUF DONE:RET START ENDP CODE ENDS END BEGIN 有关列和表的程序设计
例3-20 在内存缓冲区中有一个无序列,列的长度存放在第1个字节,另有一单元存放要删去的元素变量,查找此无序列,若包含要删去的元素则把它删去,并对列做相应的调整。 DATA SEGMENT BUF DB 10,’abcdefghij’ KEY DB ‘f’ DATA ENDS CODE SEGMENT ASSUME CS:CODE,… START PROC FAR BEGIN: …. LEA DI,BUF MOV CH,0 MOV CL,[DI] INC DI MOV AL,KEY REPNE SCASB JNE DONE DEC BUF SCHG SI,DI REP MOVSB DONE: RET START ENDP CODE ENDS END BEGIN 从一个无序列中删去一个元素
例: 有一无序列,列的长度放在第1字节。 DATA SEGMENT BUF DB 10,22,-12… MIN DB ? MAX DB ? DATA ENDS CODE SEGMENT ASSUME CS:CODE,… START PROC FAR BEGIN: … LEA BX,BUF MOV CH,0 MOV CL,[BX] INC BX MOV AL,[BX] DEC CX MOV MIN,AL MOV MAX,AL INC BX DEC CX AGAIN:MOV AL,[BX] CMP AL,MIN JE NEXT JG A1 MOV MIN,AL JMP NEXT A1: CMP AL,MAX JL NEXT MOV MAX,AL NEXT: INC BX DEC CX JNE AGAIN RET…. 3、找出无序列中的最大值和最小值
DATA SEGMENT A DW 23,34….. DATA ENDS PROG SEGMENT MAIN PROC FAR ASSUME CS:PROG,… START:….. MOV CX,N DEC CX LOOP1: MOV DI,CX MOV BX,0 LOOP2: MOV AX,A[BX] CMP AX,A[BX+2] JGE COTI XCHG AX,A[BX+2] MOV A[BX],AX COTI: ADD BX,2 LOOP LOOP2 MOV CX,DI LOOP LOOP1 RET MAIN ENDP PROG ENDS END START 阅读程序
串操作指令流程 取源串地址 传送一个字节或字 取目标串地址 修改地址指针 设串长度 修改串长度值 传送完否?
串比较指令例 测试200个字节数据是否传送正确: LEA SI,MEM1 LEA DI,MEM2 MOV CX,200 CLD REPE CMPSB TEST CX,00FFH JZ STOP DEC SI MOV AL,[SI] MOV BX,SI STOP:HLT
LEA指令在程序中的应用 传送一个字节 开 始 修改地址指针 取源地址 修改计数值 取目标地址 N 计数值=0? 送数据块长度到CL Y 结 束
LEA指令在程序中的应用 LEA SI,MEM1 LEA DI,MEM2 MOV CL,50 NEXT: MOV AL,[SI] MOV [DI],AL INC SI INC DI DEC CL JNZ NEXT HLT
§4.5.4 DOS及BIOS 功能调用 DOS 功能调用 高级调用,操作系统提供 BIOS功能调用 低级调用 1. DOS 模块和BIOS 的关系 BIOS---外部设备管理软件,固化在主板的ROM中。 DOS----操作系统。包含IBMBIO.COM(输入输出设备处理程序),IBMDOS.COM(文件管理及处理程序),COMMAND.COM(命令处理程序)
2.中断调用及中断服务子程序返回3.DOS 功能调用 • 包含多个子功能的功能包,用软中断指令INT 21H 调用,中断类型码固定为21H; • 各子功能采用功能号来区分。 附录C
DOS功能调用 设备管理 目录管理 文件管理 其它 • 调用格式: MOV AH,功能号 ;<置相应参数> INT 21H
1)返回DOS • 调用方法: MOV AH,4CH;功能号4CH INT 21H 2)键盘输入并显示 • MOV AH,1 INT 21H;从键盘输入一个字符保存在AL中,并在屏幕上显示。
单字符输入例 GET_KEY: MOV AH,1 INT 21H CMP AL,’Y’ JZ YES CMP AL,’N’ JZ NO JNZ GET_KEY YES: ┇ NO: ┇ 交互式应 答程序
3)键盘输入但不显示输入字符 • MOV AH,08H INT 21H;从键盘输入一字符,保存在AL中,但 不显示,用来设置口令。 4)显示DL中的字符 MOV DL,’A’ MOV AH,02H INT 21H
单字符显示输出例 • MOV AH,02 • MOV DL,41H • INT 21H 执行结果: 屏幕显示A
从键盘输入字符串 • AH 功能号OAH • DS:DX 字符串在内存中的存放地址 • INT 21H P169例
定义字符缓冲区 • 用户自定义缓冲区格式: N1 N2 0DH 整个缓冲区 实际键入字符数 最大键入字符数
输入字符串程序段 • DAT1 DB 20,?,20 DUP(?) • LEA DX,DAT1 MOV AH,0AH INT 21H 在数据段中定义
输入缓冲区 定义后的输入缓冲区初始状态: 14H ? 20个字节
字符串输出显示 • AH 功能号O9H • DS:DX 待输出字符串的偏移地址 • INT 21H • 被显示的字符串必须以‘$’结束,且所显示的内容不应出现非可见的ASCII码
字符串输出显示例 DATA SEGMENT MESS1 DB ‘Input String:’ 0DH,0AH,’$’ DATA ENDS CODE SEGMENT ┇ MOV AH,09 MOV DX,OFFSET MESS1 INT 21H ┇
结束用户程序返回DOS的方法 • 用4CH功能 MOV AH,4CH INT 21H • 用中断调用20H INT 20H • 转移到0单元 JMP 0 • 用 00H功能 MOV AH,00 INT 21H
4.BIOS功能调用 • 1)设置显示方式P171 • 2)设置光标大小 MOV AH,1;功能号为1 MOV CH,0;光标顶值(0---11) MOV CL,12;光标底值(1—12) INT 10H • 3)设置光标位置 P172
在计算机上进行程序设计过程 • D:\masm>EDIT 输入源程序 • D:\masm>MASM 汇编 • D:\masm>LINK 链接 • D:\masm>TD 调试
作业: • 4.1----4.29 谢谢大家!
七、宏命令伪指令 • 宏命令--------源程序中由汇编程序识别的具有 独立功能的一段程序代码 • 格式: 宏命令名 MACRO <形式参数> ┇ ┇ ENDM 宏体 例