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