Консультация № 108593
08.11.2007, 18:07
0.00 руб.
0 2 2
Найти значение регистров после выполнения программы
Начальное значения регистров: ax= 9A13h, bx =0CBD5h, cx=0000h, dx=0AECh
Дан фрагмент программы на ассемблере:
push AX
shr BX,1
pop CX
add CX,BX
not CX
lb1: add BX,3
loop lb1
or AX,DX

Обсуждение

давно
Старший Модератор
31795
6196
08.11.2007, 18:54
общий
это ответ
Здравствуйте, Валерий Сергеевич Жижин!

AX=09AFFh
BX=065F0h
CX=00000h
DX=00AECh

Удачи!
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Неизвестный
11.11.2007, 10:15
общий
это ответ
Здравствуйте, Валерий Сергеевич Жижин!
Привожу приложение, которое показывает в данном примере как изменяются значение регистров при выполнение исходного фрагмента

Удачи

Приложение:
title Вопрос 108593;Текст вопроса:; Найти значение регистров после выполнения программы.286; ЦветаLIGHTGREEN equ 10 ;зеленыйLIGHTRED equ 12 ;красныйYELLOW equ 14 ;желтыйWHITE equ 15 ;белый stacksg segment stack dw 100h dup(?)stacksg endsdata segment text1 db WHITE,0,0,‘Начальное значение регистров перед в ходом в фрагмент программы‘,0 db YELLOW,1,0,‘ax = 9A13h, bx = CBD5h, cx = 0000h, dx = 0AECh‘,0 db WHITE,3,4,‘Фрагмент программы: >> указывает на начало текущей команды‘,0 db WHITE,4,4,‘push AX‘,0 db WHITE,5,4,‘shr BX,1‘,0 db WHITE,6,4,‘pop CX‘,0 db WHITE,7,4,‘add CX,BX‘,0 db WHITE,8,4,‘not CX‘,0 db WHITE,9,4,‘lb1: add BX,3‘,0 db WHITE,10,4,‘loop lb1‘,0 db WHITE,11,4,‘or AX,DX‘,0 text2 db LIGHTGREEN,4,1,‘>>‘,0 rax db WHITE,23,0,‘ax = ‘,0 db LIGHTGREEN,23,6,‘0000h‘,0 rbx db WHITE,23,15,‘bx = ‘,0 db LIGHTGREEN,23,21,‘0000h‘,0 rcx db WHITE,23,30,‘cx = ‘,0 db LIGHTGREEN,23,36,‘0000h‘,0 rdx db WHITE,23,45,‘dx = ‘,0 db LIGHTGREEN,23,51,‘0000h‘,0 text3 db LIGHTRED,24,0,‘Для продолжение нажмите любуч клавишу...‘,0 regabcd dw ?data ends assume cs:code,ds:datacode segmentbegin: ;Инициализация регистра ds mov ax,data mov ds,ax ;Установим текстовый режим mov ax,03h int 10h call cursor ;Спрячим курсор поместив его в 25-ю строку 0-й столбец mov cx,11 ;Выведим 11 строчек текста mov si,offset text1 ;Адрес начала текста@@B0: call stringout ;Процедура вывода цветного текста loop @@B0 ;--------------- Начало фрагмента программы mov ax,9a13h ; Сохраним начальные значения mov bx,0cbd5h ; регистров mov cx,0000h ; mov dx,0aech ; ;--------------- mov si,offset text2 ;Позиция указателя ">>" call abcdout ;Вывод на экран значения регистров ax,bx,cx,dx push ax ; <-- Строка программы mov si,offset text2 ;Позиция указателя ">>" inc [text2+1] call abcdout ;Вывод на экран значения регистров ax,bx,cx,dx shr bx,1 ; <-- Строка программы mov si,offset text2 ;Позиция указателя ">>" inc [text2+1] call abcdout ;Вывод на экран значения регистров ax,bx,cx,dx pop cx ; <-- Строка программы mov si,offset text2 ;Позиция указателя ">>" inc [text2+1] call abcdout ;Вывод на экран значения регистров ax,bx,cx,dx add cx,bx ; <-- Строка программы mov si,offset text2 ;Позиция указателя ">>" inc [text2+1] call abcdout ;Вывод на экран значения регистров ax,bx,cx,dx not cx ; <-- Строка программы mov si,offset text2 ;Позиция указателя ">>" inc [text2+1] call abcdout ;Вывод на экран значения регистров ax,bx,cx,dx mov si,offset text2 ;Позиция указателя ">>" inc [text2+1]lb1: add bx,3 ; <-- Строка программы call abcdout ;Вывод на экран значения регистров ax,bx,cx,dx loop lb1 ; <-- Строка программы mov si,offset text2 ;Позиция указателя ">>" inc [text2+1] call abcdout ;Вывод на экран значения регистров ax,bx,cx,dx or ax,dx ; <-- Строка программы mov si,offset text2 ;Позиция указателя ">>" inc [text2+1] call abcdout ;Вывод на экран значения регистров ax,bx,cx,dx mov ah,4ch int 21h ;**************************************************************;* ПРОЦЕДУРА ОТВЕЧАЮЩАЯ ЗА ВЫВОД *;* НА ЭКРАН ОКОНЧАТЕЛЬНЫХ РЕЗУЛЬТАТОВ *;**************************************************************abcdout proc call stringout mov regabcd,ax mov si,offset rax call asciireg call stringout call stringout mov regabcd,bx mov si,offset rbx call asciireg call stringout call stringout mov regabcd,cx mov si,offset rcx call asciireg call stringout call stringout mov regabcd,dx mov si,offset rdx call asciireg call stringout call stringout mov si,offset text3 call stringout push ax ;Сохраним ax mov ah,0 ;так как при выполнение этой функции int 16h ;изменяется регистр ax pop ax retabcdout endp;**************************************************************;* ПЕРЕВОД В ЗНАЧЕНИЕ ЧИСЛА В ASCII - КОД *;**************************************************************asciireg proc push ax mov ax,regabcd ;в ax - значение регистра shr ah,4 ;старший разряд сдвиг в право на 4 or ah,30h ;допишим первую цифру 3 cmp ah,39h ;если ascii-код от нуля до девяти то переход и запись первой цифры jbe @@A0 ;если ascii-код больше 39h add ah,7 ;то прибавим 7 получим ascii-код (A,B,C,D,E,F)@@A0: mov byte ptr [si+12],ah ;Запись первой цифры mov ax,regabcd ;востановим ax and ah,0fh ;обнулим старшие четыре разряда ah or ah,30h ;теперь по старой схеме смотри выше cmp ah,39h jbe @@A1 add ah,7@@A1: mov byte ptr [si+13],ah mov ax,regabcd ;следующие 2 блока для al аналогично shr al,4 or al,30h cmp al,39h jbe @@A2 add al,7@@A2: mov byte ptr [si+14],al mov ax,regabcd and al,0fh or al,30h cmp al,39h jbe @@A3 add al,7@@A3: mov byte ptr [si+15],al pop ax retasciireg endp;**************************************************************;* ВЫВОД ЦВЕТНОГО ТЕКСТА *;* ИСПОЛЬЗУЕТСЯ ПРЯМАЯ ЗАПИСЬ В ВИДЕОПАМЯТЬ *;* Параметры: *;* 1-й байт - цвет символа *;* 2-й байт - номер строки *;* 3-й байт - номер столбца *;* далие текст заканчивающийся нулем. *;* Адрес начала строки DS:SI *;************************************************************** stringout proc push ax push bx push 0b800h pop es ;Устанавливаем ES на начало видиопамяти cld ;Строковые операции в сторону старших адресов lodsb ;1-байт в al - цвет mov bh,al lodsb ;2-байт в al - номер строки mov ah,160 mul ah ;ax = al*80*2; 80 колонок в строке умножить на 2 байта mov di,ax ;сохраним в DI xor ah,ah ;обнулим ah lodsb ;в al - номер столбца add di,ax ;дважды прибавим к DI add di,ax mov ah,bh ;цвет в ah@@S0: lodsb ;в al - символ текста cmp al,0 ; если не ноль je @@S1 stosw ;то запись в видеобуфер jmp short @@S0 @@S1: pop bx pop ax retstringout endp;**************************************************************;* ПРОЦЕДУРА УПРАВЛЕНИЕМ КУРСОРА *;* Используется регистры видиоконтроллера 3D4H *;**************************************************************cursor proc pusha mov al,25 ;25 строка mov ah,80 ;80 колонок в строке mul ah ;ax = 25*80 координаты кустора 25-я строка 0-й столбец mov bl,al ;сохраним младшый разряд курсора mov dx,03d4h;регистр управления позицией курсора mov al,0eh ;запись координаты старшей части курсора out dx,ax ;запись в регистр inc al ;в al=0fh запись координаты младшей позиции курсора mov ah,bl ;в ah младший разряд координаты курсора out dx,ax ;запись в регистр popa retcursor endpcode ends end begin
Форма ответа