我试图制作一个非常简单的汇编程序,但无论我做什么,我似乎都会遇到段错误。
这是我的代码(应该在Linux机器上打印'
)section .data
buffer times 50 db 97
pointer db 0
section .text
global _start
_start:
mov ECX , pointer
mov EDX , [buffer + ECX]
mov EAX , 4
mov EBX , 1
mov ECX , EDX
mov EDX , 1
int 0x80
它会导致第一个MOV出现段错误,但我觉得它应该可行。
我把它减少到几乎没有,它仍然是段错误。
section .data
msg db "hello"
section .text
global _start
_start:
mov EAX,1
我成功地运行了这个:
section .text
global _start
_start:
mov ax, 0b
dec ax
sub ax, 11111111b
mov bx, 97
add ax, bx
mov [INVENTORY], ax ; put a in first inventory pos
mov eax, 4
mov ebx, 1
mov ecx, INVENTORY
mov edx, 1
int 0x80
mov ax, [INVENTORY]
add ax, 1
mov [INVENTORY + 1], ax ; put b in second inventory pos
mov [VAR], ax
mov eax, 4
mov ebx, 1
mov ecx, VAR
mov edx, 1
int 0x80
mov eax, 4
mov ebx, 1
mov ecx, '\n'
mov edx, 1
int 0x80
mov eax,1
int 0x80
_newline:
section .data
VAR DW 0
INVENTORY TIMES 8 DW 0
是否可能与我用于换行符或标签的符号有关?我从java生成程序集,我使用\ t作为标签,\ n \ n表示新行(和空格,所以它看起来不太糟糕。
我正在使用NASM并且我在这里运行它: https://www.tutorialspoint.com/compile_assembly_online.php
谢谢!
答案 0 :(得分:0)
如果你只是想打印一套'a'。
section .data
buffer times 50 db 97
len.buffer equ $-buffer
pointer db 0
section .text
global _start
_start:
; ssize_t write(int fd, const void *buf, size_t count);
; i386 ebx ecx edx esi edi ebp
mov EAX , 4 ; write syscall
mov EBX , 1 ; std out
lea ecx, [buffer] ; buffer
mov edx, len.buffer ; size
int 0x80
_exit:
mov eax, 1 ; exit syscall
int 0x80
输出:
./yvon_001
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\ndavid@ubuntuserver00A:~/asm$ ./yvon_001
答案 1 :(得分:0)
最后@MichealPetch是对的,我需要在代码末尾添加一个EXIT系统调用。我试过的样本仍然做了一个SEGFAULT,因为我在注册表中移动指针而不是[指针]。
感谢您的评论和解答!