Home > Blockchain >  How can I print out A-Z in Netwide assembler
How can I print out A-Z in Netwide assembler

Time:10-16

section .text 
    global _start
_start:

    mov eax, [inputOrder]
    mov     ecx, inputOrder
    mov     edx, inputLen
    mov     ebx, 1
    mov     eax, 4
    int     0x80
    
    mov     eax, 1
    mov     ebx, 0
    int     0x80

section .data

    inputOrder db 065,066,067,068,069,070,071,072,073,074,075,076,077,078,079,080,081,082,083,084,085,086,087,088,089,090 

    inputLen equ $ - inputOrder

I need help. I need to use loop in order to print out A-Z. What is the needed code in order to solve this issue? What will I add in this code in order to make a Loop rather than inputOrder?

CodePudding user response:

First you write down what the code would be without loop, and then you generalize it so loop can be used. Today, nobody uses loop because it’s utterly slow, but if you insist on using loop:

global _start
bits 64
default rel

section .text

    shr edx, 2                  ;  edx ≔ edx div 4
    test ecx, ecx               ;   ZF ≔ ecx = 0
print:
    mov [rsi], rbp              ; rsi↑ ≔ rbp
    mov eax, edi                ;  eax ≔ edi
    mov esp, ecx                ;  esp ≔ ecx
    syscall                     ; fast system call
                                ; rax, rcx, and r11 are not preserved
    mov ecx, esp                ;  ecx ≔ esp
    lea rbp, [rbp   rbx]        ;  rbp ≔ rbp   rbx
    loopne print                ;  ecx ≔ ecx − 1
                                ; if ecx ≠ 0 ∧ ¬ZF then goto print  
    jecxz $$                    ; if ecx = 0 then goto $$ 
    shr edi, 1                  ;  edi ≔ edi div 2
exit:
    mov eax, 60                 ;  eax ≔ 60
    syscall

_start:
    mov rbp, 'ABCDEFGH'         ;  rbp ≔ 16#4847464544434241
    mov rbx, 0x0808080808080808 ;  rbx ≔ 16#0808080808080808
    mov ecx, 3                  ;  ecx ≔ 3
    setne dil                   ;  dil ≔ ¬ZF
    mov dl, bl                  ;   dl ≔ bl
    mov rsi, rsp                ;  rsi ≔ rsp
    jmp print                   ; goto print

CodePudding user response:

mov eax, [inputOrder]

This instruction loads the EAX register with 0x44434241, but then you simply don't use it. To be removed.

A loop as per request, would output a single character, increment the ASCII code for the character and continue until the Z character got processed. There's no need to use an actual loop instruction!

Again:
    mov     edx, 1
    mov     ecx, TheChar
    mov     ebx, 1
    mov     eax, 4
    int     0x80
    movzx   eax, byte [TheChar]
    inc     eax
    cmp     al, 'Z'
    jbe     Again

    xor     ebx, ebx
    mov     eax, 1
    int     0x80

section .data

TheChar db 'A'
  • Related