Премини към съдържанието
Форумът в приложение

По-лесно сърфиране. Научи повече.

Kaldata.com - Форуми

Приложение на форума на цял екран с push известия, значки и други.

За да инсталирате това приложение на iOS и iPadOS
  1. Докоснете Иконата за споделяне в Safari
  2. Превъртете менюто и докоснете Добавяне към началния екран.
  3. Докоснете Добавяне в горния десен ъгъл.
За да инсталирате това приложение на Android
  1. Докоснете менюто с 3 точки (⋮) в горния десен ъгъл на браузъра.
  2. Докоснете Добавяне към началния екран или Инсталиране на приложение.
  3. Потвърдете, като докоснете Инсталиране.

Добре дошли!

Добре дошли в нашите форуми, пълни с полезна информация. Имате проблем с компютъра или телефона си? Публикувайте нова тема и ще намерите решение на всичките си проблеми. Общувайте свободно и открийте безброй нови приятели.

Моля, регистрирайте се за да публикувате тема и да получите пълен достъп до всички функции.

 

Задача на Асемблер NASM

Featured Replies

Здравейте! Имам задача на асемблер да напиша програма, която въвежда константа XX по-малка от 20 и проверява:

Ако числото е по-малко от XX-5 и е нечетно го извежда;

Ако числото е по-голямо от XX+10 и числото%4==3 го извежда.

Пробвах с chatGPT, но ми дава код, който извежда първата част, но във втората не ми извежда число, което отговаря на условието. Моля погледнете кода, ще съм ви много благодарен, ако кажете къде е грешката! :)

%include "io64.inc"



section .data

; Константа LL

LL equ 1

strOddPos db "Odd numbers less than LL-5: ", 0

strCount db "Numbers matching condition: ", 0



section .bss

; Масив за съхранение на числата, отговарящи на условието

matching_nums resq LL



section .text

global main



main:

mov rbp, rsp; for correct debugging

; Регистри:

; r15 - брой числа в nums

; r9 - брой нечетни числа < LL-5

; r10 - брой числа, които отговарят на условието LL+10 и (num mod 4 == 3)

; rax - текущо прочетено число

; rdi - предходно прочетено число

xor r15, r15

xor r9, r9

xor r10, r10

GET_DEC 8, rax

mov rdi, rax



read_loop:

; Прочитаме следващо число

GET_DEC 8, rax



; Проверяваме дали е равно на предходното

cmp rax, rdi

je end_loop



; Проверяваме дали числото отговаря на условието за съхранение

test rax, 3

jnz continue_loop

cmp rax, LL + 10

jge continue_loop

; Записваме числото в matching_nums



mov [matching_nums + r10 * 8], rax

inc r10



continue_loop:

; Увеличаваме броя на нечетните числа < LL-5

test rax, 1

jz end_loop

cmp rax, LL - 5

jge end_loop

inc r9



end_loop:

; Ако имаме LL числа вече прочетени или сме прочели едно и също число два пъти, то приключваме

cmp r15, LL

je print_results

cmp rax, rdi

je print_results

; Запомняме текущото число като предходно

mov rdi, rax

; И продължаваме цикъла

jmp read_loop





print_results:

; Извеждаме броя на нечетните числа < LL-5

mov rax, r9

PRINT_STRING strOddPos

PRINT_DEC 8, rax

NEWLINE





; Извеждаме числата, които отговарят на условието LL+10 и (num mod 4 == 3)

PRINT_STRING strCount

mov rax, r10

PRINT_DEC 8, rax

NEWLINE





end_program:

; Край на програмата

xor rax, rax

ret

input: 16 11 -11 -9 6 30 -2 -17 15

Задачата я правя на x64 битов асемблер - SASM

Не извежда числото 15 в тази част, а то отговаря на условията: 

; Извеждаме числата, които отговарят на условието LL+10 и (num mod 4 == 3)

PRINT_STRING strCount

mov rax, r10

PRINT_DEC 8, rax

NEWLINE

 

%include "io64.inc"



section .data

; Константа LL

LL equ 1

strOddPos db "Odd numbers less than LL-5: ", 0

strCount db "Numbers matching condition: ", 0



section .bss

; Масив за съхранение на числата, отговарящи на условието

matching_nums resq LL



section .text

global main



main:

mov rbp, rsp; for correct debugging

; Регистри:

; r15 - брой числа в nums

; r9 - брой нечетни числа < LL-5

; r10 - брой числа, които отговарят на условието LL+10 и (num mod 4 == 3)

; rax - текущо прочетено число

; rdi - предходно прочетено число

xor r15, r15

xor r9, r9

xor r10, r10

GET_DEC 8, rax

mov rdi, rax



read_loop:

; Прочитаме следващо число

GET_DEC 8, rax



; Проверяваме дали е равно на предходното

cmp rax, rdi

je end_loop



; Проверяваме дали числото отговаря на условието за съхранение

test rax, 3

jnz continue_loop

cmp rax, LL + 10

jge continue_loop

; Записваме числото в matching_nums



mov [matching_nums + r10 * 8], rax

inc r10



continue_loop:

; Увеличаваме броя на нечетните числа < LL-5

test rax, 1

jz end_loop

cmp rax, LL - 5

jge end_loop

inc r9



end_loop:

; Ако имаме LL числа вече прочетени или сме прочели едно и също число два пъти, то приключваме

cmp r15, LL

je print_results

cmp rax, rdi

je print_results

; Запомняме текущото число като предходно

mov rdi, rax

; И продължаваме цикъла

jmp read_loop





print_results:

; Извеждаме броя на нечетните числа < LL-5

mov rax, r9

PRINT_STRING strOddPos

PRINT_DEC 8, rax

NEWLINE





; Извеждаме числата, които отговарят на условието LL+10 и (num mod 4 == 3)

PRINT_STRING strCount

mov rax, r10

PRINT_DEC 8, rax

NEWLINE





end_program:

; Край на програмата

xor rax, rax

ret

 

Благодаря ви, че ми изпратихте кода. Виждам, че се опитвате да отпечатате числата, които отговарят на условието LL+10 и (num mod 4 == 3). Вие обаче споменахте, че числото 15 не се отпечатва, въпреки че отговаря на условието. Мисля, че открих проблема. Условието, което проверявате, е (num mod 4 == 3), което означава, че числото трябва да има остатък 3, когато е разделено на 4. Въпреки това, 15 разделено на 4 дава остатък 3, което означава, че то удовлетворява условието. Проблемът е, че проверявате дали числото е по-голямо от LL+10, което е равно на 11. 15 обаче не е по-голямо от 11, което означава, че не отговаря на това условие и следователно не се отпечатва. Можете да коригирате това, като промените условието на (num &gt;= LL+10) и (num mod 4 == 3). Това ще гарантира, че всички числа, по-големи или равни на LL+10 и имащи остатък 3 при деление на 4, се отпечатват

section .data
    message1 db 'Enter a number less than XX-5: $'
    message2 db 'Enter a number greater than XX+10 and divisible by 4 with a remainder of 3: $'
    input db 6

section .text
    global _start

_start:
    ; Въвеждане на числото XX
    mov ah, 9
    mov edx, message1
    int 0x21

    mov ah, 1
    int 0x21
    sub al, 48
    mov bl, al
    cmp bl, 20
    jge end

    ; Проверка за числото, ако е по-малко от XX-5 и нечетно
    mov ah, 9
    mov edx, message2
    int 0x21

    mov ah, 1
    int 0x21
    sub al, 48
    cmp al, bl
    add al, 5
    jb end
    test al, 1
    jz end

    ; Проверка за числото, ако е по-голямо от XX+10 и числото%4==3
    mov ah, 9
    mov edx, message2
    int 0x21

    mov ah, 1
    int 0x21
    sub al, 48
    cmp al, bl
    sub al, 10
    jbe end
    and al, 3
    jz end

end:
    mov ah, 0x4C
    int 0x21

На мен ми върна това

Добавете отговор

Можете да публикувате отговор сега и да се регистрирате по-късно. Ако имате регистрация, влезте в профила си за да публикувате от него.

Гост
Публикацията ви съдържа термини, които не допускаме! Моля, редактирайте съдържанието си и премахнете подчертаните думи по-долу. Ако замените букви от думата със звездички или друго, за да заобиколите това предупреждение, профилът ви ще бъде блокиран и наказан!
Напишете отговор в тази тема...

Разглеждащи това в момента 0

  • Няма регистрирани потребители разглеждащи тази страница.

Дарение

  • Подкрепи съществуването на форума - направи дарение
    25%
    Дарени 252.69 EUR от нужните 1,000.00 EUR

Бюлетин

Получавайте известие, когато има важна промяна или новина свързана с форума.

Профил

Навигация

Търсене

Търсене

Конфигуриране на push известия в браузъра

Chrome (Android)
  1. Докоснете иконата на катинар до адресната лента.
  2. Докоснете Разрешения → Известия.
  3. Променете предпочитанията си.
Chrome (Desktop)
  1. Кликнете върху иконата на катинар в адресната лента.
  2. Изберете Настройки на сайта.
  3. Намерете Известия и коригирайте предпочитанията си.