вложенные циклы - x86 NASM - PullRequest
       13

вложенные циклы - x86 NASM

0 голосов
/ 11 октября 2019

Я пытаюсь написать ассемблер для печати ascii '*' в порядке возрастания за 9 шагов. :

*
**
***
****
*****
******
*******
********

Я написал циклы, основанные на том, как я буду действовать в C ++. Я основал этот код на цикле while. Я думаю, что застревает на чем-то меньшем и большем, чем в «печати». Неправильно ли сравниваются мои переменные x и y (т. Е. Должен ли я перемещать их в регистры другим способом)? Я пробовал много разных твиков, но все равно не повезло. Я не могу использовать ничего, кроме прыжков.

;nasm 2.11.08

section .data


    x db '2' ; int x = 2
    y db '0' ; int y = 0
    star db '*'
    endl db 0xa

section .text
    global _start

_start:
begin:
    mov byte [x], '0'



    cmp byte [y], '9'

    jl print
    je end

print:

    mov ebx, [x]
    mov ecx, [y]   
    cmp ebx, ecx
    jl print2



    mov eax,4            
    mov ebx,1            
    mov ecx,endl       
    mov edx,1
    int 80h



    inc byte [y]

    jmp begin

print2:
    mov eax,4            
    mov ebx,1            
    mov ecx,star       
    mov edx,1
    int 80h 

    inc byte [x]

    mov ebx, [x]
    mov ecx, [y]

    cmp ecx, ebx
    jg begin
    jmp print 

end:
    mov eax,1            ; The system call for exit (sys_exit)
    mov ebx,0            ; Exit with return code of 0 (no error)
    int 80h;

Не уверен, куда идти отсюда, хотелось бы получить рекомендации.

Обновление: так что я понял это благодаря некоторой помощи @PeterCordes

section .text

global _start

_start:


starts:

    mov     ecx, star   ;
    mov     edx, 1      ;;
    mov     ebx, 1      ;;; Print * 
    mov     eax, 4      ;;
    int     0x80        ;

    inc byte [x]        ; add 1 to x
    movzx cx, byte [y]  ; mov the 
    cmp byte [x], cl    ; check to see if x is less than y
    jle starts          ; x > y jump to top

    mov     ecx, endl   ;
    mov     edx, 1      ;;
    mov     ebx, 1      ;;; Print \n
    mov     eax, 4      ;;
    int     0x80        ;

    mov [x], byte '0'   ; reset x
    inc byte [y]        ; add 1 to y
    cmp byte [y], '9'   ; check to see if y is still less than 9
    jl starts           ; y > 9 jump to top


end:
    mov     eax, 1
    int     0x80

section .data
    x db '0'            ; number of * per line 
    y db '0'            ; number of lines
    star db '*'
    endl db 0xa

...