Перевод из классического С в Assembler - Assembler (223515)
Формулировка задачи:
Уважаемые!
Столкнулся с такой проблемой как перевод программы из языка программирования С в язык программирования Assembler, так как на первом курсе изучал не классический C, а C++, да и то за год N-е количество информации по C++ улетучилось. Данные программы нужно перевести из С в Assembler. Не уверен, что программа №1 составлена корректно - скорее всего в листе заданий были опечатки. Например, где while вместо ; может стоит { :
№1
№2
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);
}
}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
Объяснение кода листинга программы
- Объявление переменных: MASS db 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ArrayLen equ 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
- Описание работы программы:
В этом коде происходит сортировка массива по убыванию. Сначала происходит инициализация сегмента данных и стека. Затем происходит вызов процедуры _lock, которая занимается сортировкой. В этой процедуре используется стек для хранения промежуточных значений.
Процедура _lock работает следующим образом:
- Инициализирует счетчик n в 0.
- Пока i больше 0, происходит следующее:
- Если n больше 0, то n уменьшается на 1.
- Если n равно 0, то элемент массива br[i] устанавливается равным 0.
- Элемент массива br[i] устанавливается равным n. После завершения работы процедуры _lock, происходит выход из программы.