Linux Intel 64bit Assembly Division

时间:2015-08-21 11:42:47

标签: linux assembly 64-bit intel division

我正在努力理解为什么我的部门不起作用,下面是我当前的代码,它只需要两位数,并试图将它们分开:

STDIN equ 0
SYS_READ equ 0

STDOUT equ 1
SYS_WRITE equ 1

segment .data
    num1 dq 0
    num2 dq 0
    quot dq 0
    rem dq 0

segment .text
    global _start
_start:
    mov rax, SYS_READ
    mov rdi, STDIN
    mov rsi, num1
    mov rdx, 2
    syscall

    mov rax, SYS_READ
    mov rdi, STDIN
    mov rsi, num2
    mov rdx, 2
    syscall

    mov rax, [num1]
    sub rax, '0'

    mov rbx, [num2]
    sub rbx, '0'

    xor rdx, rdx
    div rbx

    add rax, '0'

    mov [quot], rax
    mov [rem], rdx

    mov rax, SYS_WRITE
    mov rdi, STDOUT
    mov rsi, quot
    mov rdx, 1
    syscall

    mov rax, 60
    xor rdi, rdi
    syscall

据我所知,分割汇编程序时会将RDX:RAX除以操作数RBX。我只能假设这是问题的来源,我将128位值除以64位值这一事实。每当我输入8/2或类似的东西时,我会得到值1作为商。我在这里错过了什么?任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

你为操作数读取了2个字节,但是你不应该忽略第2个字节 假设您键入8和2以及每行一行,您将读取“8 \ n”和“2 \ n”。然后你减去'0',但你留下'\ n',所以你的操作数将是0x08 0x0A0x02 0x0A,分别是2568和2562.而2568/2562 = 1。