汇编中的ASSUME的使用

assume 最典型的用法:是指明变量与段寄存器的联系,比如 assume ds:data,它是告诉编译器以后所有在data段中定义的变量寻址时,使用ds作为段地址,但是它不对程序作任何事,比如你必须自己对ds赋值,这也就是为什么dos下典型的汇编段如下:
.data
  ........
.code
  ........
  assume cs:code,ds:data
start: .......
  mov ax,data
  mov ds,ax
  ...
ends
end start

它也经常用来将寄存器当作结构体指针来用

ASSUME edx:ptr STRUCT ;将edx 定义为STRUCT指针变量
把STRUCT结构体的起始地址给edx
lea edx, STRUCT ;用 [edx].调用STRUCT的字段
ASSUME edx:nothing ;取消定义 这个时候edx 不是指针 [edx].不能调用字段了

实例: 参见《Windows PE权威指南》
BookStrore STRUCT
  Name db 8 dup(8);书库的名字
  Address dd ? ;书库所在地址
  Count dd ? ;书库中藏书量
BookStrore ENDS

name1 db "书库1",0
lib1 BookStrore <?>

move ebx ,lib1
assume ebx:ptr BookStrore;
invoke memcpy,[ebx].Name,add name1 (此处跟书上有略微不同)
mov eax,12345h
mov [ebx].Address ,eax;
mov eax, 2
mov [ebx].Count, eax
assume ebx:nothing

时间: 2024-10-18 04:23:01

汇编中的ASSUME的使用的相关文章

16位汇编中的伪指令

汇编中的伪指令(基于汇编编译器MASM讲解) 一丶什么是伪指令,以及作用 首先我们用汇编开发效率低,如何才能开发效率高,甚至开发速度比C语言或这个高级语言快 答案: 伪指令 什么是伪指令 伪指令是汇编编译器提供的,比如昨天我们写的汇编代码,假设调用一个Call我们每次都要手工处理 保存栈底,开辟就变量空间,保存寄存器环境....每次都要做,特别麻烦,所以编译器帮我们提供了伪指令,只要我们 按照汇编编译器的语法去写,那么这些汇编编译器则会自动帮我们补全 比如昨天的代码: ;调用开始,把参数压栈 m

64位汇编第二讲——64位汇编中局部变量使用及抬栈方法29171230

一.纯写64位汇编时局部变量处理和参数寄存器保存位置 纯写64位汇编和用VS2013写64位C代码生成的汇编会有一些格式上的区别,VS2013写64位C代码生成的汇编中是没用到栈基址寄存器rbp的,但是纯写汇编时只要申明了参数和使用了@LOCAL定义的局部变量,就会用到rbp.且看如下例子:1)用C写64位程序空函数生成的汇编代码, ;C代码 void FunTest2() { } ;汇编代码 000000013F753290 40 57 push rdi 000000013F753292 5F

汇编中Enter与Leave指令

Enter的作用相当==push ebp和mov ebp,esp 这后面两句大家很熟悉吧?函数开始一般都是这两句 Leave的作用相当==mov esp,ebp和pop ebp 而这后面这两句也很常见,函数调用完后一般的用到 以上的Enter和leave的作用分别函数开始和结束 Win32汇编中局部变量的使用方法可以解释一个很有趣的现象:在DOS汇编的时候,如果在子程序中的push指令和pop指令不配对,那么返回的时候ret指令从堆栈里得到的肯定是错误的返回地址,程序也就死掉了.但在Win32汇

汇编中的跳转指令

能修改CS以及IP的指令都是转移指令.它分为段内转移,段间转移. 段内转移:只修改IP的值 段间转移:同时修改CS以及IP的值 段内转移根据转移的距离远近分为:短转移,近转移 短转移:转移范围为-128 – 127 近转移:转移范围为-32768 –32767 根据转移情况又分为: 无条件转移指令 条件转移指令 循环指令 过程 中断 <1> jmp short xxx(行号) 这个是短转移指令,实现段内的转移,在翻译成机器码的时候,码内并没有目标地址,有的只是转移位移,这样做的好处就是防止目标

汇编中标号不加:的情况分析

对于汇编中标号不加:,如a db db a,b,c 等 标号都视为偏移地址,和转移指令地址的差不同,用标号时(除转移)就等于其偏移地址,安装时需要注意这个.

C语言extern引用AT&T汇编中的变量,任意转换类型

今天研究出了一个小问题,在C语言里引用汇编的变量,会是什么结果,汇编中的变量没有像C语言中int类型那样的类型约束,可以把数据当作任何类型处理,那么传到C语言中我们应该当作什么类型处理呢. 换句话说,在汇编里定义变量var,在C语言里引用,我们肯定要用extern声明var外部变量,那么extern后面接什么类型?难道是extern int var么?还是 extern short var 实例: 一. 汇编程序:(是的,就这么短小) .global var  #注意现在的汇编器不再要求被C语言

为什么X86汇编中的mov指令不支持内存到内存的寻址?

在X86汇编中,MOV [0012H], [0016H]这种指令是不允许的,至少得有一个操作数是寄存器.当然,这种问题在用高级语言的时候看不到,感觉好像基本上都是从内存到内存啊,为毛到了汇编就不行了???这个问题在stack overflow有个解释不错: The answer involves a fuller understanding of RAM. Simply stated, RAM can only be in two states, read mode or write mode.

汇编中基本的数据类型

1.字节(DB)define byte 一个字节有8位二进制组成,其最高位是第7位,最低位是第0位.在表示有符号数时,最高位就是符号位. 00001001    =9 10001011    = -11    有符号 =  139         无符号 通常情况下,存储器按字节编址,读写存储器的最小信息单位就是一个字节. Var_byte     db    10011101B Var_bytes    db    41H,42D,61H 那么一个字节8位最大的值为 11111111=256

汇编中,BP,SP有何区别?分别怎么使用?

bp寄存器,跟其它什么BX,AX一样的用法, SP是用在栈上的,配合SS使用,像SS:SP SS上放段地址,SP上放偏移地址. 寻址时,像[bp],相当于SS:[bp] 就是说它默认使用SS 像BX默认使用CS---------------------------------------------------ss栈段寄存器sp栈顶指针寄存器bp默认的栈寻址寄存器--------------------------------------------------- sp会随着带有堆栈操作的指令(