После выполнения команды xlat, регистр AL будет содержать не число 0Сh, а ASCII-код буквы «С».
Стр 1 из 14Следующая ⇒ Лекция №8. Массивы, структуры, записи, объединения Пересылка данных с помощью команды xlat
Помещает в AL байт из таблицы в памяти по адресу ES:BX (или ES:EBX) со смещением относительно начала таблицы, равным AL. В качестве аргумента для XLAT в ассемблере можно указать имя таблицы, но эта информация никак не используется процессором и служит только как комментарий. Если этот комментарий не нужен, можно применить форму записи XLATB.
Пример: Преобразовать шестнадцатеричное число в ASCII-код соответствующего ему символа: Data htable db "0123456789ABCDEF" Code …. Mov al,0Ch Mov bx, offset htable Xlat После выполнения команды xlat, регистр AL будет содержать не число 0Сh, а ASCII-код буквы «С». Пример 3: Заполнить массив из 30-ти элементов размером в байт значениями индексов. Вывести массив на экран в одну строку, учитывая, что элементы массива максимум двухзначные числа.
.386 .model flat, stdcall includelib import32.lib extrn ExitProcess:PROC extrn MessageBoxA:PROC .data Ttl db 'Massiv',0h mas db 30 dup (?); 32 элементов массива + 10 символов +переходы на ; следующую строчку 2 байта 0ah,0dh db 0ah mes1 db 'Massiv: ',0ah,0dh masVivod db 85 dup (?); 10 элементов массива + 10 символов +переходы на ; следующую строчку 2 байта 0ah,0dh i db 0 N db 30 tabl db 30h,31h,32h,33h,34h,35h,36h,37h,38h,39h .code start: xor ecx,ecx;обнуление есx xor edx,edx mov cl,N;значение счетчика цикла в cl mov esi, 0;индекс начального элемента в si ;------------------------------------------------------------------------------------------------- ; Заполнение элементов массива значениями их индексов go: mov bh,i mov mas[esi],bh inc esi inc i loopnz go ;-------------------------------------------------------------------------------------------------
mov cl,N mov edi,0 mov esi,0 ;-------------------------------------------------------------------------------------------------
; Проверяем число больше или равно 10, если «да», то уходим на метку met1 и ; выводим его как двузначное число. Если число меньше 10 (однозначное), ; то уходим на метку met2. go1:; цикл инициализации xor eax,eax mov al,mas[edi] cmp al,0ah jae met1 jmp met2 ;------------------------------------------------------------------------------------------------- ; Формируем двузначное число в массив masVivod. Делим его на 10, чтобы ; отделить первую цифру и получить одну цифру в остатке. Переводим первую ; цифру и остаток в ASCII код met1: mov bl,10 div bl mov ebx, offset tabl xlat mov masVivod[esi],al inc esi mov al,ah xlat mov masVivod[esi],al jmp met3 ;------------------------------------------------------------------------------------------------- ; Если число однозначное, то заменяем число на символ ; числа и записываем символ числа (ASCII код числа) в регистр al met2:
mov ebx, offset tabl xlat mov masVivod[esi],al ;------------------------------------------------------------------------------------------------- ; Ставим после числа символ «;» и наращиваем индексы met3: inc esi mov masVivod[esi],';' inc esi inc edi loopnz go1 mov masVivod[esi],0h ;вывод на экран получившегося массива push 0h push offset Ttl push offset mes1 push 0h call MessageBoxA push 0h call ExitProcess end start Результат: Пример 5: Вывести в одну строку все значения элементов массива, учитывая, что значения элементов массива могут быть трёхзначными и имеют размер в один байт. Значение элементов массива сформировать как i*k, i=k. .386 .model flat, stdcall includelib import32.lib extrn ExitProcess:PROC extrn MessageBoxA:PROC .data Ttl db 'Massiv',0h mas db 30 dup (?); 32 элементов массива + 10 символов +переходы на ; следующую строчку 2 байта 0ah,0dh mes1 db 'Massiv: ',0ah,0dh masVivod db 85 dup (?); 10 элементов массива + 10 символов +переходы на ; следующую строчку 2 байта 0ah,0dh i db 0 k db 0 N db 16; Максимальное значение элемента массива 15*15=225 tabl db 30h,31h,32h,33h,34h,35h,36h,37h,38h,39h .code start: xor ecx,ecx xor edx,edx mov cl,N mov esi, 0
go: mov bl,i mov al,k mul bl mov mas[esi],al inc esi inc i inc k loopnz go
mov cl,N mov edi,0 mov esi,0 ; ---------------------------------------------------------------------------------------------- ; Проверяем число. Если оно однозначное, то уходим на метку met2. Если число
; двухзначное, то уходим на метку met1. Если число трёхзначное, то продолжаем ; выполнять код программы. go1: xor eax,eax mov al,mas[edi] cmp al,0ah jb met2 cmp al,64h jb met1
; Если число трёхзначное, то делим его на 10, чтобы ; получить две первых цифры числа и остаток. Заносим в регистр целую часть от деления ; а остаток переводим в ASCII код. Оставшиеся две цифры числа (целую часть от ; деления) сохраняем в регистре ah и переходим на метку met4.
mov bl,10 div bl mov ebx, offset tabl xchg al,ah xlat mov masVivod[esi+2],al mov al,ah xor ah,ah jmp met4 ; --------------------------------------------------------------------------------------------- ; Если число двухзначное, то делим его на 10, чтобы ; получить первую цифру числа и остаток. Заносим в память первую цифру и ; остаток.
met1: mov bl,10 div bl mov ebx, offset tabl xchg al,ah xlat mov masVivod[esi+1],al
mov al,ah xlat mov masVivod[esi],al inc esi jmp met3
met4: mov bl,10 div bl mov ebx, offset tabl xchg al,ah xlat mov masVivod[esi+1],al
mov al,ah xlat mov masVivod[esi],al inc esi inc esi jmp met3 ; ---------------------------------------------------------------------------------------------- ; Имеем однозначное число. Записываем ASCII код этого числа в память. met2: mov ebx, offset tabl xlat mov masVivod[esi],al ; ---------------------------------------------------------------------------------------------- ; Ставим после числа в памяти символ «;» в качестве разделителя. met3: inc esi mov masVivod[esi],';' inc esi inc edi
loop go1
mov masVivod[esi],0h ;------------------------------------------------------------ ;вывод на экран получившегося массива push 0h push offset Ttl push offset mes1 push 0h call MessageBoxA push 0h call ExitProcess end start Результат: _______________________________________________________________ Самостоятельно на практике: Вывести все значения элементов массива в несколько строк. В каждой строке должно быть по 5 элементов массива. Значения элементов массива могут быть трёхзначными размером в байт.
Воспользуйтесь поиском по сайту: ![]() ©2015 - 2025 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|