第4章80x86汇编语言程序设计2.变量和标号的属性(1)地址操作符一取偏移地址OFFSET-一取段地址SEGMOV AX, SEGARRAYMOV DS,AXMOVBXOFFSETARRAY:等价于LEABX.ARRAY(2)类型操作符PTR格式:类型名PTR名字/标号例:MOVAL.BYTEPTRWVARJMPFARPTRNLABELTHIS格式:THIS类型名SHORT格式:SHORT标号-TYPE格式:TYPE名字/标号16
16 2. 变量和标号的属性 (1) 地址操作符 ◼ OFFSET——取偏移地址 ◼ SEG——取段地址 MOV AX, SEG ARRAY MOV DS, AX MOV BX, OFFSET ARRAY ; 等价于 LEA BX, ARRAY (2) 类型操作符 ◼ PTR 格式:类型名 PTR 名字/标号 例:MOV AL, BYTE PTR W_VAR JMP FAR PTR N_LABEL ◼ THIS 格式:THIS 类型名 ◼ SHORT 格式:SHORT 标号 ◼ TYPE 格式:TYPE 名字/标号 第4章 80x86汇编语言程序设计
第4章80x86汇编语言程序设计JZ NEXT例4.3显示字符串。INC FLAGMODELSMALLJMPNPOINT.STACKNEXT:MOVAX.TYPEVWORD.DATAMOVCX.LENGTHOFTARGETVBYTEEOUTHISBYTEMOVSLOFESETTARGETVWORDDW3332H.3735HW AGAIN:MOVJSI,AXTARGET DW 5DUP(20H)INC SICRLF DB ODH.OAH 'SINC SIFLAGDBOLOOP WAGAINNPOINTDWOFFSETSLABELMOVCX,SIZEOFTARGET.CODEMOV AL,'?'.STARTUPMOVDIOFFSETTARGETMOVAL.BYTEPTRVWORDB AGAIN:MOV [DII,ALDEC ALINC DIMOVVBYTE.ALLOOPBAGAINN LABEL:CMP FLAG,1MOVDX,OFFSETVWORDJZ S LABELMOV AH.9INC FLAGINT 21HJMPSHORTNLABELEXITOS LABEL:CMP FLAG. 2END
17 例 4.3 显示字符串。 .MODEL SMALL .STACK .DATA V_BYTE EQU THIS BYTE V_WORD DW 3332H, 3735H TARGET DW 5 DUP (20H) CRLF DB 0DH, 0AH, '$' FLAG DB 0 N_POINT DW OFFSET S_LABEL .CODE .STARTUP MOV AL, BYTE PTR V_WORD DEC AL MOV V_BYTE, AL N_LABEL: CMP FLAG, 1 JZ S_LABEL INC FLAG JMP SHORT N_LABEL S_LABEL: CMP FLAG, 2 第4章 80x86汇编语言程序设计 JZ NEXT INC FLAG JMP N_POINT NEXT: MOV AX, TYPE V_WORD MOV CX, LENGTHOF TARGET MOV SI, OFFSET TARGET W_AGAIN: MOV [SI], AX INC SI INC SI LOOP W_AGAIN MOV CX, SIZEOF TARGET MOV AL, '?' MOV DI, OFFSET TARGET B_AGAIN: MOV [DI], AL INC DI LOOP B_AGAIN MOV DX, OFFSET V_WORD MOV AH, 9 INT 21H .EXIT 0 END
第4章80x86汇编语言程序设计程序段的定义和属性4.34.3.1DOS的程序结构在操作员打入一个外部命令时,或者运行一个程序时,MS-DOS将首先确定可用内存区的最低地址。并由此处开始填写程序运行时所需要的一系列参数,还设置一个磁盘读/写缓冲区。这个参数区和缓冲区合起来称为程序段前缀(PSP一一ProgramSegmentPrefix)PSP共占256(100H)字节。操作系统在程序段前缀首址加100H处装配要运行的程序,对于扩展名为EXE的程序,刚运行时,DS和ES这2个寄存器会指向程序段前缀PSP+0,对于扩展名为COM的程序,则在运行时4个段寄存器均指向PSP+0。18
18 4.3 程序段的定义和属性 4.3.1 DOS的程序结构 ◼ 在操作员打入一个外部命令时,或者运行一个程序时,MS-DOS将 首先确定可用内存区的最低地址。并由此处开始填写程序运行时所 需要的一系列参数,还设置一个磁盘读/写缓冲区。这个参数区和 缓冲区合起来称为程序段前缀(PSP——Program Segment Prefix), PSP共占256(100H)字节。操作系统在程序段前缀首址加100H处 装配要运行的程序,对于扩展名为EXE的程序,刚运行时,DS和 ES这2个寄存器会指向程序段前缀PSP+0,对于扩展名为COM的程 序,则在运行时4个段寄存器均指向PSP+0。 第4章 80x86汇编语言程序设计
第4章80x86汇编语言程序设计EXE文件COM文件-CS、DS、ES、SSDS、ES程序段前缀PSP程序段前缀PSP-CS: IP (IP=100H)-CS: IP代码段代码数据数据段堆栈堆栈段SPSS: SPSS:EXE文件:1.DS、ES指向PSP+0;2.CS:IP和SS:SP的值是由LINK传递来的。19
19 EXE文件: 1. DS、ES指向PSP+0; 2. CS:IP和SS:SP的值是由LINK传递来的。 第4章 80x86汇编语言程序设计 EXE文件 程序段前缀PSP 代码段 数据段 堆栈段 DS、ES CS:IP SS:SP COM文件 程序段前缀PSP 代码 数据 堆栈 CS、DS、ES、SS CS:IP (IP=100H) SS:SP
第4章80x86汇编语言程序设计4.3.2简化段定义的格式;定义存储模式.MODELSMALL;定义堆栈段.STACK;定义数据段.DATA;数据定义;定义代码段.CODE;程序起始点,并设置DS和SS.STARTUP;程序代码;程序结束点,返回DOS.EXIT 0;子程序代码;汇编结束END20
20 4.3.2 简化段定义的格式 .MODEL SMALL ; 定义存储模式 .STACK ; 定义堆栈段 .DATA ; 定义数据段 . ; 数据定义 .CODE ; 定义代码段 .STARTUP ; 程序起始点,并设置DS和SS . ; 程序代码 .EXIT 0 ; 程序结束点,返回DOS . ; 子程序代码 END ; 汇编结束 第4章 80x86汇编语言程序设计