В массиве слов заменить все отрицательные числа нулями - 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 нулями.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д