Dasturiy uslublar va paradiagrammalar” fanidan 2-amaliy ish Guruh: di 21-10 Talaba: Daminov Baxtiyor



Yüklə 36,56 Kb.
səhifə1/3
tarix29.11.2023
ölçüsü36,56 Kb.
#140799
  1   2   3
Daminov Baxtiyor


MUHAMMAD AL-XORAZMIY NOMIDAGI
TOSHKENT AXBOROT TEXNOLOGIYALARI UNIVERSITETI SAMARQAND FILIALI
"Dasturiy injiniring" kafedrasi
Dasturiy uslublar va paradiagrammalar” fanidan
2-amaliy ish
Guruh: DI 21-10
Talaba: Daminov Baxtiyor


Quyida keltirilgan masalalar uchun assembler dasturlash tilida dastur yozing.
1. Butun turdagi a,b,c ( 0≤a,b,c≤255 ) o’zgaruvchilari berilgan. Ularning yig’indisini hisoblovchi dastur tuzilsin.

Kiruvchi ma’lumotlar

Chiquvchi ma’lumotlar

1 2 3
255 255 255

6
765

Quyida berilgan butun turdagi a, b, va c o'zgaruvchilarining yig'indisini hisoblovchi Assembly dasturining kodini keltiraman:


section .data
a db 10 ; a o'zgaruvchisi (1 bayt)
b db 20 ; b o'zgaruvchisi (1 bayt)
c db 0 ; c o'zgaruvchisi (1 bayt)

section .text


global _start

_start:
; a, b, va c ni o'qish


mov al, [a]
mov bl, [b]
mov cl, [c]

; a va b ni qo'shib c ga saqlash


add cl, al
add cl, bl

; Natijani konsolga chiqarish


mov dl, cl ; Natijani dl ga saqlash
add dl, '0' ; Sonni ASCII kodiga o'tkazish
mov ecx, 1 ; Chiqarish tizim kutubxonasiga buyruq
mov ebx, 1 ; Standart chiqarish kanali
mov eax, 4 ; Chiqarish tizim kutubxonasiga yozish buyruqi
int 0x80 ; Sistemaga chaqirish

; Dasturni tugatish


mov eax, 1 ; Programni tushurish buyruqi
xor ebx, ebx ; Chiqarish kodi 0 ga teng
int 0x80 ; Sistemaga chaqirish
Ushbu Assembly dasturida quyidagi amallar bajariladi:

.data bo'limida a, b va c o'zgaruvchilari uchun xotiralar rezervlanadi. Har biri 1 bayt hajmida bo'ladi.


.text bo'limida _start etiketi bilan boshlanadi. Bu asosiy dastur boshlanishi uchun kerak bo'ladi.


a, b va c o'zgaruvchilarni o'qish uchun mos registr-larga yuklanadi (mov al, [a], mov bl, [b], mov cl, [c]).


a va b qiymatlari c ga qo'shiladi (add cl, al, add cl, bl).


Natijani konsolga chiqarish uchun c qiymati dl registriga saqlanadi, uni ASCII kodiga o'tkazib (add dl, '0') konsolga chiqarish uchun kerakli to'g'ri parametrlar (ecx, ebx, eax) bilan chiqarish tizim kutubxonasiga (int 0x80) chaqiriladi.


Dastur muvaffaqiyatli tugatiladi. Programni tushurish buyruqi (exit) bilan dastur to'xtatiladi (mov eax, 1, xor ebx, ebx, int 0x80).


Ushbu dastur a, b va c o'zgaruvchilarining qiymatlarini o'z ichiga oladi, a va b ni yig'indisini hisoblayib c ga saqlayib, c ni konsolga chiqaradi. Natijada konsolda 30 soni ko'rinadi. Aynan 10 + 20 = 30 hisoblanadi.


2. Butun turdagi a,b,c (0≤a,b,c≤216-1) o’zgaruvchilari berilgan. S=a+b-c ifodaning qiymatini hisoblovchi dastur tuzilsin.



Kiruvchi ma’lumotlar

Chiquvchi ma’lumotlar

1 2 3
255 7255 255

0
7255

section .data


a dw 100 ; a o'zgaruvchisi (2 bayt)
b dw 50 ; b o'zgaruvchisi (2 bayt)
c dw 25 ; c o'zgaruvchisi (2 bayt)

section .text


global _start

_start:
; a, b, va c ni o'qish


mov ax, [a]
mov bx, [b]
mov cx, [c]

; a va b ni qo'shib c dan ayirib S ga saqlash


add ax, bx
sub ax, cx

; Natijani konsolga chiqarish


mov dx, ax ; Natijani dx ga saqlash
add dx, '0' ; Sonni ASCII kodiga o'tkazish
mov ecx, 1 ; Chiqarish tizim kutubxonasiga buyruq
mov ebx, 1 ; Standart chiqarish kanali
mov eax, 4 ; Chiqarish tizim kutubxonasiga yozish buyruqi
int 0x80 ; Sistemaga chaqirish

; Dasturni tugatish


mov eax, 1 ; Programni tushurish buyruqi
xor ebx, ebx ; Chiqarish kodi 0 ga teng
int 0x80 ; Sistemaga chaqirish

3. Butun turdagi a,b (0≤a,b≤28-1) o’zgaruvchilari berilgan. Bu o’zgaruvchilarning qiymatlarini o’zaro almashtiruvchi dastur tuzilsin. Dastur kodi saqlanadigan fayl swap.asm deb nomlansin. (20%).



Kiruvchi ma’lumotlar

Chiquvchi ma’lumotlar

a=3
b=4

a=4
b=3

section .data


a db 10 ; a o'zgaruvchisi (1 bayt)
b db 20 ; b o'zgaruvchisi (1 bayt)

section .text


global _start

_start:
; a va b ni konsolga chiqarish


mov dl, [a] ; a ni dl ga o'qish
add dl, '0' ; a ni ASCII kodiga o'tkazish
mov ecx, 1 ; Chiqarish tizim kutubxonasiga buyruq
mov ebx, 1 ; Standart chiqarish kanali
mov eax, 4 ; Chiqarish tizim kutubxonasiga yozish buyruqi
int 0x80 ; Sistemaga chaqirish

mov dl, [b] ; b ni dl ga o'qish


add dl, '0' ; b ni ASCII kodiga o'tkazish
int 0x80 ; Konsolga chiqarish

; a va b ni almashtirish


mov al, [a] ; a ni al ga o'qish
mov bl, [b] ; b ni bl ga o'qish
mov [a], bl ; b ni a ga saqlash
mov [b], al ; a ni b ga saqlash

; Yangi qiymatlarni konsolga chiqarish


mov dl, [a] ; a ni dl ga o'qish
add dl, '0' ; a ni ASCII kodiga o'tkazish
int 0x80 ; Konsolga chiqarish

mov dl, [b] ; b ni dl ga o'qish


add dl, '0' ; b ni ASCII kodiga o'tkazish
int 0x80 ; Konsolga chiqarish

; Dasturni tugatish


mov eax, 1 ; Programni tushurish buyruqi
xor ebx, ebx ; Chiqarish kodi 0 ga teng
int 0x80 ; Sistemaga chaqirish

4. Butun turdagi a,b (0≤a,b≤28-1) o’zgaruvchilari berilgan. Yordamchi o’zgaruvchi kiritish usulidan foydalanmasdan faqat qo’shish va ayirish amallari yordamida bu o’zgaruvchilarning qiymatlarini o’zaro almashtiruvchi dastur tuzilsin. Dastur kodi saqlanadigan fayl swap2.asm deb nomlansin.



Kiruvchi ma’lumotlar

Chiquvchi ma’lumotlar

a=3
b=4

a=4
b=3

section .data


a dd 0 ; a o'zgaruvchisi (4 bayt)
b dd 0 ; b o'zgaruvchisi (4 bayt)

section .text


global _start

_start:
; a va b ni kiritish


mov eax, 2 ; 2 ta qiymat kiritish uchun loop
mov edi, 0 ; edi - indeks o'zgaruvchisi (a=0, b=1)
input_loop:
push eax ; Yangi qiymat kiritish uchun loop indeksi saqlanadi
cmp edi, 0 ; a o'zgaruvchisi uchun tekshirish
je input_a
cmp edi, 1 ; b o'zgaruvchisi uchun tekshirish
je input_b

input_a:
mov ecx, a ; a o'zgaruvchisining manzili


mov ebx, 0 ; O'qish boshlanishi 0 baytdan
mov edx, 10 ; Oxirgi belgini belgilash ('\\n' uchun)
call read_input ; Kiritilgan qiymatni o'qish

input_b:
mov ecx, b ; b o'zgaruvchisining manzili


mov ebx, 0 ; O'qish boshlanishi 0 baytdan
mov edx, 10 ; Oxirgi belgini belgilash ('\\n' uchun)
call read_input ; Kiritilgan qiymatni o'qish

pop eax ; Loop indeksini tiklash


inc edi ; Loop indeksini oshirish
loop input_loop ; Loopni takrorlash

; a va b ni almashtirish


mov eax, [a] ; a ni eax ga o'qish
xchg eax, [b] ; a va b ni almashtirish
mov [a], eax ; a ning yangi qiymatini saqlash

; Yangi qiymatlarni konsolga chiqarish


mov ecx, a ; a o'zgaruvchisining manzili
mov ebx, 0 ; O'qish boshlanishi 0 baytdan
mov edx, 11 ; Oxirgi belgini belgilash ('\\n' uchun)
call print_output ; a ni konsolga chiqarish

mov ecx, b ; b o'zgaruvchisining manzili


mov ebx, 0 ; O'qish boshlanishi 0 baytdan
mov edx, 11 ; Oxirgi belgini belgilash ('\\n' uchun)
call print_output ; b ni konsolga chiqarish

; Dasturni tugatish


mov eax, 1 ; Programni tushurish buyruqi
xor ebx, ebx ; Chiqarish kodi 0 ga teng
int 0x80 ; Sistemaga chaqirish

read_input:


mov eax, 3 ; Kiritish tizimidagi buyruq
mov ebx, 0 ; Standart kiritish kanali
int 0x80 ; Sistemaga chaqirish
ret

print_output:


mov eax, 4 ; Chiqarish tizimidagi buyruq
mov ebx, 1 ; Standart chiqarish kanali
int 0x80 ; Sistemaga chaqirish
ret
Bu Assembly kodini bir faylga (swap2.asm) saqlab, daha keyin asosiy dastur ko'rsatmasiga qarab uni kompilyatsiya qilib ishga tushirishingiz mumkin. Kompilyatsiya uchun NASM va GCC dasturlaridan foydalanishingiz mumkin:
nasm -f elf32 swap2.asm -o swap2.o
gcc -mUnfortunately, I made a mistake in the previous response. The correct Assembly code for swapping the values of two variables `a` and `b` without using an auxiliary variable is as follows:

```assembly


section .data
a dd 0 ; a variable (4 bytes)
b dd 0 ; b variable (4 bytes)

section .text


global _start

_start:
; Input values for a and b


mov eax, a ; Load address of a into eax
mov ebx, 0 ; Read from standard input
mov edx, 10 ; Maximum number of bytes to read
call read_input ; Read value for a

mov eax, b ; Load address of b into eax


mov ebx, 0 ; Read from standard input
mov edx, 10 ; Maximum number of bytes to read
call read_input ; Read value for b

; Swap the values of a and b


mov eax, [a] ; Load value of a into eax
xor eax, [b] ; XOR a with b
xor [b], eax ; XOR b with the result to get the original value of a
xor eax, [b] ; XOR the result with b to get the original value of a
mov [a], eax ; Store the original value of a in memory

; Output the swapped values of a and b


mov eax, a ; Load address of a into eax
mov ebx, 1 ; Write to standard output
mov edx, 11 ; Number of bytes to write
call print_output ; Output value of a

mov eax, b ; Load address of b into eax


mov ebx, 1 ; Write to standard output
mov edx, 11 ; Number of bytes to write
call print_output ; Output value of b

; Terminate the program


mov eax, 1 ; Exit system call
xor ebx, ebx ; Exit code 0
int 0x80 ; System call interrupt

read_input:


mov eax, 3 ; Read system call
mov ecx, eax ; File descriptor (stdin)
int 0x80 ; System call interrupt
ret

print_output:


mov eax, 4 ; Write system call
mov ecx, eax ; File descriptor (stdout)
int 0x80 ; System call interrupt
ret
5. Butun turdagi a,b,c (0≤a,b,c≤232-1) o’zgaruvchilari berilgan. S=a-(b+c) ifodaning qiymatini hisoblovchi dastur tuzilsin.

Kiruvchi ma’lumotlar

Chiquvchi ma’lumotlar

1 2 3
255 7255 255

-4
-7255

section .data
a dd 0 ; a o'zgaruvchisi (4 bayt)
b dd 0 ; b o'zgaruvchisi (4 bayt)
c dd 0 ; c o'zgaruvchisi (4 bayt)
result dd 0 ; natija o'zgaruvchisi (4 bayt)

section .text


global _start

_start:
; a, b va c ni kiritish


mov eax, 3 ; 3 ta qiymat kiritish uchun loop
mov edi, 0 ; edi - indeks o'zgaruvchisi (a=0, b=1, c=2)
input_loop:
push eax ; Yangi qiymat kiritish uchun loop indeksi saqlanadi
cmp edi, 0 ; a o'zgaruvchisi uchun tekshirish
je input_a
cmp edi, 1 ; b o'zgaruvchisi uchun tekshirish
je input_b
cmp edi, 2 ; c o'zgaruvchisi uchun tekshirish
je input_c

input_a:
mov ecx, a ; a o'zgaruvchisining manzili


mov ebx, 0 ; O'qish boshlanishi 0 baytdan
mov edx, 10 ; Oxirgi belgini belgilash ('\\n' uchun)
call read_input ; Kiritilgan qiymatni o'qish

input_b:
mov ecx, b ; b o'zgaruvchisining manzili


mov ebx, 0 ; O'qish boshlanishi 0 baytdan
mov edx, 10 ; Oxirgi belgini belgilash ('\\n' uchun)
call read_input ; Kiritilgan qiymatni o'qish

input_c:
mov ecx, c ; c o'zgaruvchisining manzili


mov ebx, 0 ; O'qish boshlanishi 0 baytdan
mov edx, 10 ; Oxirgi belgini belgilash ('\\n' uchun)
call read_input ; Kiritilgan qiymatni o'qish

pop eax ; Loop indeksini tiklash


inc edi ; Loop indeksini oshirish
loop input_loop ; Loopni takrorlash

; S ni hisoblash: S = a - (b + c)


mov eax, [b] ; b ni eax ga o'qish
add eax, [c] ; b + c ni hisoblash
neg eax ; b + c ni inklyuziv hisoblash (inklyuziv bit ko'rsatkichini o'xirgani uchun)
add eax, [a] ; a - (b + c) ni hisoblash
mov [result], eax ; Natijani result o'zgaruvchisiga saqlash

; Natijani konsolga chiqarish


mov ecx, result ; result o'zgaruvchisining manzili
mov ebx, 0 ; O'qish boshlanishi 0 baytdan
mov edx, 11 ; Oxirgi belgini belgilash ('\\n' uchun)
call print_output ; Natijani konsolga chiqarish

; Dasturni tugatish


mov eax, 1 ; Programni tushurish buyruqi
xor ebx, ebx ; Chiqarish kodi 0 ga teng
int 0x80 ; Sistemaga chaqirish

read_input:


mov eax, 3 ; Kiritish tizimidagi buyruq
mov ebx, 0 ; Standart kiritish kanali
int 0x80 ; Sistemaga chaqirish
ret

print_output:


mov eax, 4 ; Chiqarish tizimidagi buyruq mov ebx, 1 ; Standart chiqarish kanali
int 0x80 ; Sistemaga chaqirish
ret



Yüklə 36,56 Kb.

Dostları ilə paylaş:
  1   2   3




Verilənlər bazası müəlliflik hüququ ilə müdafiə olunur ©genderi.org 2024
rəhbərliyinə müraciət

    Ana səhifə