2015-01-29 3 views
0

моя программа должна подсчитывать все гласные в пользовательских символах ввода. Мои коды длинны из-за части при сравнении ввода пользователя, если гласный или нет. есть ли способ сократить мои коды? Я новичок в ассемблере, поэтому я использую базовый мнемоническиеЯзык ассемблера есть способ сократить мой код

title sample.prog 
cstack segment para stack 'stack' 
dw 200h 
cstack ends 

cdata segment para 'data' 
msg1 db 'ENTER 9 CHARACTER: $',10,13 
msg2 db 10,13,'NUMBER OF VOWELS: $' 
cdata ends 

ccode segment para 'code' 
assume cs:ccode,ds:cdata,ss:cstack 
main: 
mov ax,cdata 
mov ds,ax 

mov ah,09h 
lea dx,msg1 
int 21h 

mov cl,0 
mov bl,30h 

input: 
mov ah,01 
int 21h 
inc cl 

cmp al,61h 
je incre 
cmp al,65h 
je incre 
cmp al,69h 
je incre 
cmp al,6fh 
je incre 
cmp al,75h 
je incre 
cmp al,'A' 
je incre 
cmp al,'E' 
je incre 
cmp al,'I' 
je incre 
cmp al,'O' 
je incre 
cmp al,'U' 
je incre 

cmp cl,9 
je ed 
jmp input 

incre: 
inc bl 

cmp cl,9 
je ed 
jmp input 

ed: 
    mov ah, 09h 
    lea dx,msg2 
    int 21h 


    mov ah,02h 
    mov dl,bl 
    int 21h 

    mov ah, 4ch 
    int 21h 

ccode ends 
end main 
+4

Я м, чтобы закрыть этот вопрос как вне темы, потому что он должен быть на [codereview] (http://codereview.stackexchange.com). – Jester

ответ

1

сбрить некоторый код, первый спекулируя

and al,1101_1111b 
cmp al,'A' 
jb skip 
cmp al,'Z' 
ja skip 
cmp al,'A' 
je incre 
cmp al,'E' 
je incre 
cmp al,'I' 
je incre 
cmp al,'O' 
je incre 
cmp al,'U' 
je incre 
skip: 

Или использовать список (в де секции данных)

vowels db 'AEIOUaeiou' 

... 

mov cx,10 
mov si,vowels 
again: 
cmp al,[si] 
je incre 
inc si 
loop again 
+0

Я получил тип операндов ошибок, не совпадающий с cmp al, [si] – Volkswagen

+0

TASM, возможно, нуждается в 'cmp al, byte ptr [si]' –

+0

У меня все еще есть ошибка – Volkswagen

Смежные вопросы