Перевод из классического С в 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, происходит выход из программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д