Assembly 为什么我的寄存器自己打印一个值(不使用任何系统调用)?

Assembly 为什么我的寄存器自己打印一个值(不使用任何系统调用)?,assembly,nasm,Assembly,Nasm,我想说明一下,我只是刚刚开始组装,所以我真的有0个经验。另外,我的只是好奇,不是因为程序不起作用或其他什么而问。我的程序只是一个简单的循环,但我不明白的是,当我运行它时,它会返回一个值。这个值本身是正确的,但问题是我没有使用任何系统调用来打印任何内容 代码如下: global _start section .text _start: mov ebx,1 mov ecx,4 label: add ebx,ebx dec ecx cmp ecx,

我想说明一下,我只是刚刚开始组装,所以我真的有0个经验。另外,我的只是好奇,不是因为程序不起作用或其他什么而问。我的程序只是一个简单的循环,但我不明白的是,当我运行它时,它会返回一个值。这个值本身是正确的,但问题是我没有使用任何系统调用来打印任何内容

代码如下:

global _start

section .text

_start:
    mov ebx,1 
    mov ecx,4 

label:
    add ebx,ebx 
    dec ecx 
    cmp ecx,0 
    jg label 
    mov eax,1 
    int 0x80 

正如你所看到的,我只是增加了ebx,减少了ecx,最后调用了sys_exit和interruption。所有这些都很好,但问题是,就像我说的,当我运行可执行文件时,它会打印来自ebx的值。应该是这样吗?如果是,为什么?根据我到目前为止学到的知识,我需要执行一个系统调用来打印一个值,但这里不是这样的

-ebx=系统退出的错误代码。它不应该打印它,只应该将它设置为退出状态。
int 0x80
EAX=1时是
sys\u exit(ebx)
。这是一个系统调用!(). 因此,进程的退出状态是EBX的低字节,但程序本身不会打印它。shell可能会打印返回状态,例如,如果您运行
/a.out;echo$?
。或者,如果您正在使用其他一些默认情况下打印退出状态的环境(如)来直接打印带有系统调用的asm中的号码,请使用以下代码:(或该代码的32位端口);echo$?。我认为这是有道理的。因此,从技术上讲,退出代码存储在ebx中,并使用echo$?它实际上打印了退出代码。如果这是一个愚蠢的问题,很抱歉,但我有点困惑。退出状态通过
int0x80
传递到EBX中的内核。EBX是第一个arg,
int0x80
类似于对内核的
调用。在您的进程完全退出并且不再有自己的寄存器或内存之后,shell将从中使用一个函数来检索它。