№1 исправлено Пусть размер машинной ячейки равен 9 разрядам. Выписать в десятичной системе счисления наибольшее и наименьшее числа со знаком (в дополнительном коде) и числа без знака, представимые в такой ячейке. .........................наименьшее..............наибольшее беззнаковое.................0............111111111=2^10-1=511 знаковое 100000000=-2^8 = -256......011111111=2^8 - 1 = 255 №2 B dw ? ; С dw ? Выписать последовательность команд, реализующих присваивание: С:=50-(B div 9)*(B mod 9) mov C, 50 ; C := 50 mov bx, 9 mov ax, B mov dx, 0 ; := B div bx ; ax := B div 9; dx := B mod 9 mul dx ; := (B div 9)*(B mod 9), берем младшую часть sub C, ax ; С:=50-(B div 9)*(B mod 9) №3 ST segment stack Db 2000 dup (?) ST ends Если стек не пуст, изменить нижнее слово стека Х (число без знака) по правилу: Х:=2*Х+2. Регистры и остальные слова не портить. Возможное переполнение Х игнорировать. push bp ;запоминаем bp, sp := sp - 2 mov bp,sp cmp bp, 1998 ; если стек был пуст je KOH mov bp,0 ; устанавливаем на нижнее слово стека add [bp], word ptr [bp] ; X := X*2 add [bp], word ptr 2 ; X := X*2 + 2 KOH : pop bp №4 V db ? Вычеркните команды, записанные с ошибкой: Pop sp Inc [v] Cmp type v,1 <== первый операнд не переменная Sub byte ptr [DI],[SI] <== команда память/память Add v, byte ptr DX <== изменение размера регистра Mov ds, [BX] №5 Байт с абсолютным адресом 1357Сh содержит маленькую латинскую букву. Выписать последовательность команд на Ассемблере для записи в этот байт предыдущей по алфавиту группы; букву «а» заменить на «z». Регистры не сохранять. mov bx, 1357h ; устанавливаем сегмент mov ds, bx ;через промежуточный регистр mov bx, 12 ;устанавливаем смещение cmp [bx], 'a' ;если там буква 'a' jne M mov [bx], 'z' + 1 ;пишем туда код 'z', увеличенный на 1 M: dec [bx] ;пишем предыдущую букву №6 Описать процедуру Last2, который заменяет на 2 младшую значащую десятичную цифру параметра. Параметр – байт, число без знака, описан в одном из программных сегментов (данных, стека и кодовом). Процедура должна удовлетворять стандартным соглашениям о связях. Привести пример вызова процедуры. Здесь сказано, что переменная уже в сегменте, то есть переход ближний и процедура ближняя Пример вызова: lea ax, A push ax call Last2 Исходя из этого, составляем процедуру: Last2 proc near push bp mov bp,sp push ax push bx mov bp, [bp+4] ;устанавливаем ссылку - со стеком больше не работаем, можно использовать bp (либо другой сегмент, но так экономим один) mov al, ds:[bp] ;пересылаем содержимое mov ah,0 ;готовим к делению mov bl,10 ;на что делим div bl mul bl ;al := (al div 10)*10 - зануляеи младшую цифру add al,2 ;заменяем её на 2 mov ds:[bp],al ;пересылаем значение на нужное место pop bx pop ax pop ds pop bp ret 2 Last2 endp №7 Выписать полную программу на Ассемблере, которая вводит (по inint) неотрицательное число К и выводит ближайшее к К число, кратное 7. include io.asm st segment stack db 128 dup (?) st ends D segment K dw ? D ends code segment assume CS:code, DS:D start: mov ax, D mov ds, ax inint K ;вводим К mov ax, K mov dx, 0 ;готовим деление mov bx, 7 div bx ;в dx mod, в ax - div cmp dx, 4 ;если остаток больше 3 jb M inc ax ;"округляем" в большую сторону M: mul bx ;умножаем на 7 и получаем нужное число outword ax finish code ends end start №8 Пусть в сегментах модулей М1 и М2 описаны переменные X(word) и Y(word) соотв.сегменты, в которых описаны эти переменные. Выписать модуль (неголовной), в котором реализуется присваивание X:= X+Y. Extrn x:word, y:word C segment Assume cs:c Mov ax,seg x Mov ds,ax Mov ax,seg y Mov es,ax Mov ax,es:y Add x,ax C ends end №9 Ответить на следующие вопросы: А)Что может быть фактическим параметром макрокоманды? Фактическим параметром макрокоманды может быть любой текст, сбалансированный по кавычкам и угловым скобкам без пробелов, запятых и точек с запятой вне угловых скобок и кавычек. Б)Что происходит с параметрами при макровызове? при макровызове, формальные параметры макроса заменяются на фактические параметры макрокоманды. (?) №10 Описать макрос SHRIGHT Y, где Y- имя переменной размером в один, два или четыре байта. Макрос реализует сдвиг переменной Y на один разряд вправо. Диагностики об ошибках не выдавать. Макрорасширение не должно сожержать более двух предложений Ассемблера. shright macro Y if (type Y eq byte) or (type Y eq word) shr Y,1 endif if type Y eq dword shr word ptr Y+2, 1 ;сдвигаем старшую часть, остаток в CF rcr word ptr Y, 1 ;сдвигаем младшую часть через CF, слева "вылезает" остаток endif endm В итоге, в конечном макрорасширении будет как раз не более двух предложений.