【问题标题】:How to add two variables in NASM?如何在 NASM 中添加两个变量?
【发布时间】:2021-03-31 10:51:29
【问题描述】:

这是我的代码,它接受两个变量并将它们相加并减去它们。然后,它打印输出。为了简单起见,我删除了一些函数:

_start:

    call _printfirstmsg
    call _getvar1
    call _printsecondmsg
    call _getvar2
    call _addvar1var2
    call _printsum
    call _subvar1var2
    call _printdiff
    call _dispvar1
    call _dispvar2
    
    mov rax, 60
    mov rdi, 0
    syscall
    
_printsum:
    mov rax, 1
    mov rdi, 1
    mov rsi,addi
    mov rdx, 4
    syscall
    
    ret
    
    
 _printdiff:
    mov rax, 1
    mov rdi, 1
    mov rsi,subt
    mov rdx, 4
    
    
    syscall
    ret
    


_addvar1var2:
   mov rax, [var1]
   add rax, [var2]
   mov [addi], rax
   syscall
   ret

 
_subvar1var2:
  mov rbx, [var1]
  sub rbx, [var2]
  mov [subt], rbx
  syscall
  ret
  

当我运行该函数时,它没有返回_printsum_printdiff 的值,而是显示一些未知字符作为输出。请告诉我我错在哪里。

【问题讨论】:

    标签: assembly x86-64 cpu-registers


    【解决方案1】:
    _addvar1var2:
      mov rax, [var1]
      add rax, [var2]
      mov [addi], rax
      syscall
      ret
    

    您认为syscall 在此附加代码中的作用是什么? RAX 是这两个数字的总和,而不是函数号。减法代码中的类似问题。

    ...它显示一些未知字符作为输出

    您的 addisubt 变量包含数字。在使用需要字符的函数输出它们之前,您必须先将它们转换为文本字符。

    了解one way how to display a number
    请阅读该问题下方的 cmets,以便更正代码。

    【讨论】:

    • 我想结束这个函数并返回开始。
    • 我不应该使用系统调用吗?
    • 在那个地方毫无意义。这是一个子程序,所以只需使用 ret 从它返回。
    • 我试过了,还是一样的输出
    • 数字需要转换成文本。
    猜你喜欢
    • 2014-11-17
    • 1970-01-01
    • 1970-01-01
    • 2015-05-03
    • 1970-01-01
    • 2013-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多