汇编中的ASSUME的使用

本文深入解析ASSUME指令在汇编语言中的应用,包括其在变量与段寄存器关联中的作用,以及如何将寄存器定义为结构体指针。通过实例展示了ASSUME在Windows PE文件结构中的使用,并解释了在WIN32环境下使用ASSUME fs:nothing的原因。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
assume fs:nothing这句话在WIN32汇编里是啥意思?
assume fs:nothing
mov eax,fs[0]

因为MASM编译器默认WINDOWS默认FS指向异常处理代码段,所以在程序中要使用FS寄存器就要用

assume fs:nothing

来声明,否则就会报错。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值