#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
делать? Вы уверены, что хотите делать это каждый раз по циклу?