NASM中无法对标签地址执行移位与与运算的问题求助
解决汇编中提取标签地址高低字的报错问题
你遇到的错误是因为汇编器不允许直接对符号标签(如label)进行移位或位运算——这类符号在汇编阶段属于未绑定地址的标识符,并非标量(立即数、寄存器这类可直接运算的类型)。以下是针对不同汇编器的解决方法:
针对GNU汇编器(GAS)
GAS内置了专门提取地址高低位的宏,直接使用即可:
%lo(symbol):获取符号地址的低16位%hi(symbol):获取符号地址的高16位
示例代码(填充中断描述符表):
; 定义一个32位中断门 interrupt_gate: .word %lo(isr0) ; 中断处理函数地址的低16位 .word 0x08 ; 代码段选择子(根据你的GDT配置调整) .byte 0x00 ; 保留位 .byte 0x8E ; 门类型:32位中断门 .word %hi(isr0) ; 中断处理函数地址的高16位
如果需要通过寄存器拆分地址,也可以先把标签地址加载到32位寄存器再拆分:
movl $isr0, %eax ; 将isr0的32位地址加载到EAX movw %ax, %bx ; AX寄存器存的就是低16位 shrl $16, %eax ; EAX右移16位,得到高16位 movw %ax, %cx ; 高16位存入CX
针对NASM汇编器
NASM支持直接对符号进行位运算,调整语法后你的原始思路就能生效:
mov ax, isr0 & 0xFFFF ; 提取低16位 mov bx, isr0 >> 16 ; 提取高16位
也可以用NASM专属的LOW()/HIGH()宏,效果一致:
mov ax, LOW(isr0) mov bx, HIGH(isr0)
内容的提问来源于stack exchange,提问作者Egemen Yalın
相关产品推荐
相关产品推荐

