linux x64添加程序
我正在使用x64汇编制作一个加法程序,但它在运行时不显示值(使用nasm、elf64编译)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,此
有人知道为什么不显示任何内容吗?以后使用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