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