我目前正在玩x86 Assember,以提高我的低级编程技能.目前,我在32位保护模式下的寻址方案面临一些问题.
情况如下:
我有一个程序加载在0x7e0,它将CPU切换到保护模式并跳转到代码中的相应标签:
[...]
code to switch CPU in Protected Mode
[...]
jmp ProtectedMode
[...]
bits 32
ProtectedMode:
.halt:
hlt
jmp .halt
Run Code Online (Sandbox Code Playgroud)
到目前为止这个工作绝对正常."jmp ProtectedMode"在没有显式远跳的情况下工作以清除预取队列 - 因为该程序加载了偏移量0(开头的org 0) - 导致代码段指向正确的位置.
我现在的问题是,在"ProtectedMode"标签中我想跳转到另一个加载到0x8000的程序(我用内存转储检查了这个,加载函数确实正常工作,程序正确加载到0x8000) .
由于CPU现在处于ProtectedMode而不再是RealMode,因此寻址模式不同.ProtectedMode使用描述符选择器查找基址和描述符表中的限制,以添加给定的偏移量并检索物理地址(据我所知).因此,在进入ProtectedMode之前必须安装GDT.
我看起来如下:
%ifndef __GDT_INC_INCLUDED__
%define __GDT_INC_INCLUDED__
;*********************************
;* Global Descriptor Table (GDT) *
;*********************************
NULL_DESC:
dd 0 ; null descriptor
dd 0
CODE_DESC:
dw 0xFFFF ; limit low
dw 0 ; base low
db 0 ; base middle
db 10011010b ; access
db 11001111b ; granularity
db 0 …Run Code Online (Sandbox Code Playgroud) 我正在开发一个依赖 GCC 的atomic built-ins 的项目。在将项目移植到 Windows 时,我试图找到 GCC 原子的 Interlocked* 对应项。大多数操作实际上都可用,但我想念应用的操作__ATOMIC_CONSUME和__ATOMIC_ACQ_REL内存语义。由于 _*Barrier 内在函数已被弃用,Microsoft建议使用std::atomic(例如atomic_thread_fence)和类似的 C++11 标准。
我想知道:C 程序员应该做什么,我们如何在不使用 C++11 的情况下实现atomicswith__ATOMIC_CONSUME和__ATOMIC_ACQ_REL语义的可移植版本?
我正在处理C++中的循环依赖问题.
情况如下:
libA.so:
- Body.cpp
- Header.cpp
- DataObject.cpp
- DataObject::read(boost::asio::streambuf* data)
{
boost::asio::streambuf data;
....
body = (new DataConverter<Body>)->convert(&data);
header = (new DataConverter<Header>)->convert(&data);
}
libB.so:
- DataConverter.cpp
-> DataConverter<T>
-> T* DataConverter<T>::convert(boost::asio::streambuf* data)
libA.so <-> libB.so
Run Code Online (Sandbox Code Playgroud)
存在循环依赖性,因为libA使用来自libB的Converter-Class,而libB现在需要关于需要转换的libA的Object-Types - 因为DataConverter :: convert返回Body或Header对象.
我考虑用前向声明解决这个问题 - 但这对我来说似乎不是最干净的解决方案.总而言之,我的计划是提供可扩展的DataConverter解决方案.
你们有什么建议作为最佳做法?一个完全不同的设计也欢迎:)
最好,塞巴斯蒂安
assembly ×1
atomic ×1
c ×1
c++ ×1
extensible ×1
gcc ×1
interlocked ×1
templates ×1
windows ×1
x86 ×1