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

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

Kaldata.com - Форуми

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

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

Добре дошли!

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

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

 

Помощ за намиране на грешка в програма

Featured Replies

Целта на програмата е да се въвеждат случайни букви и цифри от клавиатурата до натискане на клавиша Enter. И след това да изкара само цифрите в обратен ред. Всичко това е на асемблер. Това е което сътворих аз, но не можах нещо да накарам програмата да прави разлика между букви и цифри и си изкарва и буквите. Сега уча асемблер, та моля ви без сложни работи :D

 

.model small
.stack 100H
.code
mov AX,11
push AX
S1:
mov AH,01H
int 21H
CMP AL, 13
JE S2
CMP AL,'1'
push Ax
JMP S1
CMP AL,'2'
push Ax 
JMP S1
CMP AL,'3'
push Ax
JMP S1
CMP AL,'4'
push Ax
JMP S1
CMP AL,'5'
push Ax
JMP S1
CMP AL,'6'
push Ax
JMP S1
CMP AL,'7'
push Ax
JMP S1
CMP AL,'8'
push Ax
JMP S1
CMP AL,'9'
push Ax
JMP S1
CMP AL,'0'
push Ax
JMP S1
S2:
pop DX
CMP DL,11
JE S3
mov AH,02H
int 21H
JMP S2
S3:
mov AH,4CH
int 21h

 

Познанията ми по асемблер са почти нулеви, но това което забелязах е, че най-горе имаш:

mov AX,11
push AX

пък надолу е

push Ax

т.е. малко "х", не знам дали има значение.

  • Автор
преди 4 часа, dkmi написа:

Познанията ми по асемблер са почти нулеви, но това което забелязах е, че най-горе имаш:


mov AX,11
push AX

пък надолу е

push Ax

т.е. малко "х", не знам дали има значение.

Благодаря за отговора, но за жалост не е от значение това.

Асемблера съм го позабравил, но според мене би трябвало да е нещо такова

...
mov AX,11
push AX
S1:
mov AH,01H
int 21H
CMP AL, 13
JE S2
CMP AL,'1'
JB S1
CMP Al,'9'
JA S1
push AX
JMP S1
S2:
pop DX
CMP DL,11
JE S3
mov AH,02H
int 21H
JMP S2
S3:
mov AH,4CH
int 21h

 

  • Автор
преди 11 часа, ined написа:

Асемблера съм го позабравил, но според мене би трябвало да е нещо такова


...
mov AX,11
push AX
S1:
mov AH,01H
int 21H
CMP AL, 13
JE S2
CMP AL,'1'
JB S1
CMP Al,'9'
JA S1
push AX
JMP S1
S2:
pop DX
CMP DL,11
JE S3
mov AH,02H
int 21H
JMP S2
S3:
mov AH,4CH
int 21h

 

И така не става сега копира всеки символ по 3 пъти и пак остават буквите. Благодаря все пак за опита :)

.model small
.stack 100H
.code
mov AX,11
S0:
push AX
S1:
mov AH,01H
int 21H
CMP AL, 13
JE  S2
CMP AL,'0'
JB  S1
CMP AL,'9'
JA  S1
JMP S0
S2:
pop DX
CMP DL,11
JE S3
mov AH,02H
int 21H
JMP S2
S3:
mov AH,4CH
int 21h
end

Това вече съм го пробвал че работи, ама в dosbox - 64 битовия windows 7 нещо нИще да пуска 16 битови програми

  • Автор
преди 8 часа, ined написа:

.model small
.stack 100H
.code
mov AX,11
S0:
push AX
S1:
mov AH,01H
int 21H
CMP AL, 13
JE  S2
CMP AL,'0'
JB  S1
CMP AL,'9'
JA  S1
JMP S0
S2:
pop DX
CMP DL,11
JE S3
mov AH,02H
int 21H
JMP S2
S3:
mov AH,4CH
int 21h
end

Това вече съм го пробвал че работи, ама в dosbox - 64 битовия windows 7 нещо нИще да пуска 16 битови програми

С една програма emu 8086 съм от университета е и там ставаше тук защо не става не знам.а

преди 5 часа, Nikolai Rosenov написа:

С една програма emu 8086 съм от университета е и там ставаше тук защо не става не знам.а

Пробвай с това http://techapple.net/2013/01/tasm-windows-7-windows-8-full-screen-64bit-version-single-installer/

  • Автор
преди 7 часа, ined написа:

съжалявам твърде зелен съм в програмирането и не разбирам да напиша програмата тук ? не съм работил с това и не разбирам. Извинявам се за това, че не знам и ти благодаря за помощта отново :)

Ето как става с Flat assembler за windows 10 x8664

format MS64 COFF

include 'win64a.inc'

public revdigits
extrn GetStdHandle
extrn SetConsoleCP
extrn SetConsoleOutputCP
extrn WriteConsoleA
extrn ReadConsoleA
extrn ExitProcess

section 'code' code readable writeable executable
cin dq ?                             ;указател за вход от конзолата
cout dq ?                            ;указател за изход на конзолата

revdigits:              ; входна точка на програмата

sub rsp,8                      ; подравняване на стека
fastcall GetStdHandle,dword -10;извличане на указателя за вход от конзолата
mov [cin],rax
fastcall GetStdHandle,dword -11;извличане на указателя за изход на конзолата
mov [cout],rax
fastcall SetConsoleCP,1251      ; побългаряване на входа от конзолата
fastcall SetConsoleOutputCP,1251; побългаряване на изхода
fastcall revstring       ; викане на рекурсивната процедура за обръщане
fastcall ExitProcess,0   ; край на програмата

proc revstring     ;рекурсивна процедура за печатане отзад напред
locals
ncr dd ?           ;брой прочетени / записани символи
char db ?          ;прочетен / записан символ
endl
lea r10,[char]    ;извличане на пойнтър към символната променлива
lea r11,[ncr]     ;извличане на пойнтър към променливата за брой
fastcall ReadConsoleA,[cin],r10,1,r11,0 ;прочитане на символ
cmp byte [char],13            ;ако е край на ред
jne @f
ret                           ;връща от дъното на рекурсията
@@:
fastcall revstring            ;рекурсивно викане
cmp [char],'0'                 ;проверка дали символа е цифра
jb @f
cmp [char],'9'
ja @f
lea r10,[char]
lea r11,[ncr]
fastcall WriteConsoleA,[cout],r10,1,r11,0 ;печатане на прочетената цифра
@@:
ret
endp

Компилира се с команда компайл от менюто на идето на флат асемблер

свързва се с линкера на майкрософт чрез следния команден ред, ако името на обектния файл е revdigits.obj

link revdigits.obj kernel32.lib /subsystem:console /entry:revdigits

 

Редактирано от Реджеп Иведик (преглед на промените)

То хубаво, ама както автора каза "Сега уча асемблер, та моля ви без сложни работи" - синтаксиса на програмата дето я е дал в началото е за TASM (Turbo Asembler) и аз затова съм му дал линк към DOSBox + TASM + TLink (Turbo Link) + TD (Turbo Debuger) - ако с него не може да се оправи как очакваш да може да го направи с тоя асемблер.

Редактирано от ined (преглед на промените)

преди 4 часа, ined написа:

То хубаво, ама както автора каза "Сега уча асемблер, та моля ви без сложни работи" - синтаксиса на програмата дето я е дал в началото е за TASM (Turbo Asembler) и аз затова съм му дал линк към DOSBox + TASM + TLink (Turbo Link) + TD (Turbo Debuger) - ако с него не може да се оправи как очакваш да може да го направи с тоя асемблер.

format MZ       ;създава дос програма
org 100h
mov [index],0   ;занулява брояча
loop1:
mov ah,1        ;чете символ
int 21h
cmp al,13       ;проверява за край на ред
je print
cmp al,'0'      ;проверява дали е цифра
jb @f
cmp al,'9'
ja @f
push ax         ;ако е цифра я пъха в програмния стек
inc [index]     ;и увеличава брояча за прочетени цифри
@@:
jmp loop1
print:          ;цикъл за печатане на въведените в стека цифри
mov ah,2        ;ползва се логиката на стека за обръщане на реда
pop dx
int 21h
dec [index]
jg print
mov ah,4ch     ;изход от програмата
int 21h

index dw 0     ;брояч

; компилира се с команда compile, от менюто на IDEто на флат асемблер  

 

Няма нужда от линкер. Фасм директно прави DOS executable

  • Автор
преди 7 часа, ined написа:

То хубаво, ама както автора каза "Сега уча асемблер, та моля ви без сложни работи" - синтаксиса на програмата дето я е дал в началото е за TASM (Turbo Asembler) и аз затова съм му дал линк към DOSBox + TASM + TLink (Turbo Link) + TD (Turbo Debuger) - ако с него не може да се оправи как очакваш да може да го направи с тоя асемблер.

 

преди 3 часа, Реджеп Иведик написа:

format MZ       ;създава дос програма
org 100h
mov [index],0   ;занулява брояча
loop1:
mov ah,1        ;чете символ
int 21h
cmp al,13       ;проверява за край на ред
je print
cmp al,'0'      ;проверява дали е цифра
jb @f
cmp al,'9'
ja @f
push ax         ;ако е цифра я пъха в програмния стек
inc [index]     ;и увеличава брояча за прочетени цифри
@@:
jmp loop1
print:          ;цикъл за печатане на въведените в стека цифри
mov ah,2        ;ползва се логиката на стека за обръщане на реда
pop dx
int 21h
dec [index]
jg print
mov ah,4ch     ;изход от програмата
int 21h

index dw 0     ;брояч

; компилира се с команда compile, от менюто на IDEто на флат асемблер  

 

Няма нужда от линкер. Фасм директно прави DOS executable

.model small
.stack 100h
.code
        mov AX,11
        mov AH,0
        push AX
M1:
        mov AH, 01H;
        int 21h
        cmp al, 13
        je visual
        cmp al, 30h;'0'
        je M2  
        cmp al, 31h;'1'
        je M2
        cmp al, 32h;'2'
        je M2
        cmp al, 33h;'3'
        je M2
        cmp al, 34h;'4'
        je M2
        cmp al, 35h;'5'
        je M2
        cmp al, 36h;'6'
        je M2
        cmp al, 37h;'7'
        je M2
        cmp al, 38h;'8'
        je M2
        cmp al, 39h; '9'
        je M2
        mov dl,al
        mov ah,02h
        jmp M1
M2:
        push AX
        jmp m1

visual:
        pop AX
        CMP AL,11
        JE exit
        mov DL,AL
        mov AH,02H
        int 21H
        JMP visual
exit:
        mov ah, 4ch
        int 21h
        end

Ето това е кода все пак с малко помощ успях. Благодаря вси все пак 

Няма нужда да проверяваш за всяка цифра. Ако е по малко от нула или по голямо от девет, значи не е цифра, и се разминаваш само с две проверки вместо с 10, както си направил.

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

Като за новобранец е добре да ти тръгне асемблерска програма, но като за програмист е срамна работа да проверяваш цифрите една по една

  • Автор

Да реално карам процесора да прави повече от нужното, но датата за предаване на програмата наближаваше и нямаше време да го измисля как да стане. За изпита все пак и тази свърши работа другият път ще гледам да е по добре :D

Архивирана тема

Темата е твърде стара и е архивирана. Не можете да добавяте нови отговори в нея, но винаги можете да публикувате нова тема, в която да продължи дискусията. Регистрирайте се или влезте във вашия профил за да публикувате нова тема.

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

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

Дарение

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

Бюлетин

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

Профил

Навигация

Търсене

Търсене

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

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