汇编中的标号概念

2023-05-16

地址标号和数据标号

  1. 地址标号
    
     1 assume cs:code
     2 code segment
     3     a: db 1, 2, 3, 4, 5, 6, 7, 8
     4     b: dw 0
     5 start:     mov si, offset a
     6           mov bx, offset b
     7           mov cx, 8
     8 s:           mov al, cs:[si]
     9           add cs:[bx], al
    10           inc si
    11           loop s
    12     
    13           mov ax, 4c00h
    14           int 21h
    15 code ends  

    程序中codeabstarts都是标号,仅仅表示内存单元的地址。

    注意:对于":"的地址标号,只能在代码段中使用,不能在其他段中使用。

  2. 数据标号(在代码段中使用数据标号)
    
     1 assume cs:code, ds: data
     2 code segment
     3     a db 1, 2, 3, 4, 5, 6, 7, 8
     4     b dw 0    
     5 start:
     6     mov si, 0
     7     mov cx, 8 
     8 s:  mov al, a[si]
     9     mov ah, 0
    10     add b, ax
    11     inc si
    12     loop s
    13             
    14     mov ax,4c00h
    15     int 21h
    16 code ends
    17 
    18 end start  

    程序中的ab是数据标号,不仅仅表示内存单元的地址,还表示了内存单元的长度。标号b代表了一个内存单元,地址为code:8长度为两个字节。所以,如果mov al, b会报错。

    数据标号在编译期间被编译器直接用地址替换了,并且进行了类型(字节操作or字操作)检查。

    比如: mov ax, b <==> mov ax, cs:[8]

    mov b, 2 <==> mov word ptr cs:[8], 2

    mov al, a[si] <==> mov al,cs:0[si]

    mov al, a[bx+si+3] <==> mov al, cs:[0][bx+si+3]

  3. 数据标号(在其他段中使用)

     

    
     1 assume cs:code, ds: data
     2 data segment
     3     a db 1, 2, 3, 4, 5, 6, 7, 8
     4     b dw 0
     5 data ends
     6     
     7 code segment    
     8 start:
     9         mov ax, data
    10         mov ds, ax
    11             
    12         mov si, 0
    13         mov cx, 8 
    14 s:      mov al, a[si]
    15         mov ah, 0
    16         add b, ax
    17         inc si
    18         loop s
    19             
    20         mov ax,4c00h
    21         int 21h
    22 code ends
    23 end start              

     

    注意:在数据段中使用数据标号,需要:使用assume将数据段和ds进行关联(这样只是将默认所访问单元的段地址都在ds中,而不是cs中);将ds指定为data段的段地址。

    现在:mov al, a[si] <==> mov al, ds:[0][si]

            mov b, ax <==> mov ds:[8], ax

   

直接定址表

  1. 辅助知识:标号即是地址
    
     1 data segment
     2     a db 1,2,3,4,5,6,7,8
     3     b dw 0
     4     c dw a, b ;<==> c dw offset a, offset b
     5 data ends
     6     
     7 data segment
     8     a db 1,2,3,4,5,6,7,8
     9     b dw 0
    10     c dd a, b ;<==> c dw offset a, seg a, offset b, seg b
    11 data ends     
  2. 直接定制表

    (1). 入门题目:编写子程序,以十六进制的形式在屏幕中间显示给定的字节型数据。如11111111显示为FF

    
     1         ; 用al传送要显示的数据
     2         showbyte:   jmp short show
     3                     table db '0123456789ABCDEF'      ; 字符表
     4         show:        
     5                     push bx
     6                     push es
     7                     
     8                     mov ah, al
     9                     shr ah, 1
    10                     shr ah, 1
    11                     shr ah, 1
    12                     shr ah, 1                        ; ah-高4位
    13                     and al, 00001111b                ; al-第4位
    14                     
    15                     mov bl, ah
    16                     mov bh, 0
    17                     mov ah, table[bx]                ; 高4位对应的字符
    18                     
    19                     mov bx, 0b8000h
    20                     mov es, bx
    21                     mov es:[160*12+40*2], ah
    22                     
    23                     mov bl, al
    24                     mov bh, 0
    25                     mov ah, table[bx]                ; 低4位对应的字符
    26                     
    27                     mov es:[160*12+40*2+2], al
    28                     
    29                     push es
    30                     push bx
    31                     
    32                     ret  

    可以看出,直接定址表的好处:*算法更加清晰和简介;加快运算速度;程序更易扩展。

    (2). 进阶题目:showsin

    
     1         showsin:
     2                     jmp short show
     3                     ; 字符串偏移地址表
     4                     table dw ag0, ag30, ag60, ag90, ag120, ag150, ag180    
     5                     ag0     db '0', 0
     6                     ag30     db '0.5', 0
     7                     ag60    db '0.866', 0
     8                     ag90    db '1', 0
     9                     ag120    db '0.866', 0
    10                     ag150    db '0.5', 0
    11                     ag180    db '0', 0
    12                     
    13         show:        
    14                     push bx
    15                     push es
    16                     push si
    17                     
    18                     mov bx, 0b800h
    19                     mov es, bx
    20                     
    21                     ; 以下用角度值/30作为相对于table的偏移,取得对应的字符串的偏移地址
    22                     mov ah, 0
    23                     mov bl, 30
    24                     div bl
    25                     mov bl, al
    26                     mov bh, 0
    27                     add bx, bx
    28                     mov bx, table[bx]
    29                     
    30                     ; 显示字符串
    31                     mov si, 160*12+40*2
    32         shows:      mov ah, cs:[bx]
    33                     cmp ah, 0
    34                     je showret
    35                     mov es:[si], ah
    36                     inc bx
    37                     add si, 2
    38                     jmp short shows
    39                     
    40         showret:    pop si
    41                     pop es
    42                     pop bx
    43 
    44 ret  

    (3). 编写子程序:类似于dll的方式。<微软的处理 方式>

     

    
      1         ; 入口参数说明:
      2         ; (1).用ah寄存器传递功能号:0表示清屏, 1表示设置前景色,2表示设置背景色,3表示向上滚动一行
      3         ; (2).对于2、3号功能,用al传递颜色值,(al)属于{0,1,2,3,4,5,6,7}
      4         
      5         ; -------------------------------  类似于dll  -------------------------------
      6         setscreen:  jmp short set
      7                     table dw sub1, sub2, sub3, sub4, sub5
      8         set:        push bx
      9                     
     10                     cmp ah, 4
     11                     ja sret
     12                     
     13                     mov bl, ah
     14                     mov bh, 0
     15                     add bx, bx
     16                     
     17                     call word ptr table[bx]        ; 调用对应的功能子程序
     18                     
     19         sret:       pop bx
     20                     ret
     21         
     22         ; --------------------------------  子程序  --------------------------------
     23         ; 功能子程序: 清屏
     24         sub1:
     25                     push bx
     26                     push cx
     27                     push es
     28                     mov bx, 0b800h
     29                     mov es, bx
     30                     mov bx, 0
     31                     mov cx, 2000
     32         sub1s:      mov byte ptr es:[bx], ' '
     33                     add bx, 2
     34                     loop sub1s
     35                     pop es
     36                     pop cx
     37                     pop bx
     38                     ret
     39                     
     40         ; 功能子程序: 设置前景色
     41         sub2:
     42                     push bx
     43                     push cx
     44                     push es
     45                     mov bx, 0b800h
     46                     mov es, bx
     47                     mov bx, 0
     48                     mov cx, 2000
     49         sub2s:      and byte ptr es:[bx], 11111000b
     50                     or es:[bx], al
     51                     add bx, 2
     52                     loop sub2s
     53                     
     54                     pop es
     55                     pop cx
     56                     pop bx
     57                     ret
     58         
     59         ; 功能子程序: 设置背景色            
     60         sub3:
     61                     push bx
     62                     push cx
     63                     push es
     64                     
     65                     mov cl, 4
     66                     shl al, cl
     67                     mov bx, 0b800h
     68                     mov es, bx
     69                     mov bx, 1
     70                     mov cx, 2000
     71         sub3s:      and byte ptr es:[bx], 10001111b
     72                     or es:[bx], al
     73                     add bx, 2
     74                     loop sub3s
     75                     
     76                     push es
     77                     push cx
     78                     push bx
     79                     ret
     80         
     81         ; 功能子程序: 向上滚动一行
     82         sub4:
     83                     push cx
     84                     push si
     85                     push di
     86                     push es
     87                     push ds
     88                     
     89                     mov si, 0b800h
     90                     mov es, si
     91                     mov ds, si
     92                     mov si, 160
     93                     mov di, 0
     94                     
     95                     cld
     96                     mov cx, 24
     97                     
     98         sub4s:      push cx
     99                     mov cx, 160
    100                     rep movsb
    101                     pop cx
    102                     loop sub4s
    103                     
    104                     ; 清空最后一行
    105                     mov si, 0
    106                     mov cx, 80
    107         sub4s1:     mov byte ptr [160*24+si], ' '
    108                     add si, 2
    109                     loop sub4s1
    110                     
    111                     pop ds
    112                     pop es
    113                     pop di
    114                     pop si
    115                     pop cx
    116                     ret
    117         
    118         ; 功能子程序: 向下滚动一行
    119         sub5:
    120                     mov si, 0b800h
    121                     mov es, si
    122                     mov ds, si
    123                     mov si, 0
    124                     mov di, 160
    125                     
    126                     cld
    127                     mov cx, 24
    128                     
    129         sub5s:      push cx
    130                     mov cx, 160
    131                     rep movsb
    132                     pop cx
    133                     loop sub5s
    134                     
    135                     ; 清空第一行
    136                     mov si, 0
    137                     mov cx, 80
    138         sub5s1:     mov byte ptr [si], ' '
    139                     add si, 2
    140                     loop sub5s1  
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

汇编中的标号概念 的相关文章

  • 【分析】浅谈C#中Control的Invoke与BeginInvoke在主副线程中的执行顺序和区别(SamWang)

    今天无意中看到有关Invoke和BeginInvoke的一些资料 xff0c 不太清楚它们之间的区别 所以花了点时间研究了下 据msdn中介绍 xff0c 它们最大的区别就是BeginInvoke属于异步执行的 Control Invoke
  • C#中Invoke 和 BeginInvoke的涵义和区别

    BeginInvoke 方法真的是新开一个线程进行异步调用吗 xff1f 参考以下代码 xff1a public delegate void treeinvoke private void UpdateTreeView MessageBox
  • C# 理解lock

    一 为什么要lock xff0c lock了什么 xff1f 当我们使用 线程 的时候 xff0c 效率最高的方式当然是 异步 xff0c 即各个线程同时运行 xff0c 其间不相互依赖和等待 但当不同的线程都需要访问某个资源的时候 xff
  • excel操作的几种方法

    using System using System Collections Generic using System Text using System Data using System Windows Forms using Syste
  • c#中如何实现拷贝对象

    大家都知道 xff0c 在C 中变量的存储分为值类型和引用类型两种 xff0c 而值类型和引用类型在数值变化是产生的后果是不一样的 xff0c 值类型我们可以轻松实现数值的拷贝 xff0c 那么引用类型呢 xff0c 在对象拷贝上存在着一定
  • 深入了解Windows句柄到底是什么

    总是有新入门的Windows程序员问我Windows的句柄到底是什么 xff0c 我说你把它看做一种类似指针的标识就行了 xff0c 但是显然这一答案不能让他们满意 xff0c 然后我说去问问度娘吧 xff0c 他们说不行网上的说法太多还难
  • 句柄概念

    句柄 xff08 handle xff09 xff0c 有多种意义 xff0c 其中第一种是指程序设计 xff0c 第二种是指Windows编程 现在大部分都是指程序设计 程序开发这类 第一种解释 xff1a 句柄是一种特殊的 智能指针 当
  • 腾讯云大数据发布最新产品矩阵,助力企业整合打通海量数据

    9月11日 xff0c 主题为 释放数字经济发展的新动能 的腾讯全球数字生态大会大数据专场在线上拉开帷幕 腾讯大数据领域的多位顶级专家 xff0c 与包括 Hadoop 创始人 Doug Cutting 在内的业内顶级大咖 xff0c 以及
  • C/C++中函数参数传递

    看了内存管理的有关内容 xff0c 有一点了解 xff0c 但不是很深入 xff0c 发现之前写代码时有很多细节问题没有注意到 xff0c 只知道这样做可以实现功能 xff0c 却不知道为什么可以这样 xff0c 对于采用自己的方法造成的隐
  • Windows窗口刷新机制详解

    1 Windows的窗口刷新管理 窗口句柄 xff08 HWND xff09 都是由操作系统内核管理的 xff0c 系统内部有一个z order序列 xff0c 记录着当前窗口从屏幕底部 xff08 假象的从屏幕到眼睛的方向 xff09 x
  • C语言中内存分布及程序运行中(BSS段、数据段、代码段、堆栈)

    BSS段 xff08 bss segment xff09 通常是指用来存放程序中 未初始化 的 全局变量 的一块内存区域 BSS是英文Block Started by Symbol的简称 BSS段属于静态内存分配 数据段 xff1a 数据段
  • C# 窗体Show和ShowDialog 方法的区别详解

    CenterParent 窗体在其父窗体中居中 CenterScreen 窗体在当前显示窗口中居中 xff0c 其尺寸在窗体大小中指定 Manual 窗体的位置由 Location 属性确定 WindowsDefaultBounds 窗体定
  • c# 窗口句柄问题 。

    1 如何获得一个窗口的句柄 xff1f 例如获取窗口PictureBox控件 xff08 其他控件也可以 xff09 的句柄 xff0c csharp view plain copy IntPtr handle 61 pictureBox
  • c#中已知一个外部窗口的句柄,怎么关闭

    已知一个外部窗口的句柄 xff0c 怎么关闭它 怎么给这个窗口的一个文本框设置内容 public void Test Handle windowhandle string TextBoxName System windws froms fr
  • 数组内存分配概念

    在这里解答一下 xff1a int arr 4 amp arr 1 61 arr 0 43 sizeof int 静态分配 xff0c 即普通数组 xff0c 由于在栈中分配 xff0c 而栈的生成方向是自高地址向低地址生成 所以有 xff
  • 静态数组和动态数组 内存分布

    数组是程序设计中是一个非常重要的概念 数组是一个用于收集大量类似数据的容器 xff0c 以及其每一个元素能被相同处理过程迭代来处理的一个抽象体 创建数组一般有三种方式 xff1a 全局 静态范围的数组 xff0c 局部变量数组 xff0c
  • C语言 内存分配 地址 指针 数组 参数 解析

    指针简介 指针式保存变量地址 的变量 增加阅读难度 指针 和 goto 语句会增加程序的理解难度 容易出现错误 ANSI C American National Standards Institute 美国国家标准学会 即标准C 通用指针类
  • C++数组与指针概念

    指向数组元素的指针 一个变量有地址 xff0c 一个数组包含若干元素 xff0c 每个数组元素都在内存中占用存储单元 xff0c 它们都有相应的地址 指针变量既然可以指向变量 xff0c 当然也可以指向数组元素 xff08 把某一元素的地址
  • [代码实例][C]Linux实现线程池

    ThreadPool h span class token macro property span class token directive keyword ifndef span THREADPOOL H span span class

随机推荐

  • C语言中指针的初始化和赋值

    1 指针的初始化 指针初始化时 xff0c 61 的右操作数必须为内存中数据的地址 xff0c 不可以是变量 xff0c 也不可以直接用整型地址值 但是int p 61 0 除外 xff0c 该语句表示指针为空 此时 xff0c p只是表示
  • Aspose.Cells使用总结大全

    使用到 Aspose Cells 插件 xff0c 整理一下 一 xff1a 新建解决方案 xff0c 目录如下 目录说明 xff1a Program cs 入口类 ExcelGenerator cs Aspose Cells 操作类 As
  • C#图像处理基础概念知识

    图像是人类获取和交换信息的主要来源 xff0c 因此 xff0c 图像处理的应用领域必然涉及到人类生活和工作的方方面面 随着人类活动范围的不断扩大 xff0c 图像处理的应用领域也将随之不断扩大 xff08 1 xff09 航天和航空技术方
  • c#中字节数组byte[]、图片image、流stream,字符串string、内存流MemoryStream、文件file,之间的转换

    字节数组byte 与图片image之间的转化 字节数组转换成图片 span class hljs keyword style color 0088 public span span class hljs keyword style colo
  • C/C++ 文件操作之CreateFile、ReadFile和WriteFile

    1 CreateFile 这个函数的功能是创建或者打开一个文件或者I O设备 xff0c 通常使用的I O形式有文件 文件流 目录 物理磁盘 卷 终端流等 如执行成功 xff0c 则返回文件句柄 INVALID HANDLE VALUE 表
  • String到底是值类型还是引用类型(C#)

    MSDN 中明确指出 String 是引用类型而不是值类型 xff0c 但 String 表面上用起来却像是值类型 xff0c 这又是什么原因呢 xff1f 首先从下面这个例子入手 xff1a span class hljs comment
  • VS2013 MFC基于对话框编程(创建工程)

    一 新建MFC项目 选择 xff1a 基于对话框MFC的使用 xff1a 在共享DLL中使用MFC xff08 程序运行需要dll xff09 在静态库中使用MFC xff08 程序较大 xff0c 运行时不需要dll xff09 设置MF
  • MFC中画直线和曲线的几种方法

    一 画直线 要想在MFC中画出有颜色的线条 xff0c 首先就要设置DC的画笔 xff0c 我们可以按如下方法来设置画笔 xff1a 第一步 xff1a 在View类中添加一个COLORREF类型的数据成员m Color xff08 用来保
  • C++函数的传入参数是指针的指针(**)的详解

    要修改变量的值 xff0c 需要使用变量类型的指针作为参数或者变量的引用 如果变量是一般类型的变量 xff0c 例如int xff0c 则需要使用int 类型的指针类型int 作为参数或者int的引用类型int amp 但是如果变量类型是指
  • 零基础学习WinCE开发

    在接触WinCE时候的基础 xff1a 软件语言基础 xff1a C C 43 43 C 我不是计算机专业的 xff0c 所以这些语言基础也是比较业余的 经验不丰富 xff0c 遇到问题就是查MSDN或者到网上查找相关解决方案即可 xff0
  • SD-WAN为什么备受欢迎?

    SD WAN即软件定义广域网 xff0c 通过集中控制器 xff0c 将广阔地理范围内的计算机 云服务 数据中心集中起来统一管理 比较多地用于企业组网场景 xff0c 那么为什SD WAN如此受欢迎呢 xff1f 近年来 xff0c 企业的
  • C#实现缩放和剪裁图片的方法示例

    C 实现缩放和剪裁图片的方法 分享给大家供大家参考 xff0c 具体如下 xff1a 1 2 3 4 5 6 7 8 9 10 11
  • 虚拟内存解疑

    虚拟内存别称 虚拟存储器 xff08 Virtual Memory xff09 电脑 中所运行的 程序均需经由 内存执行 xff0c 若执行的程序占用内存很大或很多 xff0c 则会导致内存消耗殆尽 为解决该问题 xff0c Windows
  • windows内存结构概述

    13 1 Windows的虚拟地址空间安排 13 1 1虚拟地址空间的分区 xff08 即虚拟地址空间布局 xff09 进程的地址空间划分 分区 x86 32位 Windows 3GB用户模式下的x86 32位Windows X64 64位
  • 变量名和内存地址及符号表

    1 变量名是给编译器看的 xff0c 编译器根据变量是局部还是全局分配内存地址或栈空间 xff0c 所谓的变量名在内存中不存在 xff0c 操作时转换成地址数存放在寄存器中了 其实可以理解为是符号表起到了连接作用 2 符号表 xff08 此
  • C/C++编译和链接过程详解 概述 (重定向表,导出符号表,未解决符号表)

    详解link 有 些人写C C 43 43 以下假定为C 43 43 程序 xff0c 对unresolved external link或者duplicated external simbol的错误信息不知所措 xff08 因为这样的错误
  • 编译器构造概述(详细)

    一 编译器简介 前面谈到静态链接器构造的基本流程 xff0c 最后提到所构造的链接器若要能正常工作的前提是需要构造一个能生成符合链接器输入文件格式的编译器 xff0c 本文构造一个符合这种具体格式要求编译器 但是编译器的直接编译的结果一般是
  • nm命令中符号类型详解

    nm命令介绍的很多 xff0c 但大多不介绍其函数符号标志的含义 最近在调试动态库时常用到 xff0c 其中用的最多的用法 nm A grep aaa c 43 43 filt A 为了显示文件 xff0c c 43 43 filt转换为可
  • 电脑怎样执行编程语言的?

    链接 xff1a https www zhihu com question 29227521 answer 154819061 来源 xff1a 知乎 著作权归作者所有 商业转载请联系作者获得授权 xff0c 非商业转载请注明出处 这个问题
  • 汇编中的标号概念

    地址标号和数据标号 地址标号 1 assume cs code 2 code segment 3 a db 1 2 3 4 5 6 7 8 4 b dw 0 5 start mov si offset a 6 mov bx offset b