x86 Аргумент имеет незаконный размер [tasm]

У меня есть эта задача, чтобы изменить строку чисел (<=100) по следующему правилу: nr becomes 1 if it's less tham 60 and 2 if not, Я вышел с этим кодом. Я думал, что самая большая проблема заключалась в том, чтобы напечатать числа... но это дает мне 2 ошибки, отмеченные, как указано в коде:

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

В чем дело?:(

1 ответ

Решение

+ Изменить push dl а также pop dl в push dx а также pop dx, Вы не можете выдвинуть / вытолкнуть байт.

div bx          ; reminder stored in ah

Изменить это деление на div bl чтобы получить остаток в AH.

Положил mov ah,0 после разложения метки, чтобы получить успешную вторую и третью итерации

mov cx,0
decompose: 
mov ah,0

Вы определили Prints как макрос, который не сохраняет никаких регистров. Поэтому следующий код не будет работать так, как ожидалось. По крайней мере, нажмите / поп CX.

print:
 Prints sir[si]
 inc si
loop print
Другие вопросы по тегам