汇编3:基础存储语法

本文介绍了汇编语言中的常量表达、数据表达式、变量及其属性。常量包括直接数值、字符和字符串,而变量是可变数据,存储在主存中。变量的定义涉及存储空间的申请,可以通过变量的地址属性和类型属性来操作。存储方面,汇编语言按字节存储数据,遵循小端存储方式。地址属性包括段基址和偏移地址,可通过特定操作符获取。

语法

汇编语言常量表达

1. 常量

  1. 常量是程序中使用的一个确定数值
    • 在汇编阶段就可以确定,直接编码于指令代码中
    • 在程序运行过程中不会改变(不是变量)
    • 不是保存在存储器中的可变的变量
  2. 汇编语言支持多种常量表达式
    • 常数:直接给出数值本身
    • 字符和字符串:使用ASCII码值
    • 符号常量:用标识符替代数值
    • 数值表达式:经过运算得到的数值
  3. 字符和字符串
    • 单引号或双引号括起来的单个或多个字符
    • 每个字符的数值是对应的ASCII码值
    • 字符带单引号时,需用双引号将字符或字符串括起来
    • 字符和字符串没有本质的区别

数据表达式

  1. 汇编语言将数值用16进制进行保存

    • const1 db 100,100d,01100100b,64h,‘d’`
    • 以上指令都是用16进制的64将数值写入内存
      在这里插入图片描述
  2. 数值的存储分为 有符号数 和 无符号数

    • 负数是将补码写入内存
      在这里插入图片描述
  3. mov ax,offset const

    • 将const的偏移地址赋值给ax(ax指向const变量的起始位置)

变量(Variable)

1. 解释

  1. 变量

    • 变量随着程序运行会发送变化的数据
    • 保存在可读可写的主存空间
  2. 变量的实质是主存单元的数据,所以可以改变

    • 变量需要事先定义才能使用
    • 变量具有属性方便应用

变量的定义

  1. 变量定义是申请存储空间
    • 同时还可以进行存储单元
    • 即用初值表赋予变量初值
  2. 初值表可以有一个或多个参数,多个参数用逗号分隔
    • 使用 “?” 表示初值不确定,即未赋初值
    • 使用复制操作符 “DUP” 表示多个同样数值

存储

  1. 按字节存储bvar5 db 10 dup(0),10 dup(10,?)
  • "?"默认数值为0

在这里插入图片描述
2. a db dup(2,3,2dup(4))`
在这里插入图片描述

  1. 按字存储wvar1 dw 0,32768,65535,-32768,0,32767

在这里插入图片描述
在这里插入图片描述

  1. 按双子存储dvar1 dd 0,80000000h,0ffffffffh
    在这里插入图片描述
    在这里插入图片描述

  2. 字量数据的存储顺序

    • wvar6 dw 3139h,3832h
      在这里插入图片描述

    • 小端存储方式(高对高,低对低)

      • 高字节数据保存在高地址存储单元
      • 低字节数据保存在低地址存储单元
    • 大端存储方式(高对低,低对高)

      • 高字节数据保存在低地址存储单元

      • 低字节数据保存在高地址存储单元

        在这里插入图片描述

        注意:以上为小端存储方式(8086就是为小端存储方式)

变量的地址属性

  1. 变量的地址属性指所在存储单元的逻辑地址

    • 含有 段基地址 和 偏移地址
  2. 通过 地址操作符 获得变量的地址属性

    符号作用
    [ ]括起的表达式作为存储器地址指针
    $返回当前偏移地址
    OFFSET 变量名返回变量名所在段的偏移地址
    SEG 变量名返回段基地址(实地址存储模型)
  3. org 指定当前地址

    bvar db 12h,34h
    org $+10
    array dw 1,2,3,4,5,6,7,8,9,10
    

    在这里插入图片描述

  4. 代码段使用变量名,代表其首个数据(变量值);变量名加减常量,指向首个数据的前后单元;

    • al = 12h,ah = 34h
    • mov al, bvar 相当于 mov al, [bvar]
    • mov ah, bvar+1 相当于 mov ah, [bvar+1 ]

    在这里插入图片描述

  5. DATAS SEGMENT
    	wvar dw 5678h
    	dvar dd 9abcdef0h
        ;此处输入数据段代码  
    DATAS ENDS
    
    STACKS SEGMENT
        ;此处输入堆栈段代码
    STACKS ENDS
    
    CODES SEGMENT
        ASSUME CS:CODES,DS:DATAS,SS:STACKS
    START:
        MOV AX,DATAS
        MOV DS,AX
        
        mov bx,wvar[2]
        
        ;此处输入代码段代码
        MOV AH,4CH
        INT 21H
    CODES ENDS
        END START
    

    mov bx, wvar[2]相当于wvar+2,同时bx又是16位寄存器,所以要顺延取两个字节的数据,即DEF0

    在这里插入图片描述

  6. 在变量前加上offset表示获取变量的偏移地址mov esi, offset dvar

    在这里插入图片描述

  7.     mov si,offset dvar ; 将dvar的偏移地址赋给si
        mov di,[si]  ; 将si这个地址的值赋给di
        mov bp,dvar  ; 直接获取dvar变量值
    

获取变量的类型属性

变量名作用
PTR将变量名按照指定的类型使用
TYPE返回占用字节空间的字量数值
LENGTHOF返回整个变量的数据项数
SIZEOF返回整个变量占用的字节数

1. type

type就是判断数据为什么类型的数据,1表示字节数据,2表示字数据,4表示双字数据

DATAS SEGMENT
	bvar db 12h ; 字节数据,type为1
	wvar dw 5678h ; 字数据,占用两个字节,type为2
	dvar dd 12345678h ; 双字数据,占用四个字节,type为4
    ;此处输入数据段代码  
DATAS ENDS

STACKS SEGMENT
    ;此处输入堆栈段代码
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
    
    mov ax,type bvar ; 0001h
    mov bx,type wvar ; 0002h
    mov cx,type dvar ; 0004h
    
    ;此处输入代码段代码
    MOV AH,4CH
    INT 21H
CODES ENDS
    END START

在这里插入图片描述

2. lengthof

lengthof就是输出变量的数据个数(项数)

DATAS SEGMENT
	array dw 1,2,3,4,5,6,7,8,9,10 ; array中共有10个数据
    ;此处输入数据段代码  
DATAS ENDS

STACKS SEGMENT
    ;此处输入堆栈段代码
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
    
    mov ax,lengthof array ; 将array中的数据个数赋给ax,ax输出10
    
    ;此处输入代码段代码
    MOV AH,4CH
    INT 21H
CODES ENDS
    END START

在这里插入图片描述

3. sizeof

sizeof就是获取变量一共占用了多少存储空间

DATAS SEGMENT
	array dw 1,2,3,4,5,6,7,8,9,10 ; array中共有10个数据
    ;此处输入数据段代码  
DATAS ENDS

STACKS SEGMENT
    ;此处输入堆栈段代码
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
    
    mov ax,lengthof array ; 将array中的数据个数赋给ax,ax输出10
    mov bx,sizeof array ; 将array中数据的大小赋给bx,bx输出14h,因为array是以字存储,所以占用内存大小为20个字节
    ;此处输入代码段代码
    MOV AH,4CH
    INT 21H
CODES ENDS
    END START

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值