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
相关产品推荐
相关产品推荐

