我正在尝试运行一个非常简单的汇编程序,但是我似乎都会得到segfaults。
这是我的代码(应该在Linux计算机上打印'a'(
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上引起了Segfault,但对我来说似乎应该起作用。
我将其减少到几乎一无所有,但仍然是segfault。
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则用于新行(以及空格,看起来还不错。
我正在使用NASM,并且正在这里运行:https://www.tutorialspoint.com/compile_assembly_online.php
谢谢!
如果您只是想打印一组'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
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaandavid@ubuntuserver00A:~/asm$ ./yvon_001
最终@michealpetch是正确的,我需要在代码末尾添加一个exit syscall。我尝试过的示例仍然进行了segfault,因为我是在注册表中移动指针而不是[指针]。
感谢您的评论和答案!