ищу помощь

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

  1. Zyker

    Zyker New Member

    Публикаций:
    0
    Регистрация:
    29 янв 2008
    Сообщения:
    5
    прошу помоч с прогой для курсовика. я ее написал, но я очень слабо владею асемблером если кто-нибудь может проверить и подправить прогу

    Задача____
    Требуется создать линейный массив двоичных чисел и в нем выделить числа, имеющие не более 3-го разряда, равного 0.Выделенные числа переместить в новый массив.



    Прога_______


    ORG 100H
    START ;
    ORG 110H
    NEXT ;
    ORG 120H
    M1 ;
    ORG 1000H
    MASA 1001H,1002H,1003H,1004H,1005H;
    ORG 1100H
    MASB 1101H,1102H,1103H,1104H,1105H;

    START: Read [Rk] ; читаем i-ый элемент исходного массива (Ai) в аккумулятор Akk
    AND MASKA ; логически умножаем Akk на маску MASKA
    CMP #0 ; сравниваем значение Akk с нулем
    JZ M2 ; если в Akk нуль, то переходим на метку М2 ,если нет, то
    JMP M1 ; переходим на метку M1
    NEXT: Read R4 ;|
    ADD #4 ;} переходим к следующему элементу нового массива В
    WR R4 ;|
    Read R2 ;|
    ADD #4 ;} переходим к следующему элементу исходного массива А
    WR R2 ;|
    CMP R3 ;проверяем, не вышли ли мы за пределы исходного массива
    JZ exit ;если вышли, то переходим на метку exit
    JMP start ;иначе переходим на метку start

    EXIT: HLT ;останов Тп=0

    M1: Read R1 ;|
    ADD #1 ;}увеличиваем значение счетчика обнуленных элементов на 1
    WR R1 ;|
    Read #0 ;}записываем i-ый элемент нового массива (Bi) значение 0
    WR [Rk] ;}
    JMP NEXT ;переходим на метку next

    M2: WR [Rk] ;
    JMP NEXT ;переходим на метку next


    очень прошу помочь и очень срочно в пятницу здавать
     
  2. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    Zyker
    Вопрос: какой ассемблер TASM, MASM, NASM, FASM?
    "3-го разряда, равного 0" -- наверное подразумевается 3-ий бит в числе?
    судя по строке "ORG 100H" требуется COM-файл под DOS и предположительно, что разрядность 16.
    Код (Text):
    1. .code
    2.      mov cx,num
    3.      mov si,offset MASA
    4.      mov di,offset MASB
    5.      cld
    6. a1: lodsw
    7.      test ax,0000000000001000b; проверяем нет ли 0 в 3-ем бите
    8.      jz a2
    9.      test ax,0000000000000100b; проверяем нет ли 0 во 2-ом бите
    10.      jz a2
    11.      test ax,0000000000000010b; проверяем нет ли 0 в 1-ом бите
    12.      jz a2
    13.      test ax,0000000000000001b; проверяем нет ли 0 в 0-ом бите
    14.      jnz a3    
    15. a2: stosw; пересылаем найденный элемент в массив MASB
    16. a3: dec cx; уменьшаем счетчик
    17.      jnz a1; если в счетчике не ноль переходим к следующему элементу массива MASA
    18.      ....
    19.  
    20. MASA dw 1001h,1002h,1003h,1004h,1005h; исходный массив
    21. num equ ($-MASA)/2; количество элементов в массиве MASA
    22. MASB dw num (0); место под числа, имеющие не более 3-го разряда, равного 0
     
  3. Assault

    Assault New Member

    Публикаций:
    0
    Регистрация:
    28 янв 2008
    Сообщения:
    42
    Mikl__
    юзай bt :)

     
  4. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    Assault
    Спасибо, за подсказку, но как правило, студентам дают 16-разрядный TASM под DOS
    фраза "я очень слабо владею асемблером" и использование 386 инструкций может навести преподавателя на нехорошие мысли:)
    Судя по названию топика, у него вообще проблема с языками:)
     
  5. Assault

    Assault New Member

    Публикаций:
    0
    Регистрация:
    28 янв 2008
    Сообщения:
    42
    Т.е. нам нужно, чтобы в битах с 0го по третий был хотя бы один ноль?

    тогда так:

    ElemNumber - это константа. Объявить предварительно.
    Равна числу элементов в массиве.
    На входе :
    si - указатель на входной массив
    di - указатель на выходной массив
    cx - количество элементов в массиве

    Код (Text):
    1.     mov cx, ElemNumber
    2.     mov di, offset MASB
    3.     mov si, offset MASA
    4. NextElement:
    5.     jcxz Finish
    6.     dec cx
    7.     lodsw                      ;read element
    8.     mov dx, ax
    9.     and dx, 0Fh
    10.     cmp dl, 0Fh              ;if dl != 0x1111b
    11.     jz NextElement    
    12.     stosw                      ;write element
    13.     jmp NextElement
    14. Finish:
     
  6. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    Assault
    содержимое ax нужно пушить/попить иначе в новый массив попадают элементы с битами от 15 до 4 равные нулю, либо передать содержимое ax например в bx или dx и and bx, 0Fh/cmp bl, 0Fh
    как вариант можно использовать shr bx,1/jc
     
  7. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    Еще варианты решения
    1) выделение крайнего справа нулевого бита
    10100111->0001000
    Y=(NOT X) AND (X+1)
    TEST Y,Y ; Y это какой-нибудь регистр
    JZ EXIT; нет нулевых битов совсем
    CMP Y,4
    JA EXIT; нет нулевых битов в 3, 2, 1, 0 битах
    2) использовать команду BSF для определения позиции крайних справа единичных битов. Найдем номер крайнего справа бита в регистре EBX содержащего единицу
    BSF ECX,EBX
    JZ EXIT; если единичных битов нет, флаг ZF устанавливается в 1
    CMP ECX,4
    JA EXIT; единичные биты в разрядах больших 3-его бита
    3) если использовать команду BSF нельзя
    PUSH EBX
    OR ECX,-1
    a1: SHR EBX,1
    CMP ECX,32
    JE EXIT
    INC ECX
    JNC a1;в ECX номер крайнего правого бита в регистре EBX содержащего единицу
    POP EBX
    4) найдем номер крайнего справа бита в регистре EBX, содержащего ноль
    MOV EBX,8004h
    NOT EBX
    BSF ECX,EBX;ECX=0 в ECX номер крайнего правого единичного бита
    NOT EBX;теперь в ECX номер крайнего правого нулевого бита
    выделение крайнего справа единичного бита в регистре EBX
    MOV EBX,8004h;1000.0000.0000.0100b
    MOV EAX,EBX
    NEG EAX;EAX=0FFFF7FFCh
    AND EAX,EBX;EAX=4=0000.0000.0000.0100b
     
  8. Assault

    Assault New Member

    Публикаций:
    0
    Регистрация:
    28 янв 2008
    Сообщения:
    42
    Mikl__
    +1
    исправлено
     
  9. zet

    zet New Member

    Публикаций:
    0
    Регистрация:
    15 окт 2007
    Сообщения:
    121
    А вы уверены, что программа для x86?
     
  10. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    zet
    На MPASM не похоже, на синтаксис AT&T тоже, диплома телепата у меня нет, топикстартер молчит...
     
  11. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    zet
    Действительно, странный код. Я сначала даже подумал, что это некий псевдоалгоритм.
     
  12. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    crypto
    Фраза "но я очень слабо владею асемблером" ни о чем не говорит?
     
  13. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    Быть может это асм для некоего МК?
     
  14. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    Mikl__
    Вот что смущает: но это все ИМХО
    (человек слабо владеет ассемблером, но пользуется такой инструкцией)
    Название регистра...
    Использование #
     
  15. Assault

    Assault New Member

    Публикаций:
    0
    Регистрация:
    28 янв 2008
    Сообщения:
    42
    Т.е. наш процессор судя по всему в любом случае совместим с 386м...
     
  16. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    crypto
    это скорее говорит о том, что человек не знает о RET,INT 20h,MOV AX,4C00h/INT 21h, exit0, а выдумывает псевдоязык на ходу, не придерживаясь даже своих правил.
    Assault
    Команда HLT (код 76h) была уже в i8080 в Z80 и в MC6800 (код не знаю), а они с х86 несовместимы:dntknw:
     
  17. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    Mikl__
    Так мы долго гадать будем, подождем, пока вернется топикстартер.
     
  18. Zyker

    Zyker New Member

    Публикаций:
    0
    Регистрация:
    29 янв 2008
    Сообщения:
    5
    привет ребят огромное спасибо за помошь просто супер
    дело в том , что я использую 32 битную систему. мне нужно проверить 3 бит в числе не равен ли он 0 причем нужно подправить именно мою прогу потому что используются только эти команды. либо написать другую, попроше, но с использованием этих команд.
    вообше у меня в курсовике идет разработка оборудования и языка к нему поэтому команды брались чутьли не с потолка . вот такая вот фигня, а язык я учил чисто сам потому что у нас его не преподовали
     
  19. Magnum

    Magnum New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2007
    Сообщения:
    925
    Zyker
    Всегда упрощай задачу, а не усложняй (С)
    Зачем придумывать свой язык? Можно обойтись готовыми.
    Бери готовый асм-синтаксис. если уж очень нужно - пиши свой компилятор. Но не язык.
    Это куда проще, чем изобретать велосипед.
    Проверить третий бит можно так:

    bt ax, 3
    jz m1

    т.е. если третий бит в регистре ах равен нулю, то переходим на метку m1
    Отсчет битов начинается с нулевого

    А так...
    если все же нужно на твоем языке, то сперва напиши к языку спецификацию. К оборудованию тоже.
     
  20. Zyker

    Zyker New Member

    Публикаций:
    0
    Регистрация:
    29 янв 2008
    Сообщения:
    5
    Magnum
    я не придумывал язык. я взял команды из асемблера. по сути в моей проге нужно сделать правильно масив и маску а остальное и так сойдет так как взята уже сданная прога. в нее нужно добавить 2 масива (исходный и создаваемый), и маску я не знаю как правильно это сделать и логически все связать. прогу даже не будут компилировать и запускать .ее проверят только по бумажке

    ребят если сможите помогите ну очень нужно