Премини към съдържанието
Nikolai Rosenov

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

Препоръчан отговор


Целта на програмата е да се въвеждат случайни букви и цифри от клавиатурата до натискане на клавиша 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

 

  • Харесва ми 1

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
преди 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 битови програми

  • Харесва ми 1

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
преди 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

 

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

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
публикувано (редактирано)

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

Редактирано от ined (преглед на промените)
  • Харесва ми 1

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
преди 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

  • Харесва ми 1

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
преди 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, както си направил.

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

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

  • Харесва ми 1

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

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

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Регистрирайте се или влезете в профила си за да коментирате

Трябва да имате регистрация за да може да коментирате това

Регистрирайте се

Създайте нова регистрация в нашия форум. Лесно е!

Нова регистрация

Вход

Имате регистрация? Влезте от тук.

Вход

×

Информация

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