В массиве слов заменить все отрицательные числа нулями - 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

Объяснение кода листинга программы

  1. Предполагаемая задача: заменить все отрицательные числа в массиве нулями.
  2. Описание кода:
    • Заголовок программы: 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.
  3. Вопрос: Что делает код? Ответ: Код заменяет отрицательные числа в массиве A нулями.

Оцени полезность:

6   голосов , оценка 4 из 5
Похожие ответы