2017-03-17 1 views
0

S'il vous plaît, je suis un nouveau langage d'assemblage et j'essaie d'imprimer le contour d'une boîte. Je suis vraiment coincé. essayé tout ce que je sais, mais je ne peux pas l'obtenir pour imprimer le contour. Nous vous remercions d'avance pour votre aideComment imprimer un contour de boîte en langage assembleur

INCLUDE Irvine32.inc 

    .data 
    prompt BYTE "This program draws a rectangle using the * character.", 0 
    len BYTE "How high would you like your box? ", 0 
    wid BYTE "How wide would you like your box?: ", 0 
    image BYTE "* ", 0 
    space BYTE " ", 0 
    leninput DWORD ? 
    widinput DWORD ? 
    h DWORD ? 
    w DWORD ? 
    count DWORD ? 


    .code 
    main proc 

    ;;; Write the prompt to the screen 
    mov edx, OFFSET prompt 
    call WriteString 
    call Crlf 

    ;;; Write the length request to the screen 
    mov edx, OFFSET len 
    call Crlf 
    call WriteString 


    ;;; Obtain the length value(which will be in eax) 
    call ReadDec 
    mov leninput, eax 

    ;;; Write the width request to the screen 
    mov edx, OFFSET wid 
    call Crlf 
    call WriteString 


    ;;; Obtain the second value(which will be in eax) 
    call ReadDec 
    mov widinput, eax 


    ;;; Draw rectangle on screen 
    mov eax, 0 
    mov ecx, leninput; set outer loop with length 


    L1 : 
    mov count, ecx; save outer loop count 
    mov ecx, widinput; set inner loop count with the width 

    L2 : 
    call ConditionCheck 

    loop L2; repeat the inner loop 
    call Crlf; Print line 
     mov ecx, count; restore outer loop(length) 
    loop L1; repeat outer loop 1 

    exit 
main endp 
; ---------------------------------------------------------------------- 
ConditionCheck PROC 
mov eax, leninput 
mov ebx, widinput 

.IF eax == 1 
mov edx, OFFSET image 
call WriteString 
.ELSEIF eax == leninput 
mov edx, OFFSET image 
call WriteString 
.ELSEIF ebx == 1 
mov edx, OFFSET image 
call WriteString 
.ELSEIF ebx == widinput 
mov edx, OFFSET image 
call WriteString 
.ELSE 
mov edx, OFFSET space 
call WriteString 
.ENDIF 
ret 
ConditionCheck ENDP 
; ---------------------------------------------------------------------- - 

end main 

sortie devrait ressembler à:

How high would you like your box? 5 
How wide would you like your box? 6 
****** 
* * 
* * 
* * 
****** 

Mais je vais avoir la boîte remplie à la place

+0

Ah .. macros MASM ou directives, ou ce que '.IF' est ... qui doit être gênant pour le débogage, pour ne pas voir les instructions réelles. BTW, avez-vous pensé à ce qui se passerait, si vous faisiez 'leninput - = 2;', produisez toujours une ligne complète, puis faites 'leninput' boucle avec des lignes" intérieures ", et après la boucle finirait, sortie une ligne complète ? (Mais vous devriez probablement désinfecter l'entrée pour vérifier qu'il était 3+) .... et de même le code de la pièce interne peut être plus simple à faire après le traitement 'widinput - = 2;' – Ped7g

Répondre

0

image et space doivent avoir la même quantité de caractères:

image BYTE "* ", 0 
space BYTE " ", 0 

Dans la procédure ConditionCheckEAX et EBX se réfèrent aux valeurs actuelles des boucles pas aux valeurs immuables de leninput et widinput. Donc, changer

mov eax, leninput 
mov ebx, widinput 

à

mov eax, count 
mov ebx, ecx