You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 19:52:39