• 汇编-变量


    1. .386
    2. .model flat,stdcall
    3. option casemap:none
    4. .data
    5. sum DWORD 0 ;创建一个全局变量,取名sum,初始化0
    6. sum1 DWORD ? ;创建一个全局变量sum1,无初始化
    7. ;问号(?)初始化值使得变量未被初始化,这意味着在运行时才会为该变量分配一个值
    8. ;变量名其实是一个标号,标识了从该变量从所在段的开始到该变量的偏移量
    9. list BYTE 10,20,30,40
    10. BYTE 50,60,70,80
    11. BYTE 81,82,83,84
    12. ;如果同一个数据定义中使用了多个初始化值,则它的标号只指出第一个初始化值的偏移量
    13. ;假设list的偏移量为0000,那么数值10的偏移量就为0000,20的偏移量为0001,30的偏移量为0002,40的偏移量为0003
    14. ;不是所有的数据定义都需要标号。比如, 要在list字节数组后面继续扩展,就可以在下一行定义后加的字节:
    15. ;BYTE 50607080 BYTE 81828384
    16. ExitProcess PROTO,dwExitCode:DWORD
    17. .code
    18. main PROC
    19. mov eax,5
    20. mov sum,eax
    21. INVOKE ExitProcess,0
    22. main ENDP
    23. END main

    定义DWORD和SDWORD数据
     

    1. .data
    2. val1 DWORD 12345678h ;无符号数
    3. val2 SDWORD -2147483648 ;有符号数
    4. val3 DWORD 20 DUP(?) ;无符号数组
    5. val4 DD 12345678h ;无符号数
    6. val5 DD -2147483648 ;有符号数
    7. pVal DWORD val3
    8. ;DWORD还可用于声明一种变量, 这种变量包含的是另一个变量的32位偏移量。如上所示, pval包含的就是val3的偏移量
    9. myList DWORD 1, 2, 3, 4, 5 ;定义数组,偏移量的增量为4

    定义压缩的BCD(TBYTE) 数据

    Intel将一个压缩的BCD整数存放在一个10字节的包中。每个字节(除了最高字节外)包含两个十进制数字。在低9个字节中,每半个字节都存放了一个十进制数字。在最高字节中,最高位表示该数的符号。如果最高字节为80h,则该数为负数;如果最高字节为00h,则该数为正数。整数的范围是-999999999999999999到+999999999999999999。与其他数据值一样, BCD以小端序存储(最低字节存放在变量的起始偏移量处) 。

    MASM使用T BYTE伪指令来声明压缩BCD变量。常量初始化值必须是十六进制的, 因为汇编器不会自动将十进制初始化值转换为BCD码。下面的两个例子展示了十进制数-1234有效和无效的表达方式:

    定义浮点类型
     

    1. .data
    2. rVal1 REAL4 -1.2
    3. rVal2 REAL8 3.2E-260
    4. rVal3 REAL10 4.6E+4096
    5. ShortArray REAL4 20 DUP(0.0)
    6. ;DD、DQ和DT伪指令也可以定义实数:
    7. rVal4 DD -1.2 ;短实数
    8. rVal5 DQ 3.2E-260 ;长实数
    9. rVal6 DT 4.6E+4096 ;扩展精度实数

    实例:变量相加程序

    1. .386
    2. .model flat,stdcall
    3. option casemap:none
    4. .data
    5. firstval DWORD 20002000h
    6. secondval DWORD 11111111h
    7. thirdval DWORD 22222222h
    8. sum DWORD 0
    9. ExitProcess PROTO,dwExitCode:DWORD
    10. .code
    11. main PROC
    12. mov eax,firstval
    13. add eax,secondval
    14. add eax,thirdval
    15. mov sum,eax
    16. INVOKE ExitProcess,0
    17. main ENDP
    18. END main

    声明未初始化变量

    .data?伪指令声明未初始化变量。当定义大量未初始化变量时, .data?伪指令减少了编译后程序的大小。例如,下述代码是高效率的声明:

    1. .data? ;声明未初始化数据
    2. bigArray DWORD 5000 DUP(?) ;20000个字节,未初始化


     

    全局变量

    全局变量的作用域是整个程序, Win32汇编的全局变量定义在.data或.data?段内

    数据类型只有定义全局变量时才可以缩写

    全局变量在定义中既可以指定初值, 也可以只用问号预留空间, 在.data?段中, 只能用问号预留空间, 因为.data?不能指定初始值, 这里就有一个问题:既然可以用问号预留空间,那么在实际运行的时候,这个未初始化的值是随机的还是确定的呢?答案是0,所以用问号指定的全局变量如果要以0为初始值的话,在程序中可以不必特地为它赋值

    局部变量

    局部变量的定义和使用

    MASM用local伪指令提供了对局部变量的支持。定义的格式是:

    local伪指令必须紧接在子程序定义的伪指令proc后、其他指令开始前
    在一个local语句定义不下的时候, 可以有多个local语句, 语法中的数据类型不能用缩写

    当定义数组的时候, 可以[] 括号括起来, 不能使用定义全局变量的dup 伪指令。

    局部变量不能和已定义的全局变量同名。

    局部变量的作用域是当前的子程序,所以在不同的子程序中可以有同名的局部变量。

    实例

    1. .386
    2. .model flat,stdcall
    3. option casemap:none
    4. .stack 4096
    5. .data
    6. ExitProcess PROTO,dwExitCode:DWORD
    7. .code
    8. TestProc Proc dwParam1:DWORD
    9. local loc1:dword ;用local语句定义了1个局部变量:@loc1是dword类型
    10. mov eax, dwParam1 ;把参数值给eax
    11. mov loc1,eax ;把eax值传递给局部变量
    12. ret
    13. TestProc endp
    14. main PROC
    15. invoke TestProc,10101010h
    16. INVOKE ExitProcess,0
    17. main ENDP
    18. END main

  • 相关阅读:
    java毕业设计乒乓球俱乐部管理源码+lw文档+mybatis+系统+mysql数据库+调试
    基本数据结构
    AR人体姿态识别,实现无边界的人机交互
    论文笔记: 度量学习之 ITML (理解ing)
    行车记录仪检测不到内存卡的原因
    Unity 颜色查找表&富文本颜色
    【store商城项目02】登录功能的开发
    iVX低代码平台系列详解 -- 概述篇(三)
    新疆旅游创新产品迎活力 伊吾胡杨文旅品牌发布
    对比HomeKit、米家,智汀家庭云版有哪些场景化的体验
  • 原文地址:https://blog.csdn.net/lm68140318/article/details/134240987