+ Reply to Thread
Results 1 to 3 of 3

Thread: Решение простой задачки

  1. #1
    keyst0rke's Avatar

    Default Решение простой задачки

    Конец мая, на улице бухие школьники и зомби-студенота. Я внезапно обнаружил, что надо что-то закрывать, сел писать всё. Наткнулся на задачу, никак не могу придумать, как её можно решить:

    Набросал небольшой кодес:
    Code: ASM

    format pe gui 4.0
    xor eax, eax
    mov ax, 9
    xor cx, cx
    @:
    stc ; устанавливаем cf
    rcr ah, 1 ; сдвигаем и получаем 01
    rcr ah, 1 ; сдвигаем влево, так как cf не установим получим 10
    stc ; устанавливаем cf
    rcr ah, 1 ; в ah - получаем число Ah = 10d = 1010b
    rol ax, 4 ; получаем число 9Ah в al
    rol al, 4 ; сдвигаем и получаем A9h = 169d
    rol al, 2 ; сдвигаем и получаем A6h = 166d
    xor al, 166 ; сравниваем, в результате в al ноль -> ZF = 1
    jnz @ ; иначе уходим на метку
    pushf ; сохраняем состояние флагов в стеке
    pop dx ; сохраняем состояние флагов в регистре
    push dx ; восстанавливаем флаги в стеке
    popf ; достаём из стека регистр флагов
    flags_check: ; проверяем флаги порядке of, sf, zf, pf, cf
    of_check: ; of
    jo of_true
    sf_check: ; sf
    push dx
    popf
    js sf_true
    zf_check: ; zf
    push dx
    popf
    jz zf_true
    pf_check: ; pf
    push dx
    popf
    jp pf_true
    cf_check: ; cf
    push dx
    popf
    jc cf_true
    rol al, 1 ; сдвигаем сразу, если cf не установлен полседний бит al = 0
    ret

    of_true:
    inc al
    jmp sf_check
    sf_true:
    rol al, 1
    xor ax, 0001b
    jmp zf_check
    zf_true:
    rol al, 1
    xor al, 0001b
    jmp pf_check
    pf_true:
    rol al, 1
    xor al, 0001b
    jmp cf_check
    cf_true:
    xor al, 0001b
    ret

    Но беда в том, что нельзя использовать специфичные команды IA, например lahf, bt, stc и подобные. Всё должно быть исключительно минималистично, чтобы можно было взять код и без проблем переписать его под другую архитектуру. Есть у кого идеи, как можно это сделать?
    Last edited by keyst0rke; 25-05-2014 at 14:57.
    Делай то, что должен. Дальше будь, что будет.
    (с) Дед

  2. #2
    500mhz's Avatar

    Default Re: Решение простой задачки

    завтра решу ))) сегодня не можу ) пива попил да и влом )
    и вообще "сдвига" или вращения?

  3. #3
    keyst0rke's Avatar

    Default Re: Решение простой задачки

    Циклического сдвига, можно и вращением назвать.
    Я решил только что, домучил, но опять как-то не красиво получается, через ж*пу :)
    Code: ASM

    format pe gui 4.0
    start:
    mov ebx, 3 ; 255+n = n-1
    xor eax, eax ; чистим eax
    mov eax, 9 ; заносим первое число
    first: ; цикл, в две итерации получаем 10011010bin = 169dec
    add bl, 255 ; возводим cf
    jz second ; на третьей итерации возведён zf, поэтому вылетим
    rcl ax, 1 ; сдвиг через cf
    rol ax, 1 ; простой циклический
    jmp first
    second:
    ror al, 2 ; 10011010 >> 2 = 10100110 = 166
    xor al, 166 ; проверяем нужное ли это число
    jnz start ; если нет - идём в начало
    pushf ; сохраняем состояние флагов в стеке
    pop dx ; сохраняем состояние флагов в регистре
    push dx ; восстанавливаем флаги в стеке
    popf ; достаём из стека регистр флагов
    flags_check: ; проверяем флаги порядке of, sf, zf, pf, cf
    of_check: ; of
    jo of_true
    sf_check: ; sf
    push dx
    popf
    js sf_true
    zf_check: ; zf
    push dx
    popf
    jz zf_true
    pf_check: ; pf
    push dx
    popf
    jp pf_true
    cf_check: ; cf
    push dx
    popf
    jc cf_true
    rol al, 1 ; сдвигаем сразу, если cf не установлен полседний бит al = 0
    ret

    of_true:
    inc al
    jmp sf_check
    sf_true:
    rol al, 1
    xor ax, 0001b
    jmp zf_check
    zf_true:
    rol al, 1
    xor al, 0001b
    jmp pf_check
    pf_true:
    rol al, 1
    xor al, 0001b
    jmp cf_check
    cf_true:
    xor al, 0001b
    ret
    Делай то, что должен. Дальше будь, что будет.
    (с) Дед

+ Reply to Thread

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
All times are GMT. The time now is 01:30
vBulletin® Copyright ©2000 - 2018
www.reverse4you.org