X86 Assemble指令--offset

offset的作用

offset是一条伪指令,在编译的过程中,编译器会将该伪指令进行计算,并且替换成标号/变量的地址偏移量

基础知识

在数据段中,通过使用dbdwdd来定义该变量存放数据的大小。 db: define byte,定义一个字节 dw: define word,定义一个字,两个字节 dd: define double word,定义两个字,四个字节

而字符串最好使用db来定义,因为字符都是使用ASCII来定义的,而每一个字符都只占一个字节。而使用dw、dd来定义的话,由于X86是Little Endian排序,所以在内存中的字符的排序会错乱

dup伪指令定义了在编译时,会将dup定义的数据对连续长度的内存空间进行填充。

举例

data segment
//  定义长度为4*16=64个字节(长度为40H)的数组,并且以1进行填充
data1 db 40h dup(1)
// 定义从data2单元开始,连续存放5,6,8,100,共占4个字节地址,每一个单元占一个字节
data2 db 5,6,8,100
// 定义从data3单元开始,连续存放7,287,共占4个字节,每个单元占一个字(两个字节)
data3 dw 7,287
// 定义一个字符串,字符串中每一个字符都占一个字节
data_string db 'hello world'
data ends

以上定义了数据段,并且在数据段中有一个变量data1长度为64个字节的数组。

mov eax,offset data1;

上述汇编指令,在编译的时候会对offset伪指令进行解释。 假如data1的偏移量为0x400H,那么在编译器编译过后的二进制文件中,该指令就会变成:

mov eax,0x400H;

同样,offset伪指令对于代码段中的标号也是有同样的效果。

assume cs:codesg  
codesg segment  
start:mov ax,offset start  ;相当于mov ax,0  
    s:mov ax,offset s      ;相当于mov ax,3  
codesg ends  
end start 

在编译过后,上述指令就会变成

assume cs:codesg  
codesg segment  
start:mov ax,0; 
    s:mov ax,3;
codesg ends  
end start 

因为代码段的偏移量是从0开始的,并且mov ax,0指令占3个字节,所以标号s的偏移量就是3

注意

后续还需要测试一下当DS段的基址改变时,offset所编译出来的值是否有区别。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏AI研习社

最常见的 35 个 Python 面试题及答案(2018 版)

作为一个 Python 新手,你必须熟悉基础知识。在本文中我们将讨论一些 Python 面试的基础问题和高级问题以及答案,以帮助你完成面试。包括 Python ...

92030
来自专栏JavaEdge

青铜到王者 ,快速提升你 Go语言的段位! "狗"语言实战(二)- 基础语法1 变量定义

15140
来自专栏大闲人柴毛毛

稳扎稳打JavaScript(一)——作用域链内存模型

几个概念 在开始之前,先了解几个概念。 1.1. 作用域 作用域是指当前正在执行的代码能够访问到变量的范围; 每个函数都有各自的作用域,存储函数所有的局部变量...

48980
来自专栏空帆船w

Java 中 String 类为什么要设计成不可变的?

String 是 Java 中不可变的类,所以一旦被实例化就无法修改。不可变类的实例一旦创建,其成员变量的值就不能被修改。本文总结下 String 类设计成不可...

29450
来自专栏java学习

Java每日一练(2017/8/21)

每日一句 学的到东西的事情是锻炼,学不到的是磨练。 查看以前的所有练习题目以及答案:https://mp.weixin.qq.com/mp/homepage?_...

365160
来自专栏九彩拼盘的叨叨叨

JavaScript 字符串练习题

如果对字符串的 API 不是很熟悉,可查阅 W3School JavaScript String API。

9710
来自专栏技术栈大杂烩

Python: 作用域(scope) 和 LEGB

不管在什么编程语言, 都有作用域这个概念.作用域控制在它范围内代码的生存周期, 包括名字和实体的绑定.

12530
来自专栏PHP在线

PHP数组操作汇总

对于Web编程来说,最重要的就是存取和读写数据了。存储方式可能有很多种,可以是字符串、数组、文件的形式等。数组,可以说是PHP的数据应用中较重要的一种方式。PH...

33140
来自专栏吾爱乐享

java学习之数组元素排序,冒泡排序和选择排序

12640
来自专栏日常分享

Spring 学习笔记(七)—— 切入点表达式

  语法结构:   execution(   方法修饰符  方法返回值  方法所属类 匹配方法名 (  方法中的形参表 )  方法申明抛出的异常  )

6310

扫码关注云+社区

领取腾讯云代金券