我正在使用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
有谁知道为什么这不显示任何内容
答案 0 :(得分:0)
1.later使用printf而不是中断,更好,
2.为什么要输入numB1和numB2的值而不是它们的位置。
使用:mov rax,numB1。
3.在64位鼻子组装中你使用:
rdi, rsi, rbx, rcx,...
注册用于输入中断值。
例如:
mov rdi, 01
mov rsi, 00
syscall
int0x80
!,以便更方便地使用syscall
以及int 0x80
以外的系统无效。希望它有所帮助,如果我错了,请纠正我。
答案 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位调用中发生了很大变化。