Попытка преобразовать оператор if в сборку - PullRequest
1 голос
/ 27 апреля 2010

Что я делаю не так?

Это предположительно я написал:

char encode(char plain){
__asm{
    mov al, plain   

    ;check for y or z status
    cmp al, 'y'
    je YorZ
    cmp al, 'z'
    je YorZ
    cmp al, 'Y'
    je YorZ
    cmp al, 'Z'
    je YorZ

    ;check to make sure it is in the alphabet now
    mov cl, al
    sub cl, 'A'

    cmp cl, 24
    jl Other

    sub cl, '6' ;there are six characters between 'Z' and 'a'

    cmp cl, 24
    jl Other
    jmp done    ;means it is not in the alphabet



YorZ:
    sub al, 24
    jmp done

Other:
    add al, 2
    jmp done

done:
    leave
    ret
}
}

и это код C, который он должен заменить, но не

char encode(char plain){
char code;
if((plain>='a' && plain<='x') || (plain>='A' && plain <='X')){
    code = plain+2;
}else if(plain == 'y' || plain=='z' || plain=='Y' || plain == 'y'){
    code = plain - 24;
}else{
    code = plain;
}

return code;
}

Кажется, что все символы, которые не являются y, z, Y, Z, конвертируются в эквивалент плюс 2 вместо просто A-Xa-x. Есть идеи почему?

Ответы [ 3 ]

2 голосов
/ 27 апреля 2010

jl - это подписанное сравнение.

0 голосов
/ 27 апреля 2010

Для сравнения без знака вам нужно «jb» вместо «jl».

0 голосов
/ 27 апреля 2010

Я думаю, что

sub cl, '6'

должно быть

sub cl, 6

в противном случае вы утверждаете, что между 'Z' и 'a' есть '6' -> 0x36 -> 54 символа.

...