汇编语言(二)—— 数据表示

2023-12-28 19:08
文章标签 汇编语言 数据表示

本文主要是介绍汇编语言(二)—— 数据表示,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

汇编语言(二)—— 数据表示

    • 数据表示
      • 常量表达
      • 变量定义
        • 定义BYTE和SBYTE数据
        • 定义WORD和SWORD数据
        • 定义DWORD和SDWORD数据
        • 定义QWORD数据
        • 定义压缩BCD数据
        • 定义浮点类型
      • 补码表示的有符号整数
      • 多字节数据的存储顺序
      • 变量应用
        • 变量的地址属性
      • 变量的类型属性
    • 参考

数据表示

常量表达

常量:程序中使用的确定数值,不需要保存在内存当中,直接编码于指令代码。所有出现的符号名都将被替换为定义内容
常量表达形式包括:① 常数(数值);② 字符和字符串(ASCII码值)③ 符号常量(标识符代替数值)④ 数值表达式(运算得到数值)

  1. 常数:十进制(后缀:D 或 无后缀)、十六进制(后缀:H;以字母A ∼ \sim F开头的十六进制常数要加前导0)、二进制(后缀:B)表达的数值。

  2. 字符和字符串:英文单引号或双引号括起来的单个或多个字符,每个字符的数值是对应的ASCII码值。

  3. 符号常量:使用标识符表达一个数值,定义形式如下:
    ① 等号伪指令:
    等号定义的符号,在同一程序内可以被重新定义。

     符号名 = 数值表达式
    

    ② EQU伪指令:
    EQU定义的符号不能被重新定义。

     符号名 EQU 数值表达式符号名 EQU 已存在符号名称符号名 EQU <字符串> ,如WriteConsole equ <WriteConsole)
    

    ③ TEXTEQU伪指令:
    TEXTEQU定义的符号随时可以被重新定义。

     符号名 TEXTEQU <字符串>符号名 TEXTEQU 已有文本宏的内容符号名 TEXTEQU %整数常量表达式
    
  4. 数值表达式:
    ① 用运算符连接各种常量构成的算式,常用的算术运算符有加减乘除;
    ② 数值用作地址,数值表达式称为地址表达式,地址表达式只能使用加减,指示地址移动常量表示的若干个字节存储单元。

变量定义

变量:随程序运行发生变化的数据,保存在可读可写的主存空间,主存单元的数据,需要事先定义然后使用,属性定义后就有属性便于使用。
变量的定义:

变量名 变量定义伪指令 初值表
  1. 变量名(符号地址):用户标识符,可以没有,表示首元素逻辑地址。

  2. 变量定义伪指令助记符:byte(8位)、sbyte(8位,有符号)、word(16位)、sword(16位,有符号)、dword(32位)、sdword(32Bit,有符号)、qword(64Bit)等,表示变量类型。

  3. 初值表:用逗号分隔的一个或多个参数(多个参数同高级语言数组),表示变量初值。初值表参数类型:① 各种形式的常量;② 使用“?”表示表示初值不确定,即未赋初值,在主存保留存储空间,用0填充;③ 使用复制操作符DUP表示多个同样数值。

  4. 复制操作符格式:

    重复次数 DUP(重复参数) ; e.g. 
    bvar byte 5 dup("\$") 复制操作符DUP可以嵌套
    ; e.g. 
    byte 2 dup(2, 3, 2 dup(4))
    
定义BYTE和SBYTE数据

每个变量1个字节空间(8位),2个16进制位。

  1. 8位无符号整数(伪指令:BYTE / DB):0 ∼ \sim 255

  2. 8位补码表示的有符号整数(伪指令:SBYTE / DB):-128 ∼ \sim +127

  3. 多初始值:标号只指出第一个初始值的偏移量。

  4. 字符:ASCII码

  5. 定义字符串:

     ; e.g. msg byte  'Hello',13,10,0  ; 13,10,0表示$\backslash$n与0
    
  6. “?”:无初值,在主存中保留存储空间,用0填充。

  7. 符号常量:使用等价的数值替代。

     ;e.g.minint = 10bvar byte minint dup(0), minint dup(minint, ?)bvar byte   10   dup(0),   10   dup(  10  , ?) ; (10+20)个字节(BYTE)空间
    
定义WORD和SWORD数据

每个变量2个字节空间(16位),4个16进制位。

  1. 16位无符号整数(伪指令:WORD / DW):0 ∼ \sim 65535
  2. 16位补码表示的有符号整数(伪指令:SWORD / DW):-32768 ∼ \sim +32767
  3. 16位字数组
  4. 16位段地址
  5. 16位偏移地址
定义DWORD和SDWORD数据

每个变量2个字节空间,8个16进制位。

  1. 32位无符号整数(伪指令:DWORD / DD):0 ∼ \sim 2 32 2^{32} 232-1
  2. 32位补码表示的有符号整数(伪指令:SDWORD / DD):- 2 31 2^{31} 231 ∼ \sim + 2 31 2^{31} 231-1
  3. 32位双字数组
  4. 32位逻辑地址:含16位段地址和16位偏移地址
定义QWORD数据

每个变量8个字节空间,16个16进制位。
伪指令:QWORD / DQ

定义压缩BCD数据

Intel将压缩的二进制编码的十进制整数存放在一个10字节的包中,每个字节包含2个10进制数字,最高字节中,最高位表示该数的符号位,如果最高字节为80h,该数就是负数;如果最高字节为00h,该数就是正数。

伪指令(常数的初始值必须是16进制):TBYTE
将实数编码为压缩BCD码:

	.dataposVal REAL8 1.5bcdVal TBYTE ?.codefld posVal			; 加载到浮点堆栈fbstp bcdVal		; 向上舍入到2,压缩BCD码值
定义浮点类型

伪指令:

  1. REAL4定义4字节单精度浮点变量
  2. REAL8定义8字节双精度数值
  3. REAL10定义10字节扩展精度数值

补码表示的有符号整数

  1. 正数原码求补码:
    原码 = 反码 = 补码
  2. 负数原码求补码:
    原码 = 符号位为1,数值部分取绝对值
    反码 = 符号位为1,数值部分为原码取反
    补码 = 符号位为1,数值部分为反码+1
  3. 补码求原码:
    符号位 = 0,补码就是原码;
    符号位 = 1,再次求补得其正数值,即补码符号位不变,其余各位取反+1。
  4. 补码加法:[X+Y] b u m a _{buma} buma = [X] b u m a _{buma} buma + [Y] b u m a _{buma} buma
    异号加法时,结果一定不会溢出;同号加法时,结果同号则未溢出,结果异号则溢出。
  5. 补码减法:[X-Y] b u m a _{buma} buma = [X] b u m a _{buma} buma + [-Y] b u m a _{buma} buma
    [-Y] b u m a _{buma} buma = 负补,对补码的每一位取反(包括符号位)末位+1。
    计算机只会加法运算,减法运算将被转换为加法运算。
    同号减法 = 异号加法,一定不会溢出;
    异号减法 = 同号加法,若结果与减数符号相同则溢出(正 - 负 = 正 + 正 = 负;负 - 正 = 负 + 负 = 正),否则未溢出(正 - 负 = 正 + 正 = 正;负 - 正 = 负 + 负 = 负)。
  6. 如果十六进制数的最高位大于等于8,该数是负数;如果最高位小于等于7,该数是正数。

多字节数据的存储顺序

变量保存于字节编址的主存储器中,每个存储单元保存一个8位的字节量数据,多个字节数据逐个存放在主存的相邻单元。

  1. 一个存储单元保存一个字节量数据,一个存储单元对应一个存储器地址。对N个字节的数据(N ≥ \geq 2),存储在N个连续的存储单元,具有N个存储器地址。
  2. 字节量数据的顺序存储:低地址 -> 高地址
  3. 字量、双字量数据的存储顺序:书写时左边是高位,右边是低位。
    大端方式:高字节数据保存在低地址存储单元,低字节数据保存在高地址存储单元;
    小端方式:高字节数据保存在高地址存储单元,低字节数据保存在低地址存储单元(高对高,低对低)。
  4. 80x86采用小端方式存储多字节数据。

变量应用

定义后的变量名具有两类属性:① 地址属性:首个变量所在存储单元的逻辑地址;② 类型属性:变量定义的数据单元。

变量的地址属性

变量的地址属性指所在存储单元的逻辑地址,含段基地址和偏移地址。通过地址操作符获得变量的地址属性值。
地址操作符:

; 地址操作符
[]                          ; 括起的表达式作为存储器地址指针
$                           ; 返回当前偏移地址
OFFSET  varName             ; 返回变量名所在段的偏移地址
SEG     varName             ; 返回段基地址(实地址存储模型); e.g. 1
bvar byte 12h,34h           ; 该条指令在数据段(DS)出现mov al, bvar           ; 该条指令在代码段(CS)出现,AL = 12Hmov ah, bvar + 1       ; 该条指令在代码段(CS)出现,AH = 34H; e.g. 2
wvar word 5678H             ; 该条指令在数据段(DS)出现
dvar dword 9abcdef0H        ; 该条指令在数据段(DS)出现,地址值在 wvar 之后mov bx, wvar[2]        ; wvar + 2 刚好为 dvar 地址值的开始; bx 为16位寄存器,因此bx = def0; e.g. 3
dvar dword 9abcdef0H        ; 该条指令在数据段(DS)出现mov edx, $             ; 该条指令在代码段(CS)出现,; 因此EDX = 代码段地址 + $ 值mov esi, offset dvar   ; dvar变量在数据段(DS)定义,; 因此ESI = 数据段地址 + offset 值mov edi, [esi]         ; 通过地址获得变量值mov ebp, dvar          ; 直接获得变量值
  1. org指令:org 参数 ; 指定变量存放位置的伪指令。
  2. 数据段使用变量名代表其偏移地址;
  3. 代码段使用变量名代表其首个数据值(变量值),变量名加减常量指向首个数据的前后单元,变量名[n] = 变量名 + n。

变量的类型属性

变量的类型属性表示变量定义的数据单位,通过类型操作符获得变量的类型属性值。

; 类型操作符 
typeName PTR varName                 ; 将变量名按照指定的类型使用
TYPE varName                         ; 返回占用字节空间的字量数值
LENGTHOF varName                     ; 返回整个变量的数据项数
SIZEOF varName                       ; 返回整个变量占用的字节数; e.g. 
array    word 1,2,3,4,5,6,7,8,9,10   ; 数据段(DS), 字类型mov  eax, dword ptr array   ; 代码段(CS), 以双字类型访问,eax 为双字类型
  1. 变量定义: 字节变量定义BYTE,字变量定义WORD,双字变量定义DWORD
  2. 类型名:BYTE,WORD,DWORD
  3. 类型值(字节数):1,2,4
  4. 寄存器具有确定的类型属性:8位寄存器是字节类型byte;16位寄存器是字类型word;32位寄存器是双字类型dword。

参考

中国大学MOOC汇编语言程序设计
汇编语言基于x86处理器

这篇关于汇编语言(二)—— 数据表示的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/546973

相关文章

《x86汇编语言:从实模式到保护模式》视频来了

《x86汇编语言:从实模式到保护模式》视频来了 很多朋友留言,说我的专栏《x86汇编语言:从实模式到保护模式》写得很详细,还有的朋友希望我能写得更细,最好是覆盖全书的所有章节。 毕竟我不是作者,只有作者的解读才是最权威的。 当初我学习这本书的时候,只能靠自己摸索,网上搜不到什么好资源。 如果你正在学这本书或者汇编语言,那你有福气了。 本书作者李忠老师,以此书为蓝本,录制了全套视频。 试

汇编语言知识基础介绍

汇编语言是一种低级编程语言,直接与计算机硬件的指令集架构(ISA)对应。它在操作系统、设备驱动程序和性能关键的应用程序中起着重要作用。以下是汇编语言的基础介绍: 1. 基本概念 指令集架构(ISA):汇编语言与特定的处理器架构(如 x86、ARM)对应,每种架构有其特定的指令集。汇编指令:汇编语言的语法是处理器指令的符号表示,通常包括操作码(opcode)和操作数。操作码指定操作的类型,操作数

汇编语言输出“Hello World!“

1.软件 Nasmide64.exe(李忠老师编写) Fixvhdw64.exe(李忠老师编写) VirtualBox虚拟机(免费 开源) 2.过程 01.Fixvhdw64.exe输入以下代码: mov ax,0xb800mov ds,axmov byte [0x00],'H'mov byte [0x02],'e'mov byte [0x04],'l'mov byte [0

ARM——结构体系(处理器工作模式,CPSR,立即数,汇编语言函数调用)

1、处理器工作模式          ARM有7个基本工作模式:User:非特权模式,大部分任务执行在这种模式FIQ:当一个高优先级(fast)中断产生时将会进入这种模式IRQ:当一个低优先级(normal)中断产生时将会进入这种模式Supervisor:当复位或软中断指令执行时将会进入这种模式Abort:当存取异常时将会进入这种模式Undef:当执行未定义指令时会进入这种模式Sy

ARM下汇编语言编程

一、ARM汇编语言程序格式 ARM汇编语言是以段(section)为单位来组织源文件的。段是相对独立的、具有特定名称的、不可分割的指令或者数据序列。 段又可以分为代码段和数据段,代码段存放执行代码,数据段存放代码运行时需要用到的数据。一个ARM源程序至少需要一个代码段,大的程序可以包含多个代码段和数据段。 二、ARM汇编语言中常用的伪操作 例如: area reset,cod

汇编语言05——包含多个段的程序

整理自fishcc论坛 安全的空间 通常来说,0:200~0:300这段空间是相对安全的,操作系统通常不会去占用 但这只有256个字节,当需要更多空间时,可以向操作系统申请 问题: 编程计算以下8个数据的和,结果存在ax 寄存器中: 0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987H 程序: assume cs

汇编语言04——[BX]和loop指令

整理自fishcc论坛课件 首先展示一个新的程序: assume cs:codesg codesg segment start: mov ax,2000H mov ds,ax mov al,[0] mov bl,[1] mov cl,[2] mov dl,[3] mov ax,4C00H int 21H codesg ends end start 使用masm进行

汇编语言03——第一个汇编程序

整理自鱼C论坛课件 汇编程序编写步骤 编写源代码->使用MASM.exe进行编译,产生目标文件->用LINK.exe,对目标文件进行链接,生成可执行文件 可执行文件中包含两部分内容 1,程序和数据 2,相关的描述信息(程序有多大,要占用多少内存空间等) 源程序: assume cs:abc abc segment mov ax,2 add ax,ax add

汇编语言02——寄存器(内存访问)

整理自鱼C工作室的课件 DS和address DS寄存器通常用来存放要访问的数据的段地址 例如:我们要读取10000H单元的内容可以用如下程序段进行: mov bx,1000H mov ds,bx mov al,[0] 将10000H(1000:0)中的数据读到al中。 mov指令的格式: mov 寄存器名,内存单元地址 “[…]”表示一个内存单元, “[…]

汇编语言01——寄存器(CPU的工作原理)

寄存器概述 CPU的组成:运算器,控制器,寄存器 8086CPU有14个寄存器(8个通用寄存器),分别为: AX,BX,CX,DX,SI,DI,SP,BP,IP,CS,SS,DS,ES,PSW 8086CPU所有寄存器都是16位的,可以存放两个字节(一个字) AX,BX,CX,DX是通用寄存器,存放一般性数据 8086上一代CPU的寄存器是8位的;为保证兼容性,这四个寄存器都可