【发布时间】:2014-01-24 13:34:49
【问题描述】:
我试图弄清楚如何使用 Borland C++ 编译器在 8086 架构中获取和存储结构/类对象的地址。
尝试做类似的事情:
struct Data{
unsigned int a; // +0
unsigned int b; // +2
unsigned int c; // +4
unsigned int d; // +6
};
int main() {
Data* r = new Data();
unsigned int temp;
asm {
mov temp, bx
mov bx, r
mov bx[0], ax
mov bx[4], cx
mov bx[6], dx
}
r->b = temp;
// write registry values on screen and check with actual register values
}
现在我尝试了很多方法来制作:
mov bx, r
线路工作(使用 FP_OFF 和 FP_SEG)但没有成功。 Atm 我只是将寄存器值移动到临时变量中,然后将这些变量写入结构中,例如:
struct Data{
unsigned int a; // +0
unsigned int b; // +2
unsigned int c; // +4
unsigned int d; // +6
};
int main() {
Data* r = new Data();
unsigned int ta, tb, tc, td;
asm {
mov ta, ax
mov tb, bx
mov tc, cx
mov td, dx
}
r->a = ax;
r->b = bx;
r->c = cx;
r->d = dx;
// write registry values on screen and check with actual register values
}
但我想知道如何使用对象的地址来做这件事,这样我就可以减少使用的变量数量并减少代码混乱。
更新
我想我找到了正确的方法:
struct Data{
unsigned int a; // +0
unsigned int b; // +2
unsigned int c; // +4
unsigned int d; // +6
};
int main() {
Data* r = new Data();
unsigned int dataOff, dataSeg;
dataOff = FP_OFF(r);
dataSeg = FP_SEG(r);
asm {
push ds
push bx
mov bx, dataOff
mov ds, dataSeg
mov bx[0], ax
mov bx[4], cx
mov bx[6], dx
pop WORD PTR bx[2]
pop ds
}
// write registry values on screen and check with actual register values
}
我忘记更改 DS(数据段)寄存器以匹配对象内存位置的段值。 如果有人验证这是正确的方法,那就太好了。
【问题讨论】:
-
您使用的是哪种型号?
-
您可以将 TASM 用于装配部分。它具有强大的 STRUCT 定义,可以为您计算偏移量。
-
我正在使用 HUGE 内存模型。
-
在 c99 中,结构的地址是它的第一个成员的地址,如果有帮助的话:)
-
是的,我知道,我将偏移量放在结构成员旁边的 cmets 中。还是谢谢。
标签: c++ assembly cpu-registers x86-16