【问题标题】:A loop in assembly doesn't work why?汇编中的循环不起作用,为什么?
【发布时间】:2015-01-28 01:32:45
【问题描述】:

我有问题。我尝试在程序集(nasm,linux)中构建一个循环。循环应该“cout”数字 0 - 10,但它不起作用,我不知道为什么。这是一个代码:

section .text
global _start

_start:
     xor esi,esi
_ccout:
     cmp esi,10
     jnl _end
     inc esi
     mov eax,4
     mov ebx,1
     mov ecx,esi
     mov edx,2
     int 80h

     jmp _ccout
     _end:
     mov eax,1
     int 80h

section .data

【问题讨论】:

  • 具体是什么不起作用?程序段错误吗?它永远不会到达终点吗?它是否输出 0-10 以外的数字?
  • 没有输出,屏幕是空的,不知道为什么...
  • 您在ecx 中输入的值需要是要打印的字符序列的地址。您输入的 ecx 只是 0-9 范围内的一个整数。
  • 你能告诉我我应该在这个程序中具体修改什么来开始工作吗?

标签: linux assembly nasm


【解决方案1】:

嗯,循环正在工作,但您没有正确使用系统调用。这里涉及到一些神奇的数字,所以让我们先把它排除在外:

  • 4 是write 的系统调用号
  • 1 是标准输出的文件描述符

到目前为止,一切都很好。 write 需要文件描述符、缓冲区的地址以及该缓冲区的长度或它应该写入文件描述符的部分。所以,这应该看起来类似于

mov eax,4                   ; write syscall
mov ebx,1                   ; stdout
mov ecx,somewhere_in_memory ; buffer
mov edx,1                   ; one byte at a time

将其与您的代码进行比较:

mov eax,4
mov ebx,1
mov ecx,esi  ; <-- particularly here
mov edx,2
int 80h

您在那里所做的(除了传递错误的长度)是将esi 的内容作为内存地址传递给write,从中读取它应该写入标准输出的内容。纯属偶然,这不会崩溃,但在内存中的那个位置没有有用的数据。

为了解决这个问题,您需要在内存中放置一个位置。此外,由于write 作用于字符,而不是数字,因此您必须自己添加“0”(ASCII 中的 48)来进行格式化。总而言之,它可能看起来像这样:

section .data
     text db 0          ; text is a byte in memory

section .text
global _start

_start:
     xor esi,esi

_ccout:
     cmp esi,10
     jnl _end
     inc esi

     lea eax,['0'+esi]  ; print '0' + esi. lea == load effective address
     mov [text],al      ; is useful here even though we're not really working on addresses

     mov eax,4          ; write
     mov ebx,1          ; to fd 1 (stdout)
     mov ecx,text       ; from address text
     mov edx,1          ; 1 byte
     int 80h

     jmp _ccout

_end:
     mov [text],byte 10 ; 10 == newline

     mov eax,4          ; write that
     mov ebx,1          ; like before.
     mov ecx,text
     mov edx,1
     int 80h

     mov eax,1        
     mov ebx,0
     int 80h

123456789: 的输出可能不是你想要的,但你应该可以从这里得到它。为读者练习等等。

【讨论】:

  • 你能帮mi下面的程序吗?谢谢:D
猜你喜欢
  • 1970-01-01
  • 2013-10-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多