Friday, May 21, 2021

Write an X86/64 ALP to accept a string and to display its length.

MAIN.asm

%macro IO 4  ; simple macro ,

mov rax,%1   ;  param 1 ->  system call number                             

mov rdi,%2    ;  param 2 ->  file descriptor                              

mov rsi,%3     ;  param 3 ->  message                       

mov rdx,%4      ;  param 4 ->  length                         

syscall                                     

%endmacro  

section .data

    m1 db 10,13, "enter string"   ;10 ->line feed 

    l1 equ $-m1                         

    m2 db 10,13, "Entered"    

    l2 equ $-m2                         

    m3 db 10,13,"Length is "     

    l3 equ $-m3 

    m4 db 10,13, "Write an X86/64 ALP to accept a string and to display its length"

    l4 equ $-m4

    m5 db 10,13, "Exiting now"  

    l5 equ $-m5

    

    m7 db 10    

section .bss

    string resb 50                      ;string array of size 50

    strl equ $-string 

    count resb 1

    _output resb 20

section .text

    global _start


_start:

   IO 1,1,m4,l4    ; display

    IO 1,1,m1,l1    ; display

 input:

    IO 0,0,string,strl

    mov [count],rax ;count now points to rax 

 output:

    IO 1,1,m2,l2    ; display

    IO 1,1,string,strl

    IO 1,1,m3,l3    ; display 

    mov rax,[count] ; value of count passed into rax   

    call hex_to_dec

    IO 1,1,_output,16

    IO 1,1,m7,1

 exit:

    IO 1,1,m5,l5     

    mov rax, 60     ; system call for exit

    mov rdi, 0      ; exit code 0

    syscall


hex_to_dec:

        mov rsi,_output+15  ; max size of display , for convinience set to 16 and rsipoints to output[16]

        mov rcx,2           ; loop count , or number of digits displayed , 2 digits (unlikely we will enter string > 99)(prints preceding zeros otherwise)

    letter2:

        xor rdx,rdx         ; setting rdx to null without setting a null byte (a tip i saw on reddit) needed to clean dl for use 

        mov rbx,10          ; conversion base

        div rbx             ; dividing by conversion base

        cmp dl,09h          ; comparing 09h with dl , since the division remainder ends up in dx and since its one digits its in dl

        jbe add30           ; if value under in 0-9 , we directly add 30h to get ascii 0-9

    add30:

        add dl,30h          ; adding 30h

        mov [rsi],dl        ; moving the ascii we generated to rsi

        dec rsi             ; rsi now points to the next place in display or output[n-1]

        dec rcx             ; loop 

        jnz letter2

ret


OUTPUT:

Write an X86/64 ALP to accept a string and to display its length
enter string
Entered
Rahul
Length is 
5
Exiting now

[Program exited with exit code 0]

No comments:

Post a Comment

Write an Assembly Language Program (ALP) to find the largest of given byte / Word / Double-word / 64-bit numbers.

  %macro scall 4 ;macro declaration with 4 parameters          mov eax , %1 ;1st p...