我正在尝试学习一些装配,我首先将文本输出到屏幕上。我开始认为这可能是我的环境和/或汇编:到现在为止,我感到非常沮丧,因为我实际上是复制粘贴汇编代码,但它只是没有打电话给我系统调用。这是源代码(主要改编自https://en.wikibooks.org/wiki/X86_Assembly/Interfacing_with_Linux)
.section .data
msg: .ascii "Hello World\n"
.section .text
.global main
main:
movq $1, %rdi # write to stdout
movq $msg, %rsi # use string "Hello World"
movq $12, %rdx # write 12 characters
syscall # make syscall
movq $60, %rax # use the _exit syscall
movq $0, %rdi # error code 0
syscall # make syscall
我正在使用运行Kali Linux的64位计算机上,正在使用GCC进行编译。像这样:
gcc -c test.s
gcc test.o -no-pie
我用GDB调试了程序,系统调用指令总是将eax寄存器设置为0xffffffffffffffda(-38),这似乎不对......
任何人都可以提供见解吗?
答案 0 :(得分:4)
Syscalls通常在出错时返回负值,绝对值为$dollar = filter_input(INPUT_POST, "dollar");
$cent = filter_input(INPUT_POST, "cent");
//Set the local to parse monetary values correctly
setlocale(LC_MONETARY,"en_US");
//Get correct monetary value with 2 decimal place and **$** sign
$total = money_format("%.2n", $dollar.'.'.$cent);
值本身。
在您的情况下,errno
为38
。
但是你打电话给什么系统调用函数?让我们看一下,在发出ENOSYS: Function not implemented
之前,函数编号存储在rax
(eax
,32位)中,并且您的程序加载......没有!
看起来您在复制/粘贴中丢失了一行:
syscall
答案 1 :(得分:2)
您的代码缺少示例代码中的第一条指令:
[System.Serializable]
public class SaveManager {
[OnDeserializing()]
internal void OnDeserializingMethod(StreamingContext context) {
version = 1.5f;
resolutionSetting = 1;
notificationTimer = 5 * 60;
hideNameTagTimer = 0 * 60;
storedLevelName = "little_transparent";
fartVolume = 0f;
fartToggle = true;
nametagsCollideWithCharacters = true;
}
[OptionalField]
public float version = 1.5f;
如果没有这段代码,它会根据movq $1, %rax ; use the write syscall
调用%rax
时发生的任何事情,最终执行意外(可能无效)的系统调用。