【问题标题】:Assembly language loop only goes through one iteration?汇编语言循环只经过一次迭代?
【发布时间】:2016-06-03 00:08:08
【问题描述】:

整天都在做这项任务,但无法弄清楚我做错了什么。我的代码应该使用嵌套循环来打印如下内容:

xxxxxxxxxx
xxxxxxxxx
xxxxxxxx
xxxxxxx
xxxxxx
xxxxx
xxxx
xxx
xx
x

我为此编写的代码是:

# printStars2.s

# Useful constants
    .equ STDOUT,1
# Stack frame
    .equ theChar,-1
    .equ counter,-8
    .equ lineCounter, -16
    .equ localSize,-32
newline:
    .string "\n"
    .equ newlineSz,.-newline-1          # equate msgSz to # of chars

# Code
    .text
    .globl main
    .type main, @function
main:
    pushq %rbp # save base pointer
    movq %rsp, %rbp # set new base pointer
    addq $localSize, %rsp # for local var.

    movb $'*', theChar(%rbp) # character to print
    movl $10, counter(%rbp) # innerLoop control variable
    movl $10, lineCounter(%rbp) #outerLoop control variable

outerLoop:
    jmp innerLoop          # jumps to innerLoop
    decl lineCounter(%rbp) # lineCounter--
    movl lineCounter(%rbp), %ebx #copies lineCounter value to intermediate register
    movl %ebx, counter(%rbp) # copies lineCounter value from register to innerLoop counter
    cmpl $0, lineCounter(%rbp) #checks if outerLoop has gone through 10 iterations
    jne outerLoop #repeat if not
    jmp exitLoop #exitLoop when complete

innerLoop:
    leaq theChar(%rbp), %rsi # address of char
    movl $1, %edx # one character
    movl $STDOUT, %edi # standard out
    call write # invoke write function
    decl counter(%rbp) # counter--;
    jg innerLoop # repeat if > 0
    #newLine
    movl    $newlineSz, %edx        # message size
    movl    $newline, %esi          # address of message text string
    movl    $STDOUT, %edi       # standard out
    call    write               # invoke write function

exitLoop:
    movl $0, %eax # return 0;
    movq %rbp, %rsp # restore stack pointer
    popq %rbp # restore base pointer
    ret

当我运行它时,它似乎只通过循环一次,它只打印一行 10 颗星。如果有人能告诉我我做错了什么或指出我正确的方向,我将不胜感激。

【问题讨论】:

    标签: loops gcc assembly gnu


    【解决方案1】:

    输入outerLoop后跳转到innerLoop

    在那里你打印星星并循环,直到计数器达到 0(第 37-42 行)。

    然后打印一个换行符(第 44-47 行)。

    然后你返回,程序结束。

    您绝不会跳回outerLoop,因此没有循环!

    一种解决方案:将jmp innerLoop 指令替换为内部循环的内容。然后,当内循环完成后,它将继续执行您为外循环编写的逻辑,一切都会正常工作。由于您的标签 outerLoop:innerLoop: 将紧挨着彼此,因此您可以将它们组合起来,只需使用 Loop:

    这个organization也避免了跳转到exitLoop的需要。

    【讨论】:

      猜你喜欢
      • 2015-06-09
      • 1970-01-01
      • 1970-01-01
      • 2015-03-23
      • 2015-02-13
      • 1970-01-01
      • 2012-05-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多