NASM .data段代码转GAS格式:正确性验证及符号前置引用问题
问题1:转换后的GAS代码存在一处错误,修正后可正常使用
错误点说明
你代码中.fill 88,8,0对应原始NASM的times 88 db 0逻辑错误:
- NASM的
times 88 db 0是填充88个长度为1字节的0,总填充长度88字节 - GAS的
.fill语法为.fill 重复次数, 单元素字节数, 填充值,你写的.fill 88,8,0会填充88个8字节的0,总长度704字节,和原始逻辑不符,需要改为.fill 88, 1, 0
其余转换逻辑均正确:
.word对应NASMdw、.byte对应db、.quad对应dq、.long对应dd的用法匹配- 新增
TssEnd标记配合.set计算TssLen的逻辑和原始NASM的TssLen: equ $-Tss完全等效
修正后的完整GAS代码
TssDesc: .word TssLen-1 .word 0 .byte 0 .byte 0x89 .byte 0 .byte 0 .quad 0 Tss: .long 0 .quad 0xffff800000190000 .fill 88,1,0 .long TssLen TssEnd: .set TssLen, TssEnd - Tss
问题2:.set定义前可以正常引用符号
GAS采用两趟汇编设计,只要符号在当前汇编单元内有最终的明确定义,即使引用语句写在.set指令之前也属于合法的前向引用,汇编器会在第二趟扫描时回填正确的数值。你代码中.word TssLen-1、.long TssLen两处前置引用都可以正常获取到TssLen的正确值,不会触发汇编错误。
内容的提问来源于stack exchange,提问作者JustOneMan
相关产品推荐
相关产品推荐

