【发布时间】: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 颗星。如果有人能告诉我我做错了什么或指出我正确的方向,我将不胜感激。
【问题讨论】: