Вариант: 1 Решил: Воронин Павел {a.k.a Pablito} Группа: 110 Проверяющие: Кацкова О.Н и Пильщиков В.Н. Оценка: 5 {баллов 54, но все найденные проверяющими ошибки исправлены} 1. а) Абсолютный адрес - номер ячейки, ощитанный от начала оперативной памяти. {звучит тупо, но это определение зачли как правильное :))} б) Неявный операнд - операнд, местоположение которого заранее известно и потому в команде явным образом не указывается. в) Близкий переход - переход внутри одного сегмента. 2. Команды выполнятся за 11 единиц времени. 3. SF=0, CF=1, OF=1 4. lea BX, T mov CL, [BX] xor CH, CH jcxz L mov SI, CX mov byte ptr [BX][SI], 'T' L: 5. mov AX, 31A8h mov ES, AX mov BP, SP xor SI,SI mov CX, 501h sub CX, SP L: mov AH, [BP][SI] mov ES:[SI], AH inc SI loop L 6. JDIF macro LN, M local L irp P, if P lt 0 cmp AX, P je L endif endm jmp M L: endm {если задача была решена без использования условного ассемблирования - например, с помощью cmp и команд перехода - то за задачу ставили 0 баллов} 7. неправильные команды: div 5 {нельзя делить на непосредственный операнд} mov ES, DS {если 1-ый операнд - сегментный регистр, то 2-ой - только r16 илиm16} add 800[SI], 15 {неясен размер операндов, нужно использовать ptr} test 11b, CL {1-ый операнд не может быть непосредственным} правильные команды: lea bx, [bx] {1-ый операнд - r16, 2-ой - адресное выражение, так что всё OK, правда смыслу, как в NOP :))} sub 15[SI], 800 {800 может быть только солвом, поэтому ptr здесь не нужно} 8. public P {процедура должна быть объявлена как общая} CODE segment {название сегмента команд - только CODE или CSEG} assume CS:CODE {в принципе, раз нет меток, то можно и без этого, но лучше написать - к этому придирались} P proc far {процедура должна быть объявлена как дальняя} push BP; сохраняем значение BP mov BP, SP; устанавливаем BP на вершину стека push DS; сохраняем значение DS mov BX, [BP+6]; BX:=offs mov AX, [BP+8]; AX:=seg mov DS, AX; устанавливаем DS на начало сегмента, в котором расположена переменная inc byte ptr [BX]; A:=chr((ord(A)+1)mod 256) {прикольно, но на асме смотрится проще, чем на паскакале} pop DS; восстанавливаем значение DS pop BP; восстанавливаем значение BP {вызываемая из паскакаля процедура может гадить любые регистры, кроме DS, SS, SP и BP, так что на AX и BX мы можем положить, что я и сделал} ret 4; возвращаемся и очищаем стек P endp CODE ends end {народ, не забудьте 2 последние строчки, на этом много кто порезался} 9. а) Внешние имена - имена, описанные вне данного модуля (в других модулях). В отличие от других имён, их адреса (сегменты и смещения) ассемблер определить не может и потому записывает нули на места их вхождения и заносит их в таблицу вхождения внешних имён, которую выносит в заголовок объектного модуля. б) Каждое внешнее имя, используемое в модуле, должно быть указано в директивах вида: extrn <имя>:<тип>{,<имя>:<тип>}. 10. Изменится 4-я строчка, она станет такой: (4) B8 27 01 8E. SS=2701h SP=0007h CS=2700h IP=0003h