В массиве слов заменить все отрицательные числа нулями - Assembler

Узнай цену своей работы

Формулировка задачи:

Здравствуйте, в универе изучаем ассемблер, а я что-то настолько олень, что вообще в него не въезжаю... Можете помочь с парой задач? Очень желательно крайне подробное комментирование. 1. Заменить все отрицательные числа нулями. Массив слов.

Решение задачи: «В массиве слов заменить все отрицательные числа нулями»

textual
Листинг программы
  1. LOCALS
  2.  
  3. .model small
  4.  
  5. .stack 100h
  6.  
  7. .data
  8.         A       dw      1, 2, -3, 4, -5, -6, -7, 8
  9.         Len     equ     ($-A)/2
  10.         CrLf    db      0Dh, 0Ah, '$'
  11. .code
  12.  
  13. main    proc
  14.         mov     ax,     @data
  15.         mov     ds,     ax
  16.  
  17.         call    ShowArray
  18.  
  19.         mov     cx,     Len
  20.         lea     si,     A
  21.         mov     ax,     0
  22. @@For:
  23.         test    word ptr [si],  -1
  24.         jns     @@Next
  25.         mov     [si],   ax
  26. @@Next:
  27.         add     si,     2
  28.         loop    @@For
  29.  
  30.         call    ShowArray
  31.  
  32.         mov     ax,     4C00h
  33.         int     21h
  34. main    endp
  35.  
  36. ;Выводит содержимое массива A на экран
  37. ShowArray       proc
  38.         push    ax
  39.         push    si
  40.         push    cx
  41.         push    dx
  42.  
  43.         mov     cx,     Len
  44.         lea     si,     A
  45. @@For:
  46.         lodsw
  47.         call    Show_AX
  48.         mov     ah,     02h
  49.         mov     dl,     ' '
  50.         int     21h
  51.         loop    @@For
  52.  
  53.         mov     ah,     09h
  54.         lea     dx,     CrLf
  55.         int     21h
  56.  
  57.         pop     dx
  58.         pop     cx
  59.         pop     si
  60.         pop     ax
  61.         ret
  62. ShowArray       endp
  63.  
  64. ; выводит число из регистра AX на экран
  65. ; входные данные:
  66. ; ax - число для отображения
  67. Show_AX proc
  68.         push    ax
  69.         push    bx
  70.         push    cx
  71.         push    dx
  72.         push    di
  73.  
  74.         mov     cx, 10
  75.         xor     di, di          ; di - кол. цифр в числе
  76.  
  77.         ; если число в ax отрицательное, то
  78.         ;1) напечатать '-'
  79.         ;2) сделать ax положительным
  80.         or      ax, ax
  81.         jns     @@Conv
  82.         push    ax
  83.         mov     dx, '-'
  84.         mov     ah, 2           ; ah - функция вывода символа на экран
  85.         int     21h
  86.         pop     ax
  87.  
  88.         neg     ax
  89.  
  90. @@Conv:
  91.         xor     dx, dx
  92.         div     cx              ; dl = num mod 10
  93.         add     dl, '0'         ; перевод в символьный формат
  94.         inc     di
  95.         push    dx              ; складываем в стэк
  96.         or      ax, ax
  97.         jnz     @@Conv
  98.         ; выводим из стэка на экран
  99. @@Show:
  100.         pop     dx              ; dl = очередной символ
  101.         mov     ah, 2           ; ah - функция вывода символа на экран
  102.         int     21h
  103.         dec     di              ; повторяем пока di<>0
  104.         jnz     @@Show
  105.  
  106.         pop     di
  107.         pop     dx
  108.         pop     cx
  109.         pop     bx
  110.         pop     ax
  111.         ret
  112. Show_AX endp
  113.  
  114. 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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы