Nachbesprechung Übung 6
Aufgabe 1
Aufgabe 2
Die Funkion strtoint.asm
berechnet die Zahlvon rechts nach links und erwartet als zweiten
Parameter die Anzahl der sichtbaren Zeichen (ohne terminierende Null).
global strtoint
section .text
strtoint:
push r10
xor rax, rax
xor r9 , r9
mov rcx, rsi
dec rcx
_loop:
xor r8 , r8 ;as we calculate in r8 reset every loop
mov r8b, [rdi+rcx] ;get chars from right to left
cmp r8, '-' ;stop when first minus occurs (eg 2-1 would generate -1)
je _neg
cmp r8, '0' ;accept numbers
jl _error
cmp r8, '9'
jle _calcn
cmp r8, 'A' ;accept capital letters
jl _error
cmp r8, 'Z'
jle _calcl
jmp _error ;accept nothing else
_calcn: ;calculate number
sub r8, '0'
jmp _calc
_calcl: ;calculate letter
sub r8, 55 ;substract 55 to get A=10
jmp _calc
_calc:
cmp r8, rdx ;accept only values < base
jge _error
mov r10, r9
cmp r9 , 0
jle _continue
_expon: ;shift exponent
imul r8 , rdx
dec r10
cmp r10, 0
jg _expon
_continue: ;add number and loop
add rax, r8
inc r9
dec rcx
cmp rcx, 0
jge _loop
jmp _end
_neg:
neg rax
jmp _end
_error:
mov rax, 0
_end:
pop r10
ret
Das C-Framework strtoint.c
enthält die Signatur der Funktion und ist von der Kommandozeile
aus mit den Parametern Zahl und Basis aufzurufen.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <inttypes.h>
extern int64_t strtoint(const char* str, uint64_t len, uint64_t base);
int main(int argc, char const *argv[])
{
if (argc != 3)
{
printf("usage : <prog> <number> <base>\n");
printf("example: ./strtoint 1234 10\n");
return EXIT_FAILURE;
}
printf("%"PRId64"\n", strtoint(argv[1], strlen(argv[1]), atoi(argv[2])));
return EXIT_SUCCESS;
}