AT&T 装配打印到控制台 Segfault



下面是一个在线教程,它提供了用NASM语法编写的代码。提供的代码是:

global _start
_start:
sub esp, 4
mov [esp], byte 'H'
mov [esp+1], byte 'e'
mov [esp+2], byte 'y'
mov [esp+3], byte '!'
mov eax, 4    ; sys_write system call
mov ebx, 1    ; stdout file descriptor
mov ecx, esp  ; pointer to bytes to write
mov edx, 4    ; number of bytes to write
int 0x80      ; perform system call
mov eax, 1    ; sys_exit system call
mov ebx, 0    ; exit status is 0
int 0x80

我试着把这个翻译成AT&T语法。我写了以下内容:

.global _start
_start:
sub $4, %esp
movb $'H', (%esp)
movb $'e', 1(%esp)
movb $'y', 2(%esp)
movb $'!', 3(%esp)
mov $4, %eax
mov $1, %ebx
mov %esp, %ecx
mov $4, %edx
int $0x80
mov $1, %eax
mov $0, %ebx
int $0x80

然而,当我编译并执行这些代码时,我得到:

./build.sh: line 35: 1159 Segmentation fault    (core dumped) ./$FILE
139

是我从NASM翻译成AT&T正确吗?如果是这样的话,在能够从为堆栈分配的内存中读取/写入方面,我是否缺少了一些东西?(权限等(


构建信息:

基于64位系统的Arch Linux构建

build.sh脚本:

function usage { 
echo $'nUsage: ./build.sh -f [filename]n'
echo $' -f  The filename of the source file to be compiled without the file extension.n'
}
if [ $# -lt 1 ]; then
echo "No input files specified!"
usage
exit 1
fi
while [ $# -gt 0 ]; do
case "$1" in
-f)
shift
FILE=$1
shift
;;
*)
echo "Please use -f to specify the input file!"
usage
exit 1
;;
esac
done
if [ ! -f $FILE.s ]; then
echo "$FILE.s doesn't exist!"
usage
exit 1
fi
gcc -c $FILE.s -o $FILE.o
ld $FILE.o -o $FILE
./$FILE
echo $?

虽然int 0x80是32位中断,但您将其编译为64位代码。我以前编译的东西:

CCD_ 2。

as --32 inAssembly.s使gnu汇编程序采用32位体系结构,发出32位对象文件。

ld -o executable -m elf_i386 a.out调用链接器,将目标设置为elf_i386,并将链接的文件放入executable

相关内容

  • 没有找到相关文章

最新更新