Petla wykonywana n-razy

Odpowiedz Nowy wątek
2014-12-12 19:13
0

Program: Podajemy liczbę i ma tyle razy ją wyświetlić
Wynikiem działa programu jest wyświetlenie ok. 260 razy liczby 2 (bo taką podałem na starcie programu).
Pętla jest ok bo jak jak przed nią dam mov esi, 3 to ładnie 3 razy wyświetli wiec problem musi być przy "zamienianiu tekstu na liczbę"(sub esi,48).

NASM

section .text
global _start
 
_start:
    mov eax, 4
    mov ebx, 1
    mov ecx, text
    mov edx, [d_text]
    int 80h
 
    mov eax, 3
    mov ebx, 0
    mov ecx, ile
    mov edx, [d_ile]
    int 80h
 
    mov esi, [ile]
    sub esi,48  
 
_petla:
    cmp esi, 0
    je _koniec
 
    mov eax, 4
    mov ebx, 1
    mov ecx, ile
    mov edx, [d_ile]
    int 80h
    dec esi
    jmp _petla
 
_koniec:
    mov eax, 1
    int 80h
 
section .data
text    db  "Ile razy: "
d_text  dd  $ - text
 
ile db  0
d_ile   dd  $ - ile

Pozostało 580 znaków

2014-12-12 19:41
  1. Ale że co? Rozumiesz chyba że to twoje zamienianie działa tylko an CYFR? Dla wartości 0-9? jak ktoś poda 10 to juz nie zadziała?
  2. Za pisanie gołych liczb typu 48 powinni ucinać palce. Nie da sie napisać '0'? o_O
  3. A jeśli wyzerujesz esi przed przypisaniem? Poza ty masz tu niezgodność rozmiarów operandów. Masz zmienną db która ma 1 bajt a przypisujesz do rejestru esi który ma bajtów 4...

Na PW przyjmuje tylko (ciekawe!) zlecenia. Masz problem? Pisz na forum, nie do mnie.
edytowany 5x, ostatnio: Shalom, 2014-12-12 19:50

Pozostało 580 znaków

2014-12-12 20:30
0

Ad1 Dokładnie tak, tylko zakres 0-9
Ad2 Czyli tak na prawdę odejmuje 0?
Ad3 Czyli chodzi o to że mam 4 bajty i mogą tam być śmieci a ja nadpisuje tylko jeden bajt - i z tego wniosek żeby wyzerować? (xor esi,esi tak?)

xor esi,esi
mov esi, [ile]
sub esi,'0' ;?
edytowany 1x, ostatnio: shimizu, 2014-12-12 20:44

Pozostało 580 znaków

2014-12-12 21:40
0

Udało się!! Ale mam pytanko. Bo teraz mi wyświetla w kolumnie, a ja bym chciał żeby wyświetlało ale w linii. Pewnie ten znak końca lini został wczytany podczas wczytywania zmiennej i niezbyt wiem jak go usunąć.

section .text
global _start
 
_start:
    mov eax, 4
    mov ebx, 1
    mov ecx, text
    mov edx, [d_text]
    int 80h
 
    mov eax, 3
    mov ebx, 0
    mov ecx, ile
    mov edx, [d_ile]
    int 80h
 
    xor esi,esi
    mov sil, [ile]
    sub esi, 48
 
_petla:
    cmp esi, 0
    je _koniec
 
    mov eax, 4
    mov ebx, 1
    mov ecx, ile
    mov edx, [d_ile]
    int 80h
    dec esi
    jmp _petla
 
_koniec:
    mov eax, 1
    int 80h
 
section .data
text    db  "Ile razy: "
d_text  dd  $ - text
 
ile dd  000
d_ile   dd  $ - ile

Pozostało 580 znaków

2014-12-12 21:56
0

Ciekawe jak i gdzie ten znak nowej linii miałby się wczytać skoro masz pamięć na JEDEN BAJT. Tam sie NIC WIĘCEJ nie zmieści. Ja bym jednak obstawiał że pisanie do stdout za pomocą int 80h daje taki efekt. Zresztą gdybyś rozumiał kod który wstawiasz to wiedziałbyś że wczytujesz tylko jeden bajt a reszta zostaje w buforze klawiatury, w tym i znak nowej linii.


Na PW przyjmuje tylko (ciekawe!) zlecenia. Masz problem? Pisz na forum, nie do mnie.
edytowany 1x, ostatnio: Shalom, 2014-12-12 21:57

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0