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