繁体   English   中英

linux nasm代码什么也不显示

[英]linux nasm code displays nothing

我正在编写一个程序,用户在其中输入数字,并打印出从零到数字的所有数字。 它可以很好地进行编译,链接并且可以在运行时不返回任何错误,但它绝对不会输出任何内容。 这是代码:

SECTION .data 
len   EQU 32

SECTION .bss 
other resd len
data  resd len

SECTION .text

GLOBAL _start
_start:
nop

input:                  ; This section gets the integer from the user
mov eax, 3          ; }
mov ebx, 1          ; }
mov ecx, data       ; } System_read call
mov edx, len        ; }
int 80h             ; }

mov ebp, 1

setup:                  ; This section sets up the registers ready for looping 
mov [other], ebp

loop:                   ; This section loops, printing out from zero to the number given
mov eax, 4
mov ebx, 1
mov ecx, [other]
mov edx, len
int 80h

exit:                   ; Exits the program
mov eax, 1          ; }
mov ebx, 0          ; } System_exit call
int 80h             ; }

当我在KDBG上逐步执行它时,它会返回一些错误。 它接收到中断和分段错误,尽管我不知道在哪里。 我不确定为什么会这样,因为当我在Geany中运行它时,它最后会返回0值,并且运行时不会出错。 为什么不起作用?

提前致谢

注意:此代码不会循环。 还没结束 它所要做的就是打印数字1。

当您打印时,您正在调用mov ecx, [other] 这将查看存储在其他地址中的地址,并跟随该地址获取存储在该地址中的所有内容。 问题在于此系统调用期望ecx中的地址,而不是值。

如果您叫mov ecx, other则调用mov ecx, other ,则ecx将拥有other的地址,并且能够转到该地址并打印其中的内容。

您这里还有另一个问题:当您打印存储在other的数字时,它将把它转换为ascii值。 因此,例如,当您尝试打印1而不是打印数字1时,它将打印ascii 1(它恰好是标题字符的开始;您不想打印的内容)。 如果要打印数字,请添加'0' (字符“ 0”)。

编辑:另一件事,当您阅读时,您正在将1传递给ebx。 1是STDOUT。 您想要的是STDIN为0。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM