Я не могу бросить свою программу расчета високосного года

#unix #assembly #sparc

Вопрос:

Этот код вычисляет, является ли введенный пользователем номер високосным годом:

  • високосный год делится на 4, когда его не было, это обычный год
  • но если этот год разделить на 100, то будет два случая.
    • когда он делится на 400, либо это високосный год.
    • когда он не делится на 400, это обычный год.

Это работает хорошо, за исключением того, что я не могу выйти из программы. Я хочу убежать, когда я ввожу отрицательные числа.

Я сделал cmp %l1, 0 и bl next_r в основном ярлык, чтобы сбежать, но это не работает

 fmt1 :  .asciz  "input a year (EXIT : negative number )n"
fmt2 :  .asciz  "%d"
fmt3 :  .asciz  "%d is leap year.n"
fmt4 :  .asciz  "%d is common year.n"

    .align  4
    .global     main,   printf, scanf

main :  save    %sp,    -96,    %sp
    set fmt1,   %o0
    call    printf
    nop
    set fmt2,   %o0
    add %fp,    -4, %o1
    call    scanf
    nop
    ld  [%fp-4],    %l1
    cmp %l1,    0
    bl  next_r
    nop


loop_a :    mov %l1,    %o0
    mov 4,  %o1
    call    .rem
    nop
    cmp %o0,    0
    be  loop_b
    nop
    bne print_a
    nop

print_a :   set fmt4,   %o0
    ld  [%fp-4],    %o1
    call    printf
    nop
    ba  main
    nop

loop_b :    
    ld  [%fp-4],    %o0
    mov 100,    %o1
    call    .rem
    nop
    cmp %o0,    0
    be  loop_c
    nop
    bne print_b
    nop

print_b :   set fmt3,   %o0
    ld  [%fp-4],    %o1
    call    printf
    nop
    ba  main
    nop

loop_c :    ld  [%fp-4],    %o0
    mov 400,    %o1
    call    .rem
    nop
    cmp %o0,    0
    be  print_b
    nop
    bne print_a
    nop

next_r :    ret
    restore
 

Вот результат.

 input a year (EXIT : negative number)
2000
2000 is a leap year
input a year (EXIT : negative number)    
2001
2001 is a common year
input a year (EXIT : negative number)
-23
input a year (EXIT : negative number)
-23
input a year (EXIT : negative number)
 

Комментарии:

1. Что же save %sp, -96, %sp делать? Вы уверены, что хотите делать это каждый раз по циклу?