汇编 - 系统调用写入返回-38,无输出

时间:2017-08-03 00:06:06

标签: linux assembly system-calls

我正在尝试学习一些装配,我首先将文本输出到屏幕上。我开始认为这可能是我的环境和/或汇编:到现在为止,我感到非常沮丧,因为我实际上是复制粘贴汇编代码,但它只是没有打电话给我系统调用。这是源代码(主要改编自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),这似乎不对......

任何人都可以提供见解吗?

2 个答案:

答案 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); 值本身。

在您的情况下,errno38

但是你打电话给什么系统调用函数?让我们看一下,在发出ENOSYS: Function not implemented之前,函数编号存储在raxeax,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时发生的任何事情,最终执行意外(可能无效)的系统调用。