64位模式下为何使用‘DS:’段前缀会非法?
解决MASM中"error A2202:illegal use of segment register"错误
这个错误我之前写64位Windows汇编时也碰到过,本质是MASM(微软宏汇编器)对段寄存器访问的语法有严格要求,不是编译器版本的问题,是写法不符合它的规范。
错误原因
你代码里的mov rax,qword ptr gs:[60]写法违反了MASM的语法规则:在MASM中,段寄存器前缀(比如gs:)必须直接放在内存操作数的最前面,不能和qword ptr这类类型说明符混在一起。而且要注意,64位环境下访问TEB(线程环境块)确实用gs寄存器,但语法顺序不对就会触发这个错误。
修正方案
把段寄存器前缀移到最前面,同时去掉代码里冗余的重复指令,调整后的代码如下:
; 用十六进制后缀h让地址表示更规范,同时修正段寄存器前缀的位置 mov rax, gs:qword ptr [60h] mov rcx, qword ptr [rax+20h] mov rbx, qword ptr [rcx+28h]
另外还要确认两个关键点:
- 你使用的是64位版本的MASM(
ml64.exe),因为32位Windows下访问TEB用的是fs寄存器,而非gs; - 编译时要指定64位目标,比如执行命令:
ml64 /c your_assembly_code.asm
这样修改后,编译器应该就不会再报这个错误了。
内容的提问来源于stack exchange,提问作者user6369603
相关产品推荐
相关产品推荐

