NASM:MOV上的SegFault ECX
我正在尝试做一个非常简单的汇编程序运行,但是我似乎无论我做什么都会出现段错误。NASM:MOV上的SegFault ECX
这里是我的代码(应打印“A”在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段错误,但它似乎明显,我认为它应该工作。
我把它减少到几乎没有,它仍然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的组件和我使用的标签和\ n作为新行(和空格\ t所以它看起来并不太坏
我使用NASM,我在这里运行它。 https://www.tutorialspoint.com/compile_assembly_online.php
谢谢
如果你只是想打印出一套“一个的
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\[email protected]:~/asm$ ./yvon_001
我正在写一个brainf ** k编译器,我正在做一些测试 –
@SamuelYvon - 你之前在Reddit上发布过什么吗? – InfinitelyManic
不!我实际上最终使它的工作我稍后会发布更详细的答案,我有其他问题,但这将是另一个职位,如果我不知道它 –
最后@MichealPetch是对的,我需要在代码的最后添加一个EXIT系统调用。我试过的示例仍然执行SEGFAULT,因为我在注册表中移动指针而不是[指针]。
感谢您的意见和解答!
在您的简单示例中,您必须调用_EXIT_ syscall来离开程序。 –
我确实添加了一个EXIT系统调用,无效 –
我使用我的帖子中的链接进行编译和运行,我不确定什么确切的操作系统,但它是一个Linux机器。 –