2015-01-11 4 views
0

다음 작업을 수행하여 숫자 문자열 (<=100)을 nr becomes 1 if it's less tham 60 and 2 if not으로 변경합니다. 나는이 코드를 가지고 나왔다. 나는 가장 큰 도전은 숫자를 인쇄 할 줄 알았는데 ...하지만 그것은 코드에 표시된이 오류가 지적 저를 제공합니다x86 인수의 크기가 잘못되었습니다. [tasm]

Prints macro number 
    mov bx, 10  ; need to divide by 10 to get the last digit 
    mov al, number 
    mov ah,0 
    mov cx,0 
    decompose:  
     inc cx 
     div bx   ; reminder stored in ah 
     mov dl,ah 
     add dl,48  ; to convert to char ; <<<<< HERE 
     push dl 
     cmp al,0  ;the nr=0 means that the loop ends 
     jnz decompose 

    printloop: ;loops for as many times as counted in cx ; <<<< HERE 
     pop dl 
     mov ah,2h  ; prints whatever is in dl 
     int 21h 
    loop printloop 

     mov dl,' '  ; the space after a number 
     mov ah,2h 
     int 21h 

endm 

data segment para public 'data' 
    sir DB 15, 78, 12, 39, 42, 88 
    lungime_sir EQU $-sir 
data ends 

;stack segment para public 'stack' 
; dw stack_size dup(?) 
; stack_start label word 
;stack ends 

code segment para public 'code' 
start proc far 
    assume cs:code, ds:data 
    push ds 
    xor ax,ax 
    push ax 
    mov ax, data 
    mov ds, ax 

    mov si,0 
    mov cx,lungime_sir 

next: 
    cmp sir[si],60 
    jb mic 
    mov sir[si],2 
    inc si 
loop next 

mic: 
    mov sir[si],1 
    inc si 
    cmp si,lungime_sir 
    jle next 


    mov cx,lungime_sir 
    mov si,0 

    ;put values on a stack and pop them out 
print: 
    Prints sir[si] 
    inc si 

loop print 


     ret 
start endp 
code ends 
end start 

문제점은 무엇입니까? :(push dxpop dx

답변

0

변경 push dlpop dl. 당신은/밀어 바이트를 팝업 수 없습니다.

div bx   ; reminder stored in ah 

변경 div bl으로이 격차는 AH에서 나머지를 얻을 수있다.

을 한 후 mov ah,0를 넣어 레이블 을 분해하여 두 번째 및 세 번째 반복을 성공적으로 수행하십시오.

mov cx,0 
decompose: 
mov ah,0 

을 정의했습니다. 레지스터를 보존하지 않는 매크로로을 인쇄하십시오. 따라서 다음 코드는 예상대로 작동하지 않습니다. 최소한 푸시/팝 CX.

print: 
Prints sir[si] 
inc si 
loop print 
+0

감사합니다. 이제 알고리즘에 분명히 다른 문제가 있습니다. "32"는 "2000781 ..... 152"를 인쇄 중입니다 :/ –

+1

그냥 내 대답을 업데이트했습니다 –

+0

오 이런. 감사! –