程序设计-(2)

上传人:n**** 文档编号:93077131 上传时间:2019-07-16 格式:PPT 页数:167 大小:1.45MB
返回 下载 相关 举报
程序设计-(2)_第1页
第1页 / 共167页
程序设计-(2)_第2页
第2页 / 共167页
程序设计-(2)_第3页
第3页 / 共167页
程序设计-(2)_第4页
第4页 / 共167页
程序设计-(2)_第5页
第5页 / 共167页
点击查看更多>>
资源描述

《程序设计-(2)》由会员分享,可在线阅读,更多相关《程序设计-(2)(167页珍藏版)》请在金锄头文库上搜索。

1、第三章 汇编语言程序设计,汇编语言源程序格式 顺序、分支、循环程序设计 子程序设计,3.1 汇编语言的源程序格式,汇编语言源程序由语句序列构成。每条语句一般占一行。分号(;)后面为注释。 源程序可以包含若干个代码段、数据段、附加段或堆栈段。 段与段之间的顺序任意。 独立运行的程序必须包含一个代码段,并指示程序执行的起始点,一个程序只有一个起始点。 所有可执行性语句必须位于某一个代码段内,说明语句性语句可根据需要位于任一段内。 通常需要一个堆栈段。,3.1.1 简化段定义格式,.model small ;定义程序的存储模式 .stack 100h ;定义堆栈段(默认1KB空间) .data ;定

2、义数据段 ;数据定义 .code ;定义代码段 .startup ;程序起点 ;程序代码 .exit ;程序结束,返回DOS ;子程序等的代码 end ;汇编结束,3.1.2 完整段定义格式,stack segment stack ;定义堆栈段,段名stack db 1024 dup(0) ;分配堆栈段的大小,为1024字节 stack ends ;堆栈段结束 data segment ;定义数据段,段名data ;数据定义 data ends ;数据段结束 code segment code ;定义代码段,段名code assume cs:code, ds:data, ss:stack ;确

3、定各个逻辑段的类型 start: mov ax, data ;程序起点 mov ds, ax ;设置DS指向数据段的段地址 ;程序代码 mov ax, 4c00h int 21h ;程序结束,返回DOS ;子程序等的代码 code ends ;代码段结束 end start ;汇编结束,程序起始点为start,1. 逻辑段的完整定义,段名 segment 定位 组合 类别 ;语句序列 段名 ends 段定位属性 (默认为PARA) BYTE WORD DWORD PARA PAGE 段组合属性 (默认为PRIVATE) PRIVATE PUBLIC STACK 段类别属性 (代码段要有CODE

4、类别) CODE DATA STACK,2. 逻辑段与段寄存器的对应,ASSUME 段寄存器:段名,段寄存器:段名, ASSUME伪指令建立逻辑段与段寄存器的对应关系,汇编程序会据此在需要时自动插入段超越前缀。 ASSUME并不为段寄存器设定初值。若程序中使用数据段或附加段,必须明确地为DS和ES赋值。,3.1.3 可执行程序的结构,EXE程序 程序在内存中的前256字节为程序段前缀PSP DS和ES指向PSP CS和IP指向代码段程序开始执行的指令 SS和SP指向堆栈段 若没有堆栈段,则SS=PSP段地址,SP=100H。 COM程序 所有段寄存器都指向PSP的段地址 程序执行起点为PSP后

5、的第一条指令,即IP100H 堆栈区设在64KB物理段尾部(通常SP=FFFEH),3.2 常量、变量和标号,常量表示一个固定的数值 变量实质上是指内存单元的数据 名字(变量名或子程序名等)和标号具有逻辑地址和类型的属性,3.2.1 常量,常数:由各种进制表示的数值。默认为十进制。可用伪指令.RADIX改变。 .RADIX n;n为216间的数值 字符串:用单引号或双引号括起来的单个或多个字符,其数值是每个字符对应的ASCII码。 符号常量:用标识符表达一个数值。 符号名 EQU 数值表达式 符号名 EQU 符号名 数值表达式 EQU不能重复定义符号名,“”则允许。 数值表达式:由运算符连接的

6、各种常量所构成的表达式。 算术运算符:、*、/、MOD 逻辑运算符:AND、OR、XOR、NOT 移位运算符:SHL、SHR 关系运算符:EQ、NE、GT、LT、GE、LE,3.2.2 变量,变量的定义: 变量名 伪指令 初值表 变量名表示初值表首元素的逻辑地址。可以没有变量名。 初值表是用逗号(,)分割的参数,由常量或“?”组成。 多个存储单元如果初值相同,可用DUP操作符定义。 重复次数 DUP (重复参数) 变量定义伪指令:DB、DW、DD、DF、DQ、DT。 字符串的定义要用DB。 可以用定位伪指令控制数据或指令的偏移地址。 ORG 参数;由参数指定的偏移地址开始存放数据或指令 EVE

7、N ;由偶地址开始存放数据或指令 ALIGN n ;由n的整数倍地址开始存放数据或指令 符号“$”表示当前的偏移地址,3.2.3 名字和标号的属性,逻辑地址属性:名字和标号对应的存储单元的逻辑地址。 OFFSET 名字/标号 ;返回名字/标号的偏移地址 SEG 名字/标号 ;返回名字/标号的段地址 类型属性:变量名的类型可以是BYTE/WORD/DWORD,标号和子程序名等的类型可以是NEAR/FAR。 类型名 PTR 名字/标号;将名字/标号按指定类型使用 THIS 类型名 ;创建位于当前地址但为指定类型的操作数 SHORT 标号 ;将标号作为短转移处理 TYPE 名字/标号;返回一字型数值

8、,表明名字/标号的类型 字节/字/双字返回1/2/4,短/近/远标号为FF01H/FF02H/FF05H LENGTHOF 变量名 ;返回整个变量的数据项数 SIZEOF 变量名 ;返回整个变量占用的字节数,习题 3.9, mov al, 23h and 45h or 67h;al=67h mov ax, 1234h/16 + 10h;ax=0133h mov ax, 23h shl 4;ax=0230h mov al, a and (not (a-A);al=41h mov ax, (76543 lt 32768) xor 7654h; ax=7654h,习题 3.10, 61h 62h 6

9、3h 0ah 10h 65h 66h ffh 00h 04h 04h 04h ffh 00h 04h 04h 04h ffh 00h 04h 04h 04h 10h fch 00h 00h 00h,习题 3.11,my1b db “Personal Computer” my2b db 20 my3b db 14h my4b db 00010100b my5w dw 20 dup(?) my6c equ 100 my7c equ ,习题 3.14,offset varb = 0104h offset mess = 0114h type buff = 1;type mess = 1; type v

10、ard = 4 sizeof varw = 4;sizeof buff = 10; sizeof mess = 5 lengthof varw =2;lengthof vard = 1,习题 3.15,1000大于字节变量所能表示的范围 OFFSET只能用于简单变量 双操作数不能同时为存储器操作数 数值表达式应为运算符加常量 两操作数类型不一致 条件跳转只能是短跳转,例题 3.4,stack segment stack db 1024 dup(0) stack ends data segment ASCII db 30h,31h,32h,33h,46h hex db 04h,0bh data

11、ends code segment code assume cs:code,ds:data,ss:stack start: mov ax, data mov ds, ax mov bx, offset ASCII,mov al, hex and al, 0fh mov ah, 2 int 21h mov ax, 4c00h int 21h code ends end start,3.5.3 串操作指令,源操作数用SI间接寻址,默认段寄存器为DS,允许段超越。 目的操作数用DI间接寻址,默认段寄存器为ES,不许段超越。 每执行一次串操作,SI和DI将自动修改:1或2。 对于以字节为单位的串操作(

12、指令助记符用B结尾), SI和DI修改1。 对于以字为单位的串操作(指令助记符用W结尾) , SI和DI修改2。 当DF=0时,SI和DI将1或2。 当DF=1时,SI和DI将1或2。,8995、串传送指令,MOVSB ;ES:DI=DS:SI,SI=SI1,DI=DI1 MOVSW;ES:DI=DS:SI,SI=SI2,DI=DI2 STOSB ; ES:DI=AL,DI=DI1 STOSW; ES:DI=AX,DI=DI2 LODSB ; AL=DS:SI,SI=SI1 LODSW; AX=DS:SI,SI=SI2 REP;每执行一次操作,CX=CX1,直到CX0。 MOV CX, 400

13、H REP MOVSB,96101、串检测指令,CMPSB ;DS:SIES:DI,SI=SI1,DI=DI1 CMPSW;DS:SIES:DI ,SI=SI2,DI=DI2 SCASB ; ALES:DI,DI=DI1 SCASW; AXES:DI,DI=DI2 REPE/REPZ; 执行一次操作,CX=CX1,直到CX0或ZF=0。 REPNE/REPNZ; 执行一次操作,CX=CX1,直到CX0或ZF=1。,3.6 子程序设计,子程序定义 过程名 PROC NEAR/FAR ;过程体 过程名 ENDP,有关子程序的说明,子程序中最后应利用RET指令返回。 子程序中应保持堆栈的平衡。 子程

14、序开始应保护所使用的寄存器内容,并在返回前恢复。 子程序应安排在代码段的主程序之外。 子程序允许嵌套和递归。 子程序可以有多个出口。,子程序与主程序间的参数传递,用寄存器传递 用共享变量传递 用堆栈传递,4.1 伪 指 令,一、 汇编起始指令 ORG 指令格式为: ORG nn 该指令的作用是指明后面的程序或数据块的起始地址, 它总是出现在每段源程序或数据块的开始。 式中, nn为 16 位地址, 汇编时nn确定了此语句后面第一条指令或第一个数据的地址,此后的源程序或数据块就依次连续存放在以后的地址内, 直到遇到另一个ORG指令为止。,例: ORG 2000H MOV SP, 60H MOV R0, 2FH MOV R2, 0FFH ORG伪指令说明其后面程序的目标代码在存储器中存放的起始地址是2000H, 即 存储器地址 目标程序 2000H 75 81 60 2003H 78 2F 2005H 7A FF,二、等值指令EQU 指令格式: 字符名称 EQU 数字或汇编符号 功能: 使指令中的字符名称等价于给定的数字或汇编符号。 使用等值指令可给程序的编制、调试、修改带来方便, 如果在程序中要多次使用到某一地址,由EQU指令将其赋值给一个字符名称, 一旦需要对其进行变动, 只要改变EQU

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

当前位置:首页 > 大杂烩/其它

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