прошу помоч с прогой для курсовика. я ее написал, но я очень слабо владею асемблером если кто-нибудь может проверить и подправить прогу Задача____ Требуется создать линейный массив двоичных чисел и в нем выделить числа, имеющие не более 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 очень прошу помочь и очень срочно в пятницу здавать
Zyker Вопрос: какой ассемблер TASM, MASM, NASM, FASM? "3-го разряда, равного 0" -- наверное подразумевается 3-ий бит в числе? судя по строке "ORG 100H" требуется COM-файл под DOS и предположительно, что разрядность 16. Код (Text): .code mov cx,num mov si,offset MASA mov di,offset MASB cld a1: lodsw test ax,0000000000001000b; проверяем нет ли 0 в 3-ем бите jz a2 test ax,0000000000000100b; проверяем нет ли 0 во 2-ом бите jz a2 test ax,0000000000000010b; проверяем нет ли 0 в 1-ом бите jz a2 test ax,0000000000000001b; проверяем нет ли 0 в 0-ом бите jnz a3 a2: stosw; пересылаем найденный элемент в массив MASB a3: dec cx; уменьшаем счетчик jnz a1; если в счетчике не ноль переходим к следующему элементу массива MASA .... MASA dw 1001h,1002h,1003h,1004h,1005h; исходный массив num equ ($-MASA)/2; количество элементов в массиве MASA MASB dw num (0); место под числа, имеющие не более 3-го разряда, равного 0
Assault Спасибо, за подсказку, но как правило, студентам дают 16-разрядный TASM под DOS фраза "я очень слабо владею асемблером" и использование 386 инструкций может навести преподавателя на нехорошие мысли Судя по названию топика, у него вообще проблема с языками
Т.е. нам нужно, чтобы в битах с 0го по третий был хотя бы один ноль? тогда так: ElemNumber - это константа. Объявить предварительно. Равна числу элементов в массиве. На входе : si - указатель на входной массив di - указатель на выходной массив cx - количество элементов в массиве Код (Text): mov cx, ElemNumber mov di, offset MASB mov si, offset MASA NextElement: jcxz Finish dec cx lodsw ;read element mov dx, ax and dx, 0Fh cmp dl, 0Fh ;if dl != 0x1111b jz NextElement stosw ;write element jmp NextElement Finish:
Assault содержимое ax нужно пушить/попить иначе в новый массив попадают элементы с битами от 15 до 4 равные нулю, либо передать содержимое ax например в bx или dx и and bx, 0Fh/cmp bl, 0Fh как вариант можно использовать shr bx,1/jc
Еще варианты решения 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
Mikl__ Вот что смущает: но это все ИМХО (человек слабо владеет ассемблером, но пользуется такой инструкцией) Название регистра... Использование #
crypto это скорее говорит о том, что человек не знает о RET,INT 20h,MOV AX,4C00h/INT 21h, exit0, а выдумывает псевдоязык на ходу, не придерживаясь даже своих правил. Assault Команда HLT (код 76h) была уже в i8080 в Z80 и в MC6800 (код не знаю), а они с х86 несовместимы
привет ребят огромное спасибо за помошь просто супер дело в том , что я использую 32 битную систему. мне нужно проверить 3 бит в числе не равен ли он 0 причем нужно подправить именно мою прогу потому что используются только эти команды. либо написать другую, попроше, но с использованием этих команд. вообше у меня в курсовике идет разработка оборудования и языка к нему поэтому команды брались чутьли не с потолка . вот такая вот фигня, а язык я учил чисто сам потому что у нас его не преподовали
Zyker Всегда упрощай задачу, а не усложняй (С) Зачем придумывать свой язык? Можно обойтись готовыми. Бери готовый асм-синтаксис. если уж очень нужно - пиши свой компилятор. Но не язык. Это куда проще, чем изобретать велосипед. Проверить третий бит можно так: bt ax, 3 jz m1 т.е. если третий бит в регистре ах равен нулю, то переходим на метку m1 Отсчет битов начинается с нулевого А так... если все же нужно на твоем языке, то сперва напиши к языку спецификацию. К оборудованию тоже.
Magnum я не придумывал язык. я взял команды из асемблера. по сути в моей проге нужно сделать правильно масив и маску а остальное и так сойдет так как взята уже сданная прога. в нее нужно добавить 2 масива (исходный и создаваемый), и маску я не знаю как правильно это сделать и логически все связать. прогу даже не будут компилировать и запускать .ее проверят только по бумажке ребят если сможите помогите ну очень нужно