linux - 基本 assembly 计算器分配不起作用

标签 linux assembly 64-bit x86-64

我们需要对使用系统调用输入的单个数字进行加法、减法、乘法和除法。由于某种原因,我的添加是唯一有效的。我不明白为什么其余的不起作用。除了乘以 1 时有效的乘法之外,所有这些都没有输出。

我的减法代码:

segment .data
    one db 0
    two db 0
    diff db 0

segment .text
global _start

_start:
    mov rax, 0
    mov rdi, 0
    lea rsi, [one]
    mov rdx, 2
    syscall
    mov rbx, [one]
    sub rbx, 48
    mov rax, 0
    mov rdi, 0
    lea rsi, [two]
    mov rdx, 2
    syscall
    sub rbx, [two]
    mov [diff], rbx
    ;xor rbx, rbx
    mov rax, 1
    mov rdi, 1
    mov rdx, 1
    lea rsi, [diff]
    syscall
    mov rax, 60
    xor rdi, rdi
    syscall

我的乘法代码:

segment .data
one db 0
two db 0
multi db 0

segment .text
global _start

_start:
mov eax, 0
mov edi, 0
lea esi, [one]
mov edx, 2
syscall
;mov ebx, [one]
;sub ebx, '0'
mov eax, 0
mov edi, 0
lea rsi, [two]
mov edx, 2
syscall
mov eax, [one]
sub eax, '0'
;mov ecx, [two]
;sub ecx, '0'
mul dword [two]
mov [multi], eax 
xor edx, edx
mov eax, 1
mov edi, 1
mov edx, 1
lea esi, [multi]
syscall
mov eax, 60
xor edi, edi
syscall

和部门代码:

segment .data
one db 0
two db 0
qout db 0

segment .text
global _start

_start:
mov rax, 0
mov rdi, 0
lea rsi, [one]
mov rdx, 2
syscall
;mov rbx, [one]
;sub rbx, '0'
mov rax, 0
mov rdi, 0
lea rsi, [two]
mov edx, 2
syscall
mov eax, [one]
sub eax, '0'
mov edx, 0
mov ecx, two
;sub ecx, '0'
div ecx
mov [qout], [rax]
;xor rdx, rdx
mov rax, 1
mov rdi, 1
mov rdx, 1
lea rsi, [qout]
syscall
mov rax, 60
xor rdi, rdi
syscall

有人可以告诉我为什么这不起作用吗?

这是我补充的供引用:

segment .data
one db 0
two db 0
sum db 0

segment .text
global _start

_start:
mov eax, 0 ;read
mov edi, 0 ;file descriptor
lea esi, [one] ;write to one
mov edx, 2 ;size of input in bytes
syscall
mov ebx, [one]
sub ebx, '0' ;'convert' to int
mov eax, 0 ;again another input
mov edi, 0
lea rsi, [two]
mov edx, 2
syscall
add ebx, [two] ;add two to one
mov [sum], ebx ;move sum into [sum]
xor ebx, ebx ;clear the register
mov eax, 1 ;syscall write
mov edi, 1 ;file descriptor
mov edx, 1 ;output one byte
lea esi, [sum] ;output sum
syscall
mov eax, 60 ;syscall 60 is exit
xor edi, edi ;exit(0)
syscall

最佳答案

我找到了解决方案。在我的代码中,我从两个数字中减去了“0”,并且在操作之后我再次添加了“0”。对于分区,我做了 this question 的解决方案建议。

关于linux - 基本 assembly 计算器分配不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32198797/

相关文章:

php - AWS Elastic Beanstalk 更改挂载目录的权限

c - RTNL 是什么意思?

c - GCC 的 sqrt() 编译后如何工作?使用哪种root方法?牛顿-拉夫森?

linux - 在 i386 Debian 下编译 amd64

assembly - 如何使用重复的字节值填充 64 位寄存器

c++ - x64 架构与 x86 有何不同

linux - 在linux中安装英语词典

linux - Bash 脚本编写和比较 2 个目录 - 初学者

assembly - SFENCE 属于什么指令集?

c - SPARC 程序集参数中的 printf 格式说明符?