微型计算机原理11汇编语言程序设计

上传人:E**** 文档编号:90905555 上传时间:2019-06-20 格式:PPT 页数:68 大小:489KB
返回 下载 相关 举报
微型计算机原理11汇编语言程序设计_第1页
第1页 / 共68页
微型计算机原理11汇编语言程序设计_第2页
第2页 / 共68页
微型计算机原理11汇编语言程序设计_第3页
第3页 / 共68页
微型计算机原理11汇编语言程序设计_第4页
第4页 / 共68页
微型计算机原理11汇编语言程序设计_第5页
第5页 / 共68页
点击查看更多>>
资源描述

《微型计算机原理11汇编语言程序设计》由会员分享,可在线阅读,更多相关《微型计算机原理11汇编语言程序设计(68页珍藏版)》请在金锄头文库上搜索。

1、汇编语言程序设计,1,第四章 汇编语言程序设计(2),汇编语言源程序的另一种结构 汇编语言中的操作数 Dos 功能调用 汇编语言程序设计举例,堆栈段,数据段,代码段,一个基本的汇编语言程序框架如下:返回,stack SEGMENT PARA stack ;定义作为堆栈段的逻辑段,段名为stack DB 100 DUP(?) ;定义堆栈长度 top LABLE word ;定义栈底位置 stack ENDS data SEGMENT ;定义作为数据段的逻辑段,段名为data data ENDS code SEGMENT ;定义作为代码段的逻辑段,段名为code ASSUME CS:code, D

2、S:data, ES:data, SS:stack start: MOV AX, data ;程序执行起始点 MOV DS, AX MOV ES, AX;将各个段寄存器指向用户定义的各个逻辑段 ;MOV AX,stack ;MOV SS, AX ;MOV SP, OFFSET TOP MOV AL, 4CH ;系统功能调用,程序结束返回操作系统OS INT 21H code ENDS END start ;汇编结束,程序起始点为start,汇编语言程序设计,3,关于源程序结构的几点说明,在代码段中,assume语句只给出了各个段寄存器和各个自定义段的关系,并没有给各个段寄存器真正赋值。 段寄存

3、器的赋值还要由程序本身来完成,如我们用到mov ax,data mov ds,ax mov es,ax 给ds和es赋值。第一条指令,将段基址送给目的操作数,这是mov 指令的一个特殊情况 为什么只给ds,es赋值,而不给cs,ss赋值? 因为在dos环境下运行程序时,dos 的装入程序已经对cs:ip和ss:sp作了正确的初始化,而ds,es初始化为程序段前缀psp的起点,而非用户所需要的地址,所以我们要对它俩重新赋值,汇编语言程序设计,4,在上面的结构中,程序结束后返回DOS操作系统用的是: mov ah,4ch int 21H 当用户程序结束时,返回dos操作系统还有一种常用的方法: 1

4、.首先把用户程序设置成一个过程,且类型设置为far。 2.在用户程序程序开始处 push ds xor ax,ax push ax 在子程序结束时用ret指令。这样也可以返回dos操作系统。 这实际上是用了int 20h中断指令。虽然我们从程序表面上没有看到这条指令,但是这条指令一定存在于用户程序的目标代码之前的程序段前缀区(program segment prefix)中。,汇编语言程序设计,5,原因是:每当一个用户程序的可执行文件(.exe)被DOS加载至内存中去时,它首先要为该程序建立一个一个文件头,又叫程序段前缀(PSP),占100H(256)个字节,然后把可执行的程序代码加载至PSP

5、的后续地址上。即CS指向地点。而DS和ES初始化在PSP的起始地址。内存分配如右图。PSP给出了用户可执行文件的若干控制信息,其中前两个字节是一条中断指令INT 20H,即程序结束返回DOS指令。当用户程序结束运行时,可以通过把程序执行地址返回PSP执行这条指令而终止自己的进程。这是一种传统方法,;在屏幕上输出字符串:hello,everyone!的另一种编程 Stack segment Db 100 dup (?) Stack segment data segment String db hello,everyone!,0dh,0ah,$ Data segment Code segment

6、Proc1 proc far assume cs:code, ds:data, es:data, ss:stack Start:push ds sub ax,ax push ax mov ax,data mov ds,ax mov ah,09h mov dx,offset string;或lea dx,string int 21h ret proc1 endp Code ends end start,汇编语言程序设计,7,DOS功能调用,重点注意: 1、 DOS功能调用的概念; 2、 DOS功能调用中字符I/O功能的使用方法。,汇编语言程序设计,8,一、 DOS功能调用的概念,1、软件中断:

7、格式: INT n n为中断类型号,每个类型号对应一个四字节的向量。8086有多达256个不同的中断类型号向量,这些向量被存放在物理地址为00000H003FFH的存储单元中。 软件中断分为三类:,软件中断,自由中断(40HFFH),ROM BIOS中断(10-1FH),DOS中断(9个 20H27H&2FH),2、DOS中断,3、DOS可调用中断,3、DOS功能调用中断(INT 21H),(1)INT 21H 的中断向量,INT 21H,256个中断向量,(2)INT 21H 的子功能(共计84个子功能),(3)INT 21H 的使用,a、02H功能号的使用(显示字符B) MOV AH,02

8、H MOV DL,B INT 21H,b、09H功能号的使用(显示字符串1234567) 数据段中: BUFFER DB 1234567,$ 代码段中: MOV AX,SEG BUFFER MOV DS,AX MOV DX,OFFSET BUFFER MOV AH,09H INT 21H INT 20H,例1: 在CRT 上连续输出字符09,name output stack segment para stack stack db 100 dup(?) stack ends code segment assume cs:code , ss:stack start proc far begin:

9、 push ds mov ax,0 push ax mov bl,0 push bx goon: mov dl,20h mov ah,2 int 21h pop bx,mov al,bl inc al daa and al,0fh mov bl,al push bx or al, 30h mov dl, al mov ah,2 int 21h mov cx,0fffh again: dec cx jne again jmp goon ret start endp code ends end begin,二、I/O的DOS 调用的例子,例2:在CRT 上连续显示0059,name output_

10、char_00_59 stack segment para stack stack db 100 dup(?) stack ends data segment buffer db 3 dup(?) data ends code segment assume cs:code,ds:data,ss:stack Start proc far begin: push ds mov ax,0 push ax mov ax,data mov ds,ax mov ax,stack mov ss,ax,mov cx,1000 mov bl,0 lea si,buffer push bx,goon: mov d

11、l,0dh mov ah,2 int 21h mov dl,0ah mov ah,2 int 21h pop bx mov al,bl inc al daa cmp al,60h jc next mov al,0 next: mov bl,al push bx mov dl,al push cx,mov cl,4 shr al,cl or al,30h mov si,al inc si mov al,dl and al,0fh or al,30h mov si,al inc si mov al,$ mov si,al mov dx,offset buffer mov ah,9 int 21h

12、mov cx,0ffffh,汇编语言程序设计,15,again: dec cx jne again pop cx dec cx je done mov si,offset buffer jmp goon done: ret start endp code ends end begin,汇编语言程序设计,16,小结:,1、DOS功能调用INT 21H,是DOS系统内部的软件中断,由近百个子程序组成,是DOS内核的主要组成部分。 这些子程序被加载到连续的存储区中,其首地址(即INT 21H的中断向量)在中断向量表中的84H87H四个字节中,2个字节位段地址,2个字节位偏移量。 执行INT 21H指

13、令时,系统自动将2个字节位段地址送CS, 2个字节位偏移量送IP,再根据AH中的功能号,CPU就可以跳到对应的子程序上执行,完成相应功能。,2、02H功能号和09H功能号是DOS功能调用INT 21H中的字符I/O功能,其使用方法如下:,a、02H功能号的使用(显示一个字符) MOV AH,02H MOV DL,要显示的字符 INT 21H,b、09H功能号的使用(显示一个以$位结束符的字符串) MOV AX,字符串所在的段地址 MOV DS,AX MOV DX,字符串的偏移量 MOV AH,09H INT 21H,汇编语言程序设计,18,汇编语言中的操作数,寄存器操作数,如ax,bx,bp,

14、cx,dl等 常量 存储器操作数,常量包括常数、字符串常量,符号常量, 数值表达式,常数 二进制数,以B结尾。如01001101B。 十进制数,如85。 十六进制数,以H结尾。第1个数字为A-F时,前面应加0,如0F160H。 字符串:用引号括起来的1个或多个字符。如ERROR!, a,汇编时被翻译成对应的ASCII码45H,52H,52H,4FH,52H,21H和61H。,字符串常量 “AB”等价于4142h,汇编语言程序设计,20,常量,符号常量 PORT_VAL EQU 3 就是把端口地址3定义为一个符号PORT_VAL,数值表达式 见后面一页,表达式,表达式是常数、寄存器、标号、变量与

15、运算符的组合。 有数字表达式和地址表达式两种。 汇编时按优先规则对表达式进行计算,计算出具体的数值或地址。运行时不能改变。 表达式中的运算符有6类:算术、逻辑、关系、取地址、属性、杂类。,汇编语言程序设计,22,用于数字表达式,例: MOV AX,4*1024 汇编后的形式为: MOV AX,4096 用于地址表达式,例: LEA SI,TAB+3 若TAB的偏移地址为1000H,则汇编后的形式为: LEA SI,1003H,1)算术运算符 +、-、*、/,MOD,汇编语言程序设计,23,逻辑运算符只能用于数字表达式中。 例:MOV CL,36H AND 0FH 经汇编后:MOV CL,06H

16、 注意,不要把逻辑运算符与逻辑运算指令混淆: 例:AND AX, 3FC0H AND 0FF00H 汇编后源操作数被翻译为:3F00H,所以上述指令与AND AX, 3F00H等价。,2)逻辑运算符 AND、OR、XOR、NOT,汇编语言程序设计,24,关系运算的结果是一个逻辑值:真或假 关系为真,结果为全1 关系为假,结果为全0 例:MOV BX,PORT GT 300H 若PORT的值大于300H,则汇编后为: MOV BX,0FFFFH 否则汇编后为: MOV BX,0,3)关系运算符EQ、NE、LT、GT、LE、GE,汇编语言程序设计,25,SEG:取变量/标号的段地址 OFFSET:取变量/标号的偏移地址 例:VAR DB 12H MOV

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号