Tutorium 8

Reading time ~2 minutes

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;
}

Vorbesprechung Übung 8