Перевод из классического С в Assembler - Assembler (223515)

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

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

Уважаемые! Столкнулся с такой проблемой как перевод программы из языка программирования С в язык программирования Assembler, так как на первом курсе изучал не классический C, а C++, да и то за год N-е количество информации по C++ улетучилось. Данные программы нужно перевести из С в Assembler. Не уверен, что программа №1 составлена корректно - скорее всего в листе заданий были опечатки. Например, где while вместо ; может стоит { : №1
Листинг программы
  1. typedef unsigned char BYTE;
  2. typedef unsigned int WORD;
  3. #define ST_WORD (ptr, val) *(BYTE*) (ptr) = (BYTE) (val);
  4. *((BYTE*) (ptr)+1) = (BYTE) ((WORD) (val) >>8)
  5. void fit (BYTE *lbuf, BYTE *dir)
  6. {
  7. register int i=0;
  8. while (!lbuf [i++]);
  9. ST_WORD (dir+i, 0xAA55);
  10. }
  11. }
№2
Листинг программы
  1. typedef unsigned char BYTE;
  2. void lock (BYTE* br, int i)
  3. {
  4. register int n=0;
  5. while (--i) {
  6. n=br[i];
  7. if (n) n--;
  8. if (!n) br[i]=0;
  9. }
  10. }

Решение задачи: «Перевод из классического С в Assembler»

textual
Листинг программы
  1. .model small
  2.  
  3. .stack 100h
  4.  
  5. .data
  6.  
  7. MASS db 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
  8. ArrayLen equ 2
  9.  
  10. .code
  11.  
  12. Start:
  13.         mov ax, @DATA   ;инициализация
  14.         mov ds, ax
  15.  
  16.         push    ds
  17.         lea ax, MASS
  18.         push    ax
  19.         mov ax, ArrayLen
  20.         push    ax
  21.  
  22.         call    _lock
  23.         sub sp, 6
  24.  
  25.         mov AH, 4Ch ;Выход
  26.         int 21h DOS
  27.  
  28. _lock   proc
  29.         push    bp
  30.         mov bp, sp
  31.  
  32.         push    ax
  33.         push    bx
  34.         push    si
  35.         push    ds
  36.  
  37.         mov ax, 0   ;register int n=0;
  38.         mov bx, ss:[bp-4]
  39.         lds si, ss:[bp-8]
  40.  
  41. @@While:
  42.         dec bx      ;while (--i) {
  43.         jz  @@Break
  44.         mov ax, [si+bx] ;n=br[i];
  45.         test    ax, ax  ;if (n) n--;
  46.         jz  @@Label_01
  47.         dec ax
  48. @@Label_01:
  49.         test    ax, ax  ;if (!n) br[i]=0;
  50.         jz  @@Label_02
  51.         mov ax, 0
  52.         mov [si+bx],    ax
  53. @@Label_02:
  54.         jmp @@While
  55. @@Break:
  56.  
  57.         pop ds
  58.         pop si
  59.         pop bx
  60.         pop ax
  61.  
  62.         mov sp, bp
  63.         pop bp
  64.         ret
  65. _lock   endp
  66.  
  67. END Start

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

  1. Объявление переменных: MASS db 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ArrayLen equ 2
  2. Код программы: Start: mov ax, @DATA ; инициализация mov ds, ax push ds lea ax, MASS push ax mov ax, ArrayLen push ax call _lock sub sp, 6 mov AH, 4Ch ; Выход int 21h ; в DOS _lock proc push bp mov bp, sp push ax push bx push si push ds mov ax, 0 ; register int n=0; mov bx, ss:[bp-4] lds si, ss:[bp-8] While: dec bx ; while (--i) { jz @@Break mov ax, [si+bx] ; n=br[i]; test ax, ax ; if (n) n--; jz @@Label_01 dec ax Label_01: test ax, ax ; if (!n) br[i]=0; jz @@Label_02 mov ax, 0 mov [si+bx], ax Label_02: jmp While Break: pop ds pop si pop bx pop ax mov sp, bp pop bp ret _lock endp END Start
  3. Описание работы программы: В этом коде происходит сортировка массива по убыванию. Сначала происходит инициализация сегмента данных и стека. Затем происходит вызов процедуры _lock, которая занимается сортировкой. В этой процедуре используется стек для хранения промежуточных значений. Процедура _lock работает следующим образом:
    • Инициализирует счетчик n в 0.
    • Пока i больше 0, происходит следующее:
    • Если n больше 0, то n уменьшается на 1.
    • Если n равно 0, то элемент массива br[i] устанавливается равным 0.
    • Элемент массива br[i] устанавливается равным n. После завершения работы процедуры _lock, происходит выход из программы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

14   голосов , оценка 3.929 из 5

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

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

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