汇编--学习笔记(五)-组织数据

来源:互联网 发布:短暂的婚姻 知乎 编辑:程序博客网 时间:2024/06/05 16:03

一、基本概念

 程序中大量的数据、除立即数、由指令产生的数和从键盘等读入的外,其他的要在程序中预置和分配。

  • 1、预置和分配
    • 在一定逻辑段中,将这些数据以一定的形式存放起来,并给出访问的原则。而对于那些最终的结果单元,只需要给出访问形式和预留出一定空间就可以了。
  • 2、如何访问数据
    • 逻辑段中有数据,而逻辑段由段寄存器指定。所以,基址+位移(及数据长度:字节、字、双字等),即可访问数据。
  • 3、缺点及解决
    • 上述访问数据的方法对程序设计者不方便,故汇编语言提供了以变量命名数据的方式,供程序使用,方便用户。

二、变量的定义和预置

1、定义方法
通过DB、DW、DD定义和预置以字节、字、双字为存储单位的变量
定义格式:变量名 DB|DW|DD 表达式|表达式|表达式
变量定义举例:

A   DB 100      ;变量A为一个字节,赋初始值为100B   DB 100,2*3  ;变量B初始值为100,B+1值为6,B是作为一个开始地址C   DB 'ABCD'   ;C41H,C+142H,C+243H,C+344HD   DB ?        ;变量D是一个字节,值不固定E   DB 23 DUP(0) ;230,每个占一个字节,DUP--连续的意思

变量定义举例二:

F   DB 3 DUP (1,2,0)  ;9个数顺序为:1,2,0,1,2,0,1,2,0G   DW 'AB','CD'      ;按BADC的ASCII顺序存放,即42H,41H,44H,43H(先低字节)H   DW 2*3            ;变量H一个字即06H&   0FABH         ;&续行标志,FABH-个字,记得加0I   DW G          ;G是前面定义的一个变量,存放在段中的位移J   DD G          ;G是前面定义的一个变量,这里是双字,G作为一个地址,低字存放G在段中的位移,高字存放G所在的段基K   DW ?          ;K 中预留一个字L   DB 5 DUP ('Hello',0DH,0AH);5+1+1=7个字节重复5次,分配35个字节值

1、定义说明
(1)变量名是一个非保留字的标识符,可有可无。若没有则表示无名变量;
(2)DB、DW、DD只能任选其一,分别表示按字节、字、双字分配存储;
(3)表达式可以是以下6种之一:

  • 常数项表达式
  • 保留符号‘?’
  • 地址表达式(DB不能用,因为地址至少要是“字”)
  • 两个以上的ASCII码字符串(只能用DB定义,因为字或双字会打乱字符串顺序)
  • 预置数据表格
  • 重复值(一个DUP语句)

三、变量的访问

1、变量的5个属性
 由于变量是在逻辑段中定义的,它具有如下5个属性:

  • (1)段(SEGMENT)
    • 说明变量属于哪个段,段基是什么。
  • (2)位移(OFFSET)
    • 即相对段基的位移是多少。
  • (3)类型(TYPE)
    • 由DB、DW、DD决定它是字节、字、双字存储形式。对于特定的存储形式,除非临时改变访问形式,否则应按指定类型访问。
  • (4)长度(LENGTH)
    • 它是指按DB、DW、DD分配时分别按照字节、字、双字为单位对应给出变量所占字节数、字数和双字数。(根据类型不同)
    • X DW 10 DUP(0);X长度为10
  • (5)大小(SIZE)
    • 指变量所占字节数。
    • 说明:
      • (1)SIZE = LENGTH*TYPE
      • 上述属性均可能作为操作数,这时可以通过各种操作符得到

2、取值操作符的使用
格式:

SEG 变量名  ;取变量的段基地址OFFSET  变量名  ;取变量的位移值TYPE    变量名  ;取类型长度,DB、DW、DD变量分别为124LENGTH  变量名  ;取变量长度SIZE    变量名  ;取以字节为单位的单元数

例子:

DATAS SEGMENT    A   DB '2345'    B   DW A   ;位移    ;C  DD A   ;位移和基址    D   DW 123H,0F5H    E   DW 10 DUP(0) DATAS ENDSCODES SEGMENT    ASSUME CS:CODES,DS:SEG A;取A所在段DATA(其实就是DATA)START:    MOV AX,SEG A    ;DATA => AX    MOV DS,AX    MOV AL,LENGTH A ;1 => AL --一个字节    MOV AH,SIZE A   ;1 => AH    ;MOV BH,TYPE C   ;4 => BH    ;MOV BP,OFFSET C ;6 => BP    MOV CX,LENGTH E ;10 => CX    MOV DX,SIZE E   ;20 =>DX    MOV AH,4CH    INT 21HCODES ENDS    END START

类型不一致的例子:

DATAS SEGMENT    A DB 52    B DW 'AB'DATAS ENDSCODES SEGMENT    ASSUME CS:CODES,DS:DATASSTART:    MOV AX,DATAS    MOV DS,AX    MOV AH,A    ;ADB定义只能作为字节操作数    MOV BX,B    ;BDW定义只能作为字操作数    ;MOV CX,A    ;出错,类型不一致    ;MOV CL,B    ;出错,类型不一致    MOV AH,4CH    INT 21HCODES ENDS    END START

3、修改属性操作符

(1)修改类型(PTR)–(C语言中的强制类型转换)
格式:类型 PTR 地址表达式
 其中类型可以是BYTE、WORD、DWORD。地址表达式可以是用变量名给出的有效地址、其他形式的有效地址,或能给出一个地址的表达式。
功能:在使用者一操作符的指令中,临时按指定类型操作。

修改类型PTR(指针)访问变量的例子:

DATAS SEGMENT    A DB 'ABCDEF'    B DW 'BA'  DATAS ENDSCODES SEGMENT    ASSUME CS:CODES,DS:DATASSTART:    MOV AX,DATAS    MOV DS,AX    MOV AL,A     ;按字节访问A    MOV AX,WORD PTR A ;按字节访问A,'AB'=>AX    MOV AH,BYTE PTR B ;按字节B'A'=>AH    MOV AH,4CH    INT 21HCODES ENDS    END START

(2)修改段(段超越)
格式:

段寄存器名: 地址表达式  逻辑段名: 地址表达式

功能:临时指定该有效地址相对指定段寻址。
例如:

MOV BX,SS:[SI+3]  ;SI临时相对SS变址MOV BX,DATA2WORD PTR[100] ;将DATA2逻辑段中位移100的一个字送到BX

四、数组的定义和访问

采用DUP重复句定义的变量可看成数组。
例如:

BARR    DB 100 DUP(0)  ;具有100个元素的字节数组,值均为0WORR    DW 256 DUP(?)  ;具有256个元素的字数组,元素值不定MOV AL,BARR ;第一个元素送ALMOV AL,BARR[0] ;第一个元素送ALMOV AL,BARR[9];第十个元素送ALMOV AL,BARR+9;第十个元素送ALMOV AX,WARR[8];第5个元素,字节=字除以2,WARR是字,AX是字节,8除以2 = 4即第五个元素
原创粉丝点击