我正在制作一个程序,用户输入一个数字,它会打印出从零到数字的所有数字。它编译良好,链接良好,运行时不返回任何错误,但它绝对不打印任何内容。这是代码:
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]
。这会查看存储在 other 中的地址,并按照该地址获取存储在那里的任何内容。问题是这个系统调用需要一个 ecx 中的地址,而不是一个值。
如果您改为调用 mov ecx, other
,则 ecx 将具有 other 的地址,并且它将能够转到该地址并打印那里的内容。
这里还有另一个问题:当您打印存储在 other
中的数字时,它会将其转换为 ascii 值。因此,例如,当您尝试打印 1 而不是打印数字 1 时,它将打印 ascii 1(恰好是标题字符的开头;您不想打印任何内容)。如果要打印数字,请添加 '0'
(字符“0”)。
编辑:还有一件事,当您阅读时,您正在将 1 传递给 ebx。 1 是标准输出。你想要的是 STDIN,它是 0。
关于linux nasm 代码什么都不显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12855035/