Board.KolibriOS.org
http://board.kolibrios.org/

Помогите новичку
http://board.kolibrios.org/viewtopic.php?f=2&t=684
Страница 74 из 74

Автор:  barbar89 [ Пн янв 29, 2018 1:39 am ]
Заголовок сообщения:  Re: Помогите новичку

Походу команда movzx как то не так работает как я ожидал, после того как заменил
movzx ebx, [iter]
на
mov ebx, dword[iter]
заработало правильно.

Автор:  theonlymirage [ Пн янв 29, 2018 1:47 am ]
Заголовок сообщения:  Re: Помогите новичку

barbar89
Цитата:
; рядом message я написал iter db 1

Замени размер самой переменной iter.
Если ты её значение кладёшь в регистр eax или ebx, то она явно не байт db, а dd (4 байта). Иначе мусор может попасть или ещё что.


UPDATE
Ты делаешь явно что-то не то =)
movzx дополняет значение нулями до нужной разрядной сетки, в твоём случае с
Код:
iter: db 0

было бы правильнее заменить следующую строчку:
Код:
movzx ebx, [iter]

на
Код:
movzx ebx, byte[iter] ;в других ассемблерах byte ptr[iter] 


Либо как я отметил выше изменить iter dd 0 и писать как ты сделал.

Автор:  barbar89 [ Пн янв 29, 2018 2:18 am ]
Заголовок сообщения:  Re: Помогите новичку

С dq не собирается, но если заменить на dd то тогда работает как надо. movzx ebx, byte[iter] не заработал.

Автор:  theonlymirage [ Пн янв 29, 2018 2:37 am ]
Заголовок сообщения:  Re: Помогите новичку

barbar89 писал(а):
С dq не собирается, но если заменить на dd то тогда работает как надо. movzx ebx, byte[iter] не заработал.


Да, всё правильно размер dd 4 байта, dq 8 байт. Это я перепутал.
P.S. Исправил в посте выше.

Автор:  barbar89 [ Ср янв 31, 2018 5:01 am ]
Заголовок сообщения:  Re: Помогите новичку

Вот например функция 37 возвращает значение eax = x*65536 + y, а как собственно вычленить x и y? Алгебра подсказывает что у этого уравнения множество решений.

Автор:  theonlymirage [ Ср янв 31, 2018 5:26 am ]
Заголовок сообщения:  Re: Помогите новичку

barbar89 писал(а):
Вот например функция 37 возвращает значение eax = x*65536 + y, а как собственно вычленить x и y? Алгебра подсказывает что у этого уравнения множество решений.

Сдвигами =) Смотри например shl, shr и примеры в SVN.
Одно значение из младших разрядов берёшь сразу из регистра ax, а второе сдвигом.

Примерно так:
Код:
mov ebx, 0
mov bx, ax ;теперь y в ebx
shr eax, 16 ;теперь x в eax


Если ты хочешь оставить в eax только y, то вот так:
Код:
shl eax, 16
shr eax, 16

Автор:  0CodErr [ Ср янв 31, 2018 10:33 pm ]
Заголовок сообщения:  Re: Помогите новичку

barbar89 писал(а):
Вот например функция 37 возвращает значение eax = x*65536 + y, а как собственно вычленить x и y? Алгебра подсказывает что у этого уравнения множество решений.
Как было уже не раз сказано, наша документация оставляет желать лучшего.
Вот это eax = x*65536 + y следует читать как старшее слово регистра eax содержит x, а младшее содержит y.
theonlymirage писал(а):
Если ты хочешь оставить в eax только y, то вот так:
Код:

shl eax, 16
shr eax, 16
а если хочешь сделать меньше лишних действий, то
Код:
and eax, 0x0000ffff

Страница 74 из 74 Часовой пояс: UTC+03:00
Powered by phpBB® Forum Software © phpBB Limited
https://www.phpbb.com/