linux x64附加程序

时间:2013-12-18 03:18:19

标签: linux assembly x86-64 nasm

我正在使用x64程序集创建一个附加程序,但它在运行时不显示值(使用nasm,elf64编译)。

section .text
global _start

_start:
mov rax, 0
add rax, [num1B]
add rax, [num2B]
mov [result], rax
mov rsi, [result]
;mov    rdx, 8  
mov rax, 4
mov rdi, 1
int 80h

mov rax, 1
mov rdi, 0
int 080h


section .data

num1B: dq 0Ah
num2B: dq 0Ah
result: dq 00h

有谁知道为什么这不显示任何内容

2 个答案:

答案 0 :(得分:0)

1.later使用printf而不是中断,更好, 2.为什么要输入numB1和numB2的值而不是它们的位置。 使用:mov rax,numB1。 3.在64位鼻子组装中你使用: rdi, rsi, rbx, rcx,...注册用于输入中断值。 例如:

mov rdi, 01
mov rsi, 00
syscall
  1. 请勿使用int0x80!,以便更方便地使用syscall以及int 0x80以外的系统无效。
  2. 希望它有所帮助,如果我错了,请纠正我。

答案 1 :(得分:0)

看起来你想打印'结果'到stdout你正在使用32位 系统调用值。

在64位linux中,对write的系统调用是1,你会像这样写入stdout ... att& t syntax: %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位调用中发生了很大变化。