【问题标题】:linux nasm code displays nothinglinux nasm 代码什么也不显示
【发布时间】:2012-10-12 08:26:34
【问题描述】:

我正在制作一个程序,用户输入一个数字,它会打印出从零到数字的所有数字。它编译良好,链接良好,运行时不返回任何错误,但它完全没有打印出来。这是代码:

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。

【问题讨论】:

  • 您不应该使用指令名称作为标签名称。我的意思是loop。这是一个指令。
  • mov ecx, [other] 是个问题。 ecx 想要一个缓冲区的地址!无论如何都不会打印“1”,它会打印带有ascii代码1的字符(也许是笑脸)。看看它...

标签: linux assembly nasm


【解决方案1】:

当你去打印时,你打电话给mov ecx, [other]。这会查看存储在 other 中的地址,然后按照该地址获取存储在那里的任何内容。问题是这个系统调用需要 ecx 中的地址,而不是值。

如果您改为调用mov ecx, other,则 ecx 将拥有 other 的地址,并且它将能够转到该地址并打印那里的内容。

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

编辑:还有一件事,当您阅读时,您将 1 传递给 ebx。 1 是标准输出。你想要的是 STDIN,它是 0。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-26
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    相关资源
    最近更新 更多