Положить символ в ячейку памяти по адресу из cl (FASM)

Тема в разделе "WASM.BEGINNERS", создана пользователем AxXxB, 26 сен 2008.

  1. AxXxB

    AxXxB New Member

    Публикаций:
    0
    Регистрация:
    9 апр 2008
    Сообщения:
    13
    Опять я со своими тупыми вопросами)

    Конструкция типа "mov byte [cl], '$'" не работает - "Error: reserved word used as symbol". приходится делать "xor eсx,eсx" и после записи в cl писать "mov byte [ecx], '$'", что в сумме занимает целых 7 байт) Есть ли какой-нибудь другой вариант записи?
     
  2. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    fasm тут ни причём - это интел не предусмотрела такую бессмысленную конструкцию как адресация памяти через 8 битный регистр ;)
     
  3. AxXxB

    AxXxB New Member

    Публикаций:
    0
    Регистрация:
    9 апр 2008
    Сообщения:
    13
    Чьорд, значит, прога будет весить на пару десятков байт больше, чем хотелось бы) Хотя хорошо еще, что через ecx работает) Спасибо за ответ)
     
  4. _basmp_

    _basmp_ New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2005
    Сообщения:
    2.939
    А что должно?

    movzx ecx,cl ; 0F B6 C9
    mov byte [ecx], '$' ; C6 01 '$'

    6 байт

    movzx esp,cl ; 0F B6 E1
    push '$' ; 6A '$'

    5 байт

    если бы вы сохраняли al можно было бы обойтись и 4-мя
    movzx edi,cl
    stosb

    итд
     
  5. sysenter

    sysenter New Member

    Публикаций:
    0
    Регистрация:
    23 сен 2008
    Сообщения:
    1
    _basmp_
    имхо ты гробишь esp в примере
    movzx esp,cl ; 0F B6 E1
    push '$' ; 6A '$'
     
  6. _basmp_

    _basmp_ New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2005
    Сообщения:
    2.939
    sysenter
    В зависимости от ситуации это может быть не важно. Например, куча сохранений в вектор, но без обращений к стеку. push esp тут не только сохранит, но и сдвинет. А на концах участка mov A,esp ... mov esp,A. Где А - регистр или стат переменнная.
     
  7. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    Не надо было писать
    cl db 0
     
  8. onSide

    onSide New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2008
    Сообщения:
    476
    Одним байтом можно максимум 0FFh адресовать, запись туда вроде запрещена..
     
  9. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    AxXxB
    Не понятно, что ты пишешь, может быть драйвер какого-то нестандартного устройства с 256 байтами памяти на борту, но:
    1) если у тебя есть неизменяемый базовый адрес, а данные должны размещаться вокруг него на растоянии ±127 байт -- можно использовать mov byte ptr[ecx+23h],'$' (0C6412324h - 4 байта) или
    mov byte ptr[ecx-23h],'$' (0C641DD24h)
    2) можно писать в порт, по большому счету порты это тоже ячейки памяти (адресация напрямую до 255 байт) mov al,'$'/out 23h,al (0B024h.0E623h - 4 байта) либо вариант через dx (адресация до 65535 байт) т.е mov dx,23/mov al,'$'/out dx,al (0BA2300h.0B024h.0EEh - 6 байт)
    3) Со времен Intel-8086 объем памяти намного больше чем 256 байт, поэтому адресоваться можно, как минимум к слову т.е mov byte ptr [bx],'$' (хотя на самом деле здесь неявно присутствует префикс ds: поэтому адресация здесь определяется не 16, а 20 разрядами, то есть адресуемся в пределах 1048576 байт), да и косвенно обратиться в 16-битном режиме через cl/cx нельзя, а можна только через регистры bx, bp, di, si