【问题标题】:Basic assembly calculator assignment not working基本装配计算器作业不起作用
【发布时间】:2015-08-25 08:12:27
【问题描述】:

我们需要对使用系统调用输入的单个数字进行加法、减法、乘法和除法。出于某种原因,我的添加是唯一有效的方法。我无法弄清楚为什么其余的不起作用。除了乘以 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

【问题讨论】:

  • 发布您的添加代码也可能会有所帮助。
  • 如果您需要其他人的帮助,请评论您的代码,并学习使用调试器,这样您就可以单步调试您的代码并修复您自己的错误。乍一看,这至少和this question有同样的问题。
  • 我会在那里尝试解决方案,我现在用 cmets 添加了我的添加
  • mov eax, [one] / mul dword [two] one 和 two 显然不是 DWORDs,因为您使用 db 0 声明了它们。
  • 哦,那我是用 byte 代替 db 吗?

标签: linux assembly 64-bit x86-64


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 2016-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多