2012-10-12 96 views
2

我正在制作一个程序,用户输入一个数字,并打印出从零到数字的所有数字。它编译好,链接正常,运行时不返回任何错误,但它完全没有打印出任何错误。这里是代码:linux nasm代码什么也没有显示

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.

+0

你不应该使用指令名称作为标签名称。我的意思是'循环'。这是一条指令。 –

+0

'mov ecx,[other]'是个问题。 ecx想要一个缓冲区的地址!无论如何不会打印“1”,它将打印ASCII码为1的字符(笑脸也许)。看看itoa ... –

回答

1

当您打印时,您打电话mov ecx, [other]。这将查看存储在其他地址中的地址,并跟踪该地址以获取存储的地址。问题在于这个系统调用期望在ecx中有一个地址,而不是一个值。

如果您改为拨打mov ecx, other,那么ecx将具有其他地址,它将能够转到该地址并打印出那里的内容。

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

编辑:还有一件事,当你阅读时,你传递1进入ebx。 1是STDOUT。你想要的是STDIN是0.

+0

谢谢。很棒。 – Progrmr

相关问题