如何修复汇编计算器代码中的 IMUL 和 DIV 错误?

问题描述 投票:0回答:1

我目前正在学习汇编语言并尝试编写一个简单的计算器程序。该程序应该从 stdin 读取两个数字和一个运算符(+、-、*、/),执行指定的操作,并打印结果。但是,我在代码中遇到了 IMUL 和 DIV 指令的一些问题。这是我到目前为止所拥有的

section .bss
    num1 resb 8         ; Buffer to store the first number (max 8 bytes)
    num2 resb 8         ; Buffer to store the second number (max 8 bytes)
    operator resb 1     ; Buffer to store the operator (1 byte)
    result resb 16      ; Buffer to store the result (max 16 bytes)

section .text
    global _start

_start:
    ; Read the first number
    mov rax, 0          ; syscall number (sys_read)
    mov rdi, 0          ; file descriptor (stdin)
    mov rsi, num1       ; buffer to store input
    mov rdx, 8          ; number of bytes to read (max 8 bytes)
    syscall             ; call kernel

    ; Read the operator
    mov rax, 0          ; syscall number (sys_read)
    mov rdi, 0          ; file descriptor (stdin)
    mov rsi, operator   ; buffer to store input
    mov rdx, 1          ; number of bytes to read (1 byte)
    syscall             ; call kernel

    ; Read the second number
    mov rax, 0          ; syscall number (sys_read)
    mov rdi, 0          ; file descriptor (stdin)
    mov rsi, num2       ; buffer to store input
    mov rdx, 8          ; number of bytes to read (max 8 bytes)
    syscall             ; call kernel

    ; Convert first number from ASCII to integer
    movzx eax, byte [num1]
    sub eax, '0'

    ; Convert second number from ASCII to integer
    movzx ebx, byte [num2]
    sub ebx, '0'

    ; Perform the specified operation
    mov cl, byte [operator]
    cmp cl, '+'
    je add_operation
    cmp cl, '-'
    je sub_operation
    cmp cl, '*'
    je mul_operation
    cmp cl, '/'
    je div_operation

add_operation:
    add eax, ebx
    jmp output

sub_operation:
    sub eax, ebx
    jmp output

mul_operation:
    imul eax, ebx
    jmp output

div_operation:
    xor edx, edx
    div ebx
    jmp output

output:
    add eax, '0'
    mov [result], al
    mov [result+1], 0 ; null terminator for safety
    mov rax, 1          ; syscall number (sys_write)
    mov rdi, 1          ; file descriptor (stdout)
    mov rsi, result     ; buffer to store output
    mov rdx, 2          ; number of bytes to write (result + null terminator)
    syscall             ; call kernel

    ; Exit
    mov rax, 60         ; syscall number (sys_exit)
    xor rdi, rdi        ; exit code 0
    syscall             ; call kernel

当我运行此代码时,出现以下错误:

main.asm:60: error: invalid combination of opcode and operands
main.asm:71: error: operation size not specified

我不知道如何解决这些问题。任何帮助将不胜感激!

assembly x86-64 nasm
1个回答
0
投票

指针/寄存器有两个信息字段

  • 它指向的内存地址
  • 存储类型的大小(通常为1,2,4,8字节)

这条线

 movzx eax, byte [num1]

(以及其他类似的行),因此将

eax
寄存器设置为
num
的地址,并读取字节,这使得
eax
ebx
有效地成为 8 位寄存器,而 x86-64 则不会不支持 8 位上的
IMUL

尝试

mov al, byte [num1]
sub al, '0'
mov eax,al

应该将地址转换为

dword
指针。

© www.soinside.com 2019 - 2024. All rights reserved.