linux nasm assembly drucke alle zahlen von null bis 100
Ich schreibe ein Programm, um alle Zahlen von Null bis 100 auszudrucken. Der einzige Grund, warum ich das mache, ist, das Ausdrucken von mehrstelligen Zahlen zu testen.
Das Problem, das ich habe, ist, dass mein Programm nur die Zahlen 1 und 2 ausgibt. Ich habe keine Ahnung, warum. Mein Compiler kompiliert einwandfrei, ohne Fehler sowie ohne Linkerfehler.
Hier ist mein Code:
SECTION .data
len EQU 32
NUL EQU 0
countlen EQU 8
SECTION .bss
counter resb countlen
strlen resb countlen
SECTION .text
GLOBAL _start
_start:
mov BYTE[counter], 1 ; set counter to 1
mov BYTE[strlen], 1 ; set string length counter to 1
mov ecx, counter ; move the counter to ecx
add BYTE[ecx], NUL ; add null terminator to ecx
mov esi, 9 ; move 9 to esi
Length:
cmp [counter], esi ; compare counter to esi
jle Set ; if equal, goto set
inc BYTE[strlen] ; increment the string size
mov eax, 10 ; move 10 to eax
mov ebx, esi ; move esi to ebx
mul ebx ; multiply ebx by esi
add eax, 9 ; add nine to the result
mov esi, eax ; move the result to esi
jmp Length ; jump to Length
Set:
mov esi, 9 ; reset checker
Check:
cmp BYTE[strlen], 1 ; is it one digit?
je Single ; if yes, jump to single
cmp BYTE[strlen], 3 ; is it 100?
je Exit ; if yes, jump to Exit
Print: ; this section deals with multi-digit numbers
cmp BYTE[ecx], NUL ; check if end of string
je Exit ; if equal goto exit
mov eax, 4
mov ebx, 1
mov edx, 1
int 80h ; print number
inc ecx ; point to next digit in number
jmp Print ; jump to Print
Single: ; this section deals with single digit numbers add BYTE[counter], '0' ; convert to ASCII
mov eax, 4
mov ebx, 1
mov ecx, counter
mov edx, countlen
int 80h ; print the digit
jmp Length ; go back
Exit: ; Exit section
mov eax, 1 ; sys_exit
mov ebx, 0 ; return 0
int 80h ; syscall
Warum macht es das? Was muss ich außerdem ändern, damit es wie erwartet funktioniert?
Danke im Voraus,
RileyH
AKTUALISIEREN:
Bearbeitet, um das Etikett "Drucken" aufzunehmen