Assembly 运行程序后获取NASM分段错误(堆芯转储)。我在下面附上的程序中有什么错误?
当我在fedora的终端上运行这个程序(其目的是从给定的大端格式以小端格式打印数字)时,我得到了这个东西。(END是我的程序名) [dell@localhostMAL]$nasm-f elf64 END.asm [dell@localhostMAL]$ld-s-o END.o [dell@localhost马尔]$/完 大端号码是:1020304050607080 小端数字:分段故障(堆芯转储)Assembly 运行程序后获取NASM分段错误(堆芯转储)。我在下面附上的程序中有什么错误?,assembly,segmentation-fault,nasm,coredump,Assembly,Segmentation Fault,Nasm,Coredump,当我在fedora的终端上运行这个程序(其目的是从给定的大端格式以小端格式打印数字)时,我得到了这个东西。(END是我的程序名) [dell@localhostMAL]$nasm-f elf64 END.asm [dell@localhostMAL]$ld-s-o END.o [dell@localhost马尔]$/完 大端号码是:1020304050607080 小端数字:分段故障(堆芯转储) 一定是什么问题?x86处理器是小端数,因此数字dq 1020304050607080H将以小端数布局
一定是什么问题?x86处理器是小端数,因此
数字dq 1020304050607080H
将以小端数布局为您提供1020304050607080H
。为什么要使用dq
而不是db
来处理字符数据?最后一行(inc rsi
)后面是什么?mov al,byte[rdx]
@rkhb,控件应该跳回标签“next”中的第6行,即打印数字,8@Michael,实际上我不太擅长汇编语言,所以这只是我自己写代码的一次尝试。我明白你说的关于dq,db的意思了。但并没有得到你们想在下一条评论中说的话,“不会是一个有效的地址”。我可以知道那里出了什么问题吗。
%macro print 2
mov ecx,%1
mov edx,%2
mov ebx,1
mov eax,4
int 80h
%endmacro
section .data
m dq "Big endian number is : 1020304050607080",10
l equ $-m
m1 dq "Little endian number : "
l1 equ $-m1
number dq 1020304050607080H
l2 equ $-number
cntr db 8
section .bss
digits resb 8
section .text
global _start
_start:
print m,l
print m1, l1
mov rbx,0 ;final zero
mov rax,[number]
mov rcx,8
mov rdi,100h
mov rsi, digits
mov cl, 8
next: shl rbx,8
mov rdx,00
div rdi
add rbx, rdx
jmp again
print digits, 8
dec rcx
jnz next
mov eax, 1
mov ebx, 0
int 80H
again : mov al, byte[rdx] ;get byte
and al, 0F0H ;mask lower nibble
shr al, 04H
cmp al, 0aH
jb add_30
add al, 37H
jmp store
add_30 : add al, 30H
store : mov [rsi], al
inc rsi
mov al, byte[rdx]
and al, 0FH
cmp al, 0aH
jb add_30h1
add al, 37H
jmp store1
add_30h1 : add al, 30H
store1 : mov [rsi], al
inc rsi