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

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

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

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

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

textual
Листинг программы
.model small
 
.stack 100h
 
.data
 
MASS db 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
ArrayLen equ 2
 
.code
 
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

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

  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