В x86 для большинства инструкций по крайней мере один из операндов должен быть регистром (за некоторыми исключениями, например, inc / dec). Ваш код выглядит немного «старомодным» - такие инструкции, как «losdb» и «stosw», в значительной степени устарели, и вы обнаружите, что «mov al, [esi]; добавить esi, 1» и т. Д. Быстрее (но не настолько компактны в размер кода). Ознакомьтесь с руководствами по оптимизации Intel или AMD (поищите на сайтах разработчиков). Кроме того, есть ли причина, по которой «итерации» являются только байтом? Нет никакого преимущества в скорости, если быть байтом вместо меча (на самом деле он медленнее), и вы обернетесь, если входные данные> 255.
от вопрос уже есть ответ здесь:
Неправильная комбинация кода операции и ошибки операндов 1 ответSEGMENT .data
print db "%d %d %d %d This is a test of printf", 10, 0
rowm dw 160 ;row multiplier
iterations db 80 ;number of columns to set
SEGMENT .bss
offs resd 1 ;offset
SEGMENT .text
attribute equ 47h ;color attribute
global _VText
global _VPage
extern _vm_buffer
extern _printf
_VText:
push ebp
mov ebp, esp
push edi
push esi
push eax
push es
push ecx
push edx
mov esi, [ebp+8] ;message
mov es, [_vm_buffer]
mov dword [offs], 0
mov ax, [ebp+12] ;row
mul dword[rowm] ;multiply row by 160, result stored in dx:ax
add [offs], dx ;add dx:ax to offset
shl dword [offs], 16
add [offs], ax
mov ax, [ebp+16] ;column
shl ax, 1 ;multiply column by 2
add [offs], ax ;add ax to offset
mov ax, [ebp+24] ;page
shl ax, 12 ;multiply page by 2^12 (4096)
add [offs], ax ;add ax to offset
mov edi, offs ;set offset
mov ah, [ebp+20] ;attribute
sub byte[iterations], [ebp+16] ;so that we don't write too many columns
mov ecx, iterations
next_char:
lodsb ;get the input string type
cmp al, 00h ;check for null character
je null_ch ;if null, then quit (null character indicates end of the string)
stosw ;store ax to video memory
loop next_char ;will loop 80 times
null_ch:
pop edx
pop ecx
pop es
pop eax
pop esi
pop edi
pop ebp
ret
_VPage:
ret
Я исследовал эту ошибку ранее, и она сказала добавить скобку, я сделал это, и это не исправление.
Помогите, пожалуйста.