linux x64添加程序

linux x64添加程序,linux,assembly,x86-64,nasm,Linux,Assembly,X86 64,Nasm,我正在使用x64汇编制作一个加法程序,但它在运行时不显示值(使用nasm、elf64编译) 有人知道为什么不显示任何内容吗?以后使用printf而不是中断,会更好, 2.为什么放置numB1和numB2的值而不是它们的位置。 用法:mov-rax,numB1。 3.在64位nasm部件中,您使用: rdi、rsi、rbx、rcx等寄存器,用于输入中断值。 例如: mov rdi, 01 mov rsi, 00 syscall 不要使用int0x80!,为了提高可移植性,请使用syscall,此

我正在使用x64汇编制作一个加法程序,但它在运行时不显示值(使用nasm、elf64编译)


有人知道为什么不显示任何内容吗?以后使用printf而不是中断,会更好, 2.为什么放置numB1和numB2的值而不是它们的位置。 用法:mov-rax,numB1。 3.在64位nasm部件中,您使用:
rdi、rsi、rbx、rcx等寄存器,用于输入中断值。
例如:

mov rdi, 01
mov rsi, 00
syscall
  • 不要使用
    int0x80
    !,为了提高可移植性,请使用
    syscall
    ,此外
    int 0x80
    在我的系统上不起作用

  • 希望有帮助,如果我错了,请纠正我。

    看起来您想将“结果”打印到标准输出,并且您正在使用32位 系统调用值

    在64位linux中,write的系统调用是1,您可以这样写入stdout。。。att&t语法: 首先剥离%rax中的值,并在堆栈上逐字节推送它们,例如%rax 保存值0x7ffffff8:

    mov $0xa, %rbx        # divisor
    
    nibble:
    xor %rdx, %rdx        # will hold bytes values you need
    div %rbx, %rax
    push %rdx             # save remainder
    inc  %r8              # count digit, write seems to trash %rcx
    cmp  $0,  %rax        # done?
    jne  nibble           # no, get another digit
    
    #set up for write to stdout
    
    mov $1, %rax          # sys_call for write
    mov $1, %rdi          # write to stdout
    mov $result, %rsi     # addr. of value to print
    
    # now get values from stack, make ascii and write to stdout
    
    decimal:
    pop %rdx              # get digit off stack
    add $0x30, %dl        # make ascii printable
    movb %dl, result      # load addr. with value
    mov $1, %rdx          # print 1 byte
    syscall
    
    dec %r8
    jnz decimal           # go till %r8 is zero 
    
    您只需在数据部分中为数字设置一个1字节的数据保持器:

    .section .data
        result:
        .byte 0             # reserves 1 byte and inits to 0
    
    或未初始化的数据区域:

    .section .bss
        .lcomm result, 1    # reserves 1 byte 
    
    我相信有更好的方法可以做到这一点,但我应该给你一些想法


    获取64位系统调用列表,它们与32位调用相比发生了很大变化

    是的,在你指向rsi的地方没有文本。你不能在64位汇编中使用int80h。而是使用系统调用。有关一些示例,请参见。在调用write(2)之前,您还应该将您的四字转换为人类可读的形式(即ASCII)。如何将其转换为ASCII?我还将行:MOV RSI,[result]更改为MOV RSI,result。感谢您的建议,我将使用syscall,但程序仍然没有显示结果。
    .section .bss
        .lcomm result, 1    # reserves 1 byte