Size: a a a

Ассемблер

2020 October 05

DR

Dima Richev in Ассемблер
Понял ошибку.
источник

DR

Dima Richev in Ассемблер
Тупой, вместо eax всунул edi, не знаю почему...
источник

DR

Dima Richev in Ассемблер
Saenro T
Ну, как-то так:


proc SayM
mov ax, 0
nextch:
mov si, dx
add si, eax
mov di, dx
mov byte al, [edi]
.....
rep movsb
mov byte di, [al]
cmp di, 0x0
je end
inc ax
mov ah, 0x0e
mov al, di
int 0x10
jmp nextch
end:
xor ax, ax
endp

mov dx, [say_casino]
call SayM
mov dx, [say_getstr]
call SayM

mov dx, 0
next_get_ch:
cmp [getnum], 0x0
mov ah, 00h
mov al, [getnum]
int 16h
jmp next_get_ch

xor dx, dx

mov dx, [fail_casino]
call SayM
cli
Вместо mov для define byte нужно было использовать lea, как
lea dx, [say_casino]
call SayM

Верно?
источник

ST

Saenro T in Ассемблер
если у тебя в аккумуляторе AL есть некий байт, то пихать его надо в соизмеримую ячейку памяти/памяти регистра.
Как-то так: MOV [DI], AL
т.к. по адресу DI находится соизмеримая с AL ячейка памяти.
Или брать в AL байт из ячейки памяти по адресу DI
MOV AL, [DI]
источник

DR

Dima Richev in Ассемблер
Saenro T
если у тебя в аккумуляторе AL есть некий байт, то пихать его надо в соизмеримую ячейку памяти/памяти регистра.
Как-то так: MOV [DI], AL
т.к. по адресу DI находится соизмеримая с AL ячейка памяти.
Или брать в AL байт из ячейки памяти по адресу DI
MOV AL, [DI]
Хорошо, спасибо. Понял основные ошибки.
источник

ST

Saenro T in Ассемблер
А если всё же нужно запихнуть байт в несколько байтов, тогда это уже MOVZX AX, byte [RAM] к примеру. Старший регистр AH обнулится при этом.
источник

DR

Dima Richev in Ассемблер
Saenro T
А если всё же нужно запихнуть байт в несколько байтов, тогда это уже MOVZX AX, byte [RAM] к примеру. Старший регистр AH обнулится при этом.
если
mov byte [eax], [al]

Нормально будет?
источник

ST

Saenro T in Ассемблер
Не нормально. А что ты хочешь сделать? Байт положить в ячейку памяти или поднять из ячейки в аккумулятор?
источник

DR

Dima Richev in Ассемблер
Saenro T
Не нормально. А что ты хочешь сделать? Байт положить в ячейку памяти или поднять из ячейки в аккумулятор?
Поднять из ячейки в аккумулятор
источник

ST

Saenro T in Ассемблер
mov al, [si] к примеру
источник

ST

Saenro T in Ассемблер
Или просто lodsb
источник

DR

Dima Richev in Ассемблер
Вот я использую код для получения символа строки:
lea eax, [text+0]
mov byte al, [eax]

С al работать не удобно, по этому я его перемещаю в аккумулятор

mov byte [eax], [al]

И теперь у меня в eax первый символ строки. Удобно.
источник

ST

Saenro T in Ассемблер
Нижняя часть работать не будет
источник

ST

Saenro T in Ассемблер
А верхняя правильно сработает всего раз
источник

ST

Saenro T in Ассемблер
Почитай на досуге про организацию регистров общего назначения
источник

DR

Dima Richev in Ассемблер
Dima Richev
Вот я использую код для получения символа строки:
lea eax, [text+0]
mov byte al, [eax]

С al работать не удобно, по этому я его перемещаю в аккумулятор

mov byte [eax], [al]

И теперь у меня в eax первый символ строки. Удобно.
Не так снова. Если передавать не значение, а адрес. Пришлось сесть за ПК.


Не важно, что под Windows. Думаю, это так же будет работать на BIOS, нет?
источник

s

s54816 in Ассемблер
Dima Richev
Вот я использую код для получения символа строки:
lea eax, [text+0]
mov byte al, [eax]

С al работать не удобно, по этому я его перемещаю в аккумулятор

mov byte [eax], [al]

И теперь у меня в eax первый символ строки. Удобно.
Квадратные скобки означают «взять адрес в скобках, прочитать по нему значение». Ты скорее всего хочешь movzx eax,al. Не знаю, зачем. От меня вообще ускользает смысл этого кода. Слова знакомые, смысла нет.
источник

DR

Dima Richev in Ассемблер
Dima Richev
Не так снова. Если передавать не значение, а адрес. Пришлось сесть за ПК.


Не важно, что под Windows. Думаю, это так же будет работать на BIOS, нет?
Знаю про цикл, не обращайте внимание
источник

DR

Dima Richev in Ассемблер
s54816
Квадратные скобки означают «взять адрес в скобках, прочитать по нему значение». Ты скорее всего хочешь movzx eax,al. Не знаю, зачем. От меня вообще ускользает смысл этого кода. Слова знакомые, смысла нет.
Возможно, я не настолько преисполнился в ассемблере, но мне кажется этот код правильным и удобным...
источник

DR

Dima Richev in Ассемблер
s54816
Квадратные скобки означают «взять адрес в скобках, прочитать по нему значение». Ты скорее всего хочешь movzx eax,al. Не знаю, зачем. От меня вообще ускользает смысл этого кода. Слова знакомые, смысла нет.
movzx eax, al

Преобразует al в define byte, и помещает в eax?
источник