AT&T Assembly Printing 以控制段错误
AT&T Assembly Printing to console 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 , %esp
movb $'H', (%esp)
movb $'e', 1(%esp)
movb $'y', 2(%esp)
movb $'!', 3(%esp)
mov , %eax
mov , %ebx
mov %esp, %ecx
mov , %edx
int [=11=]x80
mov , %eax
mov [=11=], %ebx
int [=11=]x80
然而,当我编译并执行这段代码时,我得到:
./build.sh: line 35: 1159 Segmentation fault (core dumped) ./$FILE
139
我从 NASM 到 AT&T 的翻译是否正确?
如果是这样,就能够从为堆栈分配的内存中 read/write 而言,我是否缺少某些东西? (权限等)
构建信息:
在 Arch Linux 上构建 64 位系统
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 "" in
-f)
shift
FILE=
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 $?
您将其编译为 64 位代码,尽管 int 0x80
是 32 位中断。
我用来编译的:
as --32 inAssembly.s &&ld -o executable -m elf_i386 a.out
.
as --32 inAssembly.s
使 gnu 汇编程序采用 32 位体系结构,发出 32 位目标文件。
ld -o executable -m elf_i386 a.out
调用链接器,将目标设置为 elf_i386
并将链接文件放入 executable
.
我正在关注在线教程,其中提供了用 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 , %esp
movb $'H', (%esp)
movb $'e', 1(%esp)
movb $'y', 2(%esp)
movb $'!', 3(%esp)
mov , %eax
mov , %ebx
mov %esp, %ecx
mov , %edx
int [=11=]x80
mov , %eax
mov [=11=], %ebx
int [=11=]x80
然而,当我编译并执行这段代码时,我得到:
./build.sh: line 35: 1159 Segmentation fault (core dumped) ./$FILE
139
我从 NASM 到 AT&T 的翻译是否正确? 如果是这样,就能够从为堆栈分配的内存中 read/write 而言,我是否缺少某些东西? (权限等)
构建信息:
在 Arch Linux 上构建 64 位系统
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 "" in
-f)
shift
FILE=
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 $?
您将其编译为 64 位代码,尽管 int 0x80
是 32 位中断。
我用来编译的:
as --32 inAssembly.s &&ld -o executable -m elf_i386 a.out
.
as --32 inAssembly.s
使 gnu 汇编程序采用 32 位体系结构,发出 32 位目标文件。
ld -o executable -m elf_i386 a.out
调用链接器,将目标设置为 elf_i386
并将链接文件放入 executable
.