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

x86-64 AT&T汇编:缓冲区字节与整数异或操作报错求助

问题:字节异或操作的操作数不匹配错误解决

尝试将字节B写入文件,读取后与整数10执行XOR异或操作,再将结果写回文件,但出现操作数不匹配错误。试过将缓冲区的值移入寄存器、调换异或操作数顺序,但都无效。

原代码:

.section .bss

buffer: .skip 1

      .align 8
file: .quad 0


.data


B: .byte 0x42

.text
filename: .asciz "file.bmp"
mode: .asciz "w+"
myText: .asciz "C"
toInt: .asciz "%u"




.global main

main:
    pushq   %rbp            
    movq    %rsp, %rbp       

    movq $filename , %rdi      
    movq $mode , %rsi         
    call fopen        

    mov %rax, file 

    mov $B, %rdi 
    mov $1, %rsi 
    mov $1, %rdx 
    mov file, %rcx 
    call fwrite

    mov file, %rdi 
    mov $0, %rsi 
    mov $0, %rdx 
    call fseek 

    mov $buffer, %rdi 
    mov $1, %rsi 
    mov $1, %rdx 
    mov file, %rcx 
    call fread

    movq $10, %r10
    xor %r10, $buffer

    mov $buffer, %rdi 
    mov $0, %rsi 
    mov $0, %rdx 
    mov file, %rcx 
    call fwrite

    movq    %rbp, %rsp     
    popq    %rbp            
    movq    $0, %rdi        
    call    exit 

错误分析与修正方案

1. 异或指令的操作数错误

x86-64汇编中,xor指令不能直接用内存地址立即数和寄存器进行操作,且buffer是1字节大小的内存区域,应该使用8位寄存器(如%al)来处理单字节数据,而非64位寄存器%r10。

正确的操作流程是:

  • 将缓冲区的字节数据读取到8位寄存器
  • 与整数10(0xA)执行8位异或操作
  • 将结果写回缓冲区

2. 第二次fwrite的参数错误

原代码中第二次调用fwrite时,将每个元素大小(%rsi)和元素个数(%rdx)都设为0,导致不会写入任何数据,需要修正为与第一次fwrite一致的参数(1字节大小,1个元素)。

修正后的代码

.section .bss

buffer: .skip 1

      .align 8
file: .quad 0


.data


B: .byte 0x42

.text
filename: .asciz "file.bmp"
mode: .asciz "w+"
myText: .asciz "C"
toInt: .asciz "%u"




.global main

main:
    pushq   %rbp            
    movq    %rsp, %rbp       

    movq $filename , %rdi      
    movq $mode , %rsi         
    call fopen        

    mov %rax, file 

    mov $B, %rdi 
    mov $1, %rsi 
    mov $1, %rdx 
    mov file, %rcx 
    call fwrite

    mov file, %rdi 
    mov $0, %rsi 
    mov $0, %rdx 
    call fseek 

    mov $buffer, %rdi 
    mov $1, %rsi 
    mov $1, %rdx 
    mov file, %rcx 
    call fread

    # 修正异或操作:用8位寄存器处理单字节数据
    movb buffer, %al   # 读取缓冲区的1字节到al寄存器
    xorb $10, %al      # al与10执行8位异或
    movb %al, buffer   # 将结果写回缓冲区

    # 修正fwrite参数:设置正确的写入大小和数量
    mov $buffer, %rdi 
    mov $1, %rsi       # 每个元素1字节
    mov $1, %rdx       # 写入1个元素
    mov file, %rcx 
    call fwrite

    movq    %rbp, %rsp     
    popq    %rbp            
    movq    $0, %rdi        
    call    exit 

内容的提问来源于stack exchange,提问作者michael29

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 23:55:35