32位汇编没有基址跟偏移地址的概念

基址与分段寻址—32位寄存器的变化 基址、分段寻址、段寄存器、32位寄存器到底有什么联系呢? 阅读详情
32位汇编没有基址跟 偏移地址 的概念
你没发现call后面是DWORD PTR吗?这说明什么?
这说明call能寻址所有4GB地址空间
楼下的那个回答更是扯谈
32位的PE文件根本就不能用debug调试
楼主给出的明显是32位汇编代码
别拿你的16位汇编过来了!


楼主我想告诉你的是32位汇编没有段地址 偏移地址的概念
如果真的要跟16位汇编联系起来
那么你可以这么认为所有段地址寄存器在程序中都是0(实际上 段寄存器 保存的是段描述符)
所有在程序中给出的地址都是32位偏移地址,也就是程序地址空间的 绝对地址
call dword ptr [408030];这条指令我估计你是在OD这些调试工具下面看到的


对于408030这个问题
如果不是API函数而是程序自身函数
一般在程序中是直接call 函数首地址的
但是对于API函数因为是在把程序运行的时候才装入内存的


编译的时候根本不知道函数会被装入内存的哪个地方
所以不能call 绝对地址 来寻址


InitCommonControls是comctl32.dll在程序运行的时候被加载到程序地址空间之后
API函数InitCommonControls所在的首地址


如果 源代码 使用类似:
MessageBox(NULL,"Hello","Hello",MB_OK)
那么得到的 反汇编 代码不是你这样的而是这样的:
call 0040101A
........
:0040101A jmp dword [00402008]指向MessageBox函数
为什么要用效率这么低的方式呢?
因为编译器无法区别输入函数的调用和普通函数的调用


这里的call 0040101A指令从实际源代码中来而并非来自输入表的 函数指针


接下去会call到一个jmp指令,jmp指令来自于为输入函数准备的输入库(lib)
所以call以后的代码 都不是你能控制的了,因为这由输入库决定了


你给出的那种调用方式
源代码中是这样定义函数的(这些都在头文件中,有兴趣自己去找下):
void __declspec(dllimport) InitCommonControls(void);
这样就会产生call dword ptr [408030]; 而不是call XXXXXXXX
此外编译器讲给函数加上_imp_前缀,然后送给 连接器 ,这样可以直接把_imp_XXX送给输入表这样就不要jmp指令了


对于你的问题
我自己先写一段:

#include<windows.h>
#include<commctrl.h>
#pragma comment(lib,"comctl32.lib")


//_declspec(dllimport) void InitCommonControls(void);
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int iCmdShow)
{
InitCommonControls();
MessageBox(NULL,"Hello","Hello",MB_OK);
return 0;
}




对initCommonControls函数的调用我得到的反汇编代码是call dword ptr ds:[42A1D0](不同操作系统,编译器编译出来地址不一样的)
由于这个函数怎么也不做编译器在编译的时候直接给出自己的代码mov eax,eax而并没有真正调用Windows API 所以你在PE文件中找不到这个函数
下面来说明MessageBox地址是怎么找到的:
在反汇编中 这个函数地址是

0042A320H


我们现在要知道的就是在exe没有被装入内存之前PE文件内部0042A320里面放的究竟是什么


先分析下 文件
由于建议装入地址是00400000
所以0042A320实际上处于相对 虚拟地址 (RVA)2A320处
正好处于idata节区内
因为2A000对应文件偏移28000
所以2A320对应文件便宜281D0
所以2A320对应文件便宜28320处
用WinHex查看文件28320结果是

0002A350这显然不会是MessageBox的内存地址
但是这也还是个RVA,处在idata中减去节首地址0002A000H是350H
相对节首28000H偏移350
查看文件偏移00028350H处发现过去两个字节就是MessageBox函数名了


有了函数名就能在内存中找到函数地址
有了函数地址就能调用了


楼主还有问题吗?看不懂的话仔细研究下PE文件的输入表和仔细分析下lib库文件就懂了
汇编学习笔记3 操作数的寻址方式 微机系统有八种基本的寻址方式 (1)立即数寻址方式 操作数地址/变量内存地址 (2)寄存器寻址方式 寄存器 (3)直接寻址方式 [偏移地址] (4)寄存器间接寻址方式 [基址寄存器/变址寄存器] (5)寄存器相对寻址方式 [基址寄存器/变址寄存器+偏移量值] (6)基址加变址寻址方式 [基址寄存器+变址寄存器] (7)相对基址加变址寻址... 阅读详情

相关推荐

masm32位汇编及指令集

介绍寄存器、内存寻址、堆栈、25个用列和win32汇编指令汇总

控制转移指令分类与机器码

引言 这篇文章从机器码的角度介绍32位汇编下控制转移类指令的分类。搞懂这些分类很重要,因为所有的基本块都是以控制转移指令结尾的,分清这些指令对应的机器码有助于我们对基本块进行修改和变形,从而实现对程序的修改。 总体描述 控制转移指令包括四大类指令: 函数调用指令(call) 函数返回指令(ret) 无条件转移指令(jmp) 条件转移(如jne) 学过汇编的知友应该...

741

ATE测试基础——直流参数测试

芯片测试在发展过程中诞生了许多术语,初次接触的人大部分都会被绕晕。因此为方便广大读者理解,在开始介绍测试项之前,需要对测试领域的名词进行解释。还有部分较为抽象的内容,需要略作展开。DUT——Device Under Test,正在被测试的器件Pin——器件引脚,信号引脚分为输入,输出,三态和双向四类,负责与外界进行信息交互;电源引脚分为电源和地两类,结构与信号引脚不同,负责给器件内部运行和外部输出提供电平。输入:在外部信号和器件内部逻辑之间起缓冲作用的信号输入通道;

你骄傲地飞远的博客 1万+

32位cpu寻址小结

 32位cpu 地址线扩展成了32位,这和数据线的宽度是一致的。因此,在32位机里其实并不需要采用“物理地址=段:偏移”这种地址表达方式。原来在16位机里规定的每一个段不大于64kb在32位机里也不是必要的。所以,对于32位机来讲,最简单的方法就是用一个32位数来标识一个字节的存储地址,寻址时只要给出一个32位数就可以直接找到地址。这种地址储存模型就属于“平展储存模型”。  但是,新产品一般都

zqf5816的专栏 2746

ES快速入门,一篇就懂!

Elastic Search 入门前言什么是搜索为什么常用数据库不适合做搜索什么是Lucene什么是Elastic SearchES核心概念ES使用正常启动索引​增删改查ES增加常见问题:ES删除ES查询欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的

qq1592的博客 9311

基于stm32平台上的IC-MU磁绝对值编码器SPI通讯和码盘数据处理

基于stm32平台上的IC-MU磁绝对值编码器SPI通讯和码盘数据处理

watch361的博客 1万+

【汇编语言】32位汇编总结

32位汇编语言总结

weixin_42659457的博客 3882

STM32 HAL库串口DMA接收不定长数据的两种实战方法:IDLE中断与超时管理详解

本文详细解析了STM32 HAL库中串口DMA接收不定长数据的两种实战方法:IDLE中断与超时管理。通过对比分析两种方案的硬件要求、响应速度和适用场景,为嵌入式开发者提供了高效可靠的串口通信解决方案,特别适用于智能家居、传感器网络等需要处理不定长数据包的应用场景。

weixin_30954265的博客 471

【汇编】32位汇编常用的指令

1、普通指令mov:传送字或字节add:加法sub:减法inc:加1 dec:减1and:与运算,都为1才为1or:或运算,都为0才为0xor:异或运算,多用于加密解密,相同为0不同为1not:按位取反,单目运算符(只有一个操作数)SAL:算术左移、SHL:逻辑左移SAR:算术右移、SHR:逻辑右移2、JMP指令3、MOVS指令4、STOS指令5、PUSH、POP指令6、REP指令7、CALL与RETN指令。

Innocence_0的博客 5628

Flink CDC 中 StartupOptions 模式详解

Flink CDC 的 StartupOptions 模式用于指定作业启动时从源数据读取数据的起始位置,不同的模式适用于不同的业务场景,可满足多样化的数据处理需求,主要有 Initial 模式、Earliest 模式、Latest 模式、SpecificOffset 模式和 Timestamp 模式。

RodJohnsonDoctor的专栏 849

【图像处理】德里奇( Deriche)边缘检测器

Deriche边缘检测,同canny算法齐名,因此,知道canny原理,也有必要知道德里奇的检测原理。本篇专门针对德里奇算法展开讨论。

gongdiwudu的专栏 8684

基地址和偏移地址的概念

首先必须明白 cpu和内存的区别: ·cpu是中央处理器,内存是物理数据存放的地方。cpu不直接存放数据而是通过内存来存放数据。 ·cpu和内存之间通过20条地址总线相连接,地址总线就是cpu通过地址找到对应的内存的物理数据的传递工具。 ·计算机只能处理0,1 二进制数据,每一条线可以处...

ciddk2085的博客 6630

计算机组成原理(第三版)唐朔飞-第五章输入输出系统-课后习题

计算机组成原理(第三版)唐朔飞-第五章输入输出系统-课后习题

weixin_45735391的博客 6万+

汇编地址与偏移地址

代码经过编译之后的文件内容,即代码对应的汇编地址如下: ;汇编地址 机器码 源程序代码 00000000 B800B8 mov ax,0xb800 00000003 8EC0 mov es,ax ;注释不编译 对应的汇编地址与偏移地址的关系如下图: 将该段程序加载到物理地址0x60000处,能看到汇编地址与偏移地址是一致的。 但若是使用vstart的话会改变之后的汇编地址,之后进行补...

MJ_Lee的博客 4319

离散小波变换(概念与应用)

离散小波变换(概念与应用)

weixin_46713695的博客 4415

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

基地址和偏移地址

首先必须明白 cpu和内存的区别 cpu 中央处理器 内存是物理数据存放的地方 cpu不直接存放数据而是通过内存来存放数据 cpu和内存之间通过20条地址总线相连接,地址总线就是cpu通过地址找到对应的内存的物理数据的传递工具 计算机只能处理0,1 二进制数据 每一条线可以处理 0,1 两种类型数据 所以20根线的 总共能拥有 2^20=1048576个不相同的地址 也就是能搜索 1048576个地址范围内的内存 那么 一个地址代表一个存储单元 一个存储单元能够存储 1byte数据 那么也就

u010783226的专栏 9617

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

汇编语言中的偏移地址:深入理解内存寻址的核心概念

偏移地址,也称为有效地址(Effective Address, EA),是指某个内存单元相对于其所在段基地址的偏移量。简单来说,它表示从一个段的起始位置开始,到目标数据位置之间的距离。单位:通常以字节为单位。表示形式:十六进制数(如0x100200h例如,如果一个数据位于段基地址0x1000的0x50字节处,那么它的偏移地址就是0x50。偏移地址是汇编语言中连接程序逻辑与物理内存的桥梁。无论你是想深入理解操作系统原理、编写高效嵌入式代码,还是从事逆向工程与安全研究,掌握偏移地址的概念都是必不可少的。

吾为热爱计科,致力于知识分享的践行者,此博客是我在这条道路上留下的足迹。 1617

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

汇编:LEA(取偏移地址)、LES

Table of Contents LEA LES LEA LEA是微机8086/8088系列的一条指令,取自英语Load effect address——取有效地址,也就是取偏移地址。在微机8086/8088中有20位物理地址,由16位段基址向左偏移4位再与偏移地址之和得到。    取偏移地址指令   指令格式如下:   LEA reg16, mem   lea reg16, m...

RToax 1万+

关于数组的建立与访问(16位汇编)

title: 关于数组的建立与访问(16位汇编) data: 2021-04-01 11:17:30 author: Jamal photo: https://cdn.pixabay.com/photo/2021/03/22/19/42/beach-6115569_960_720.jpg Assembly_Language Review1(array) 16位汇编与32位汇编的区别 1. 宽度的区别 16位汇编是在dos环境下的汇编语言。 32位汇编是在windows或linux环境下的汇编语言。 .

ultramanWJM的博客 3995

计算机基地址和偏移地址概念

计算机基地址和偏移地址概念简介

m0_61703043的博客 3488

32位汇编ebp、ebp-4、ebp+4、ebp+8等含义

ebp-4: 从ebp-4开始到函数提升堆栈后的栈顶之间被称为缓冲区(一般缓冲区栈顶是:函数调用时提升堆栈后esp的值),我们常说的局部变量都是定义在这里,所以大致可以理解为函数中。我们知道,当调用了一个函数后,底层汇编大多数会使用ebp寻址的方式去查找参数,关于ebp与esp寻址可以看我这篇文章《ebp寻址》。的含义,先总结这么多,因为长时间不使用汇编可能会忘了这些东西,忘了的话翻到这篇文章看看就行了。ebp+4:存放call指令调用函数时压入堆栈的。ebp+C: 存放函数传参的第二个参数地址。

qq_52572621的博客 6654

指出 寻址方式,并计算 物理地址(汇编练习题)

题目:请指出下列指令的源操作数的寻址方式,并计算物理地址. 设(DS)=2000H, (ES)=2100H, (SI)=00A0H, (SS)=1500H, (BX)=0100H, (BP)=0100H, 数据变量WAL的偏移地址为0050H, 1.MOV AX,[100H] ;直接寻址 2000H*10H+100H=20100H 2.MOV AX,[BX] ;寄存器间接寻址 2000H*10H+0100H=20100H 3.MOV AX,ES:[BX];寄存器间接寻址 ES*10H+BX=2100H*

诚邀网络通信领域商务合作 1万+

16位和32位代码段

在对ix86编程时,有时候需要从实模式变换到保护模式(如在DOS时代要访问扩展内存,或者编写引导代码,当然,如果在32位的操作系统下面编程,是碰不到这个问题的),总是要涉及16位代码段和32位代码之间的跳转问题。因此有必要对他们进行区分。 16位代码段和32位代码段的主要区别是,在16位代码段中,跳转目标的偏移用16位表示,而在32位代码段中,跳转目标的偏移用32位表示。 在实模式下,CPU总

nodeathphoenix的专栏 5666

32位汇编:实验3寻址方式

将上述汇编程序并保存为 test3.asm,使用 ML 和 Link 进行汇编和链接,生成可执行文件。

平芜尽处是春山 429
上一篇: call
下一篇: 透过汇编另眼看世界之DLL导出函数调用
linuxheik
博客等级 码龄15年 865粉丝 135原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值