В массиве слов заменить все отрицательные числа нулями - Assembler
Формулировка задачи:
Здравствуйте, в универе изучаем ассемблер, а я что-то настолько олень, что вообще в него не въезжаю... Можете помочь с парой задач? Очень желательно крайне подробное комментирование.
1. Заменить все отрицательные числа нулями. Массив слов.
Решение задачи: «В массиве слов заменить все отрицательные числа нулями»
textual
Листинг программы
LOCALS .model small .stack 100h .data A dw 1, 2, -3, 4, -5, -6, -7, 8 Len equ ($-A)/2 CrLf db 0Dh, 0Ah, '$' .code main proc mov ax, @data mov ds, ax call ShowArray mov cx, Len lea si, A mov ax, 0 @@For: test word ptr [si], -1 jns @@Next mov [si], ax @@Next: add si, 2 loop @@For call ShowArray mov ax, 4C00h int 21h main endp ;Выводит содержимое массива A на экран ShowArray proc push ax push si push cx push dx mov cx, Len lea si, A @@For: lodsw call Show_AX mov ah, 02h mov dl, ' ' int 21h loop @@For mov ah, 09h lea dx, CrLf int 21h pop dx pop cx pop si pop ax ret ShowArray endp ; выводит число из регистра AX на экран ; входные данные: ; ax - число для отображения Show_AX proc push ax push bx push cx push dx push di mov cx, 10 xor di, di ; di - кол. цифр в числе ; если число в ax отрицательное, то ;1) напечатать '-' ;2) сделать ax положительным or ax, ax jns @@Conv push ax mov dx, '-' mov ah, 2 ; ah - функция вывода символа на экран int 21h pop ax neg ax @@Conv: xor dx, dx div cx ; dl = num mod 10 add dl, '0' ; перевод в символьный формат inc di push dx ; складываем в стэк or ax, ax jnz @@Conv ; выводим из стэка на экран @@Show: pop dx ; dl = очередной символ mov ah, 2 ; ah - функция вывода символа на экран int 21h dec di ; повторяем пока di<>0 jnz @@Show pop di pop dx pop cx pop bx pop ax ret Show_AX endp end main
Объяснение кода листинга программы
- Предполагаемая задача: заменить все отрицательные числа в массиве нулями.
- Описание кода:
- Заголовок программы: LOCALS, .MODEL SMALL, .STACK 100H, .DATA, .CODE
- Массив слов A содержит следующие значения: 1, 2, -3, 4, -5, -6, -7, 8.
- Длина массива (Len) равна 8 (длина строки, содержащей массив в памяти).
- Переменная CrLf содержит символы новой строки (0Dh, 0Ah, '$').
- Функция main() содержит основной код программы.
- Функция ShowArray() выводит содержимое массива A на экран.
- Функция Show_AX() выводит число из регистра AX на экран.
- В функции Show_AX() происходит проверка на отрицательность числа. Если число отрицательное, выводится символ '-', число становится положительным, а затем выводится остаток от деления на 10.
- Если число положительное, выводится остаток от деления на 10 (без предварительной проверки на отрицательность).
- В функции main() вызывается функция ShowArray(), затем цикл заменяет отрицательные числа в массиве A нулями, после чего вызывается функция ShowArray() для вывода измененного массива.
- Затем программа завершается возвратом в DOS.
- Вопрос: Что делает код? Ответ: Код заменяет отрицательные числа в массиве A нулями.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д