реализации кода с "и" и "JG" или "JLE" | как - PullRequest
4 голосов
/ 15 декабря 2011

Я пытался решить вопрос, показанный ниже;

Просто используя and, и jg или jle, как можно реализовать следующий код?

    if %eax > 4 
        jmp do
    else 
        jmp l1

конечно без изменения значения eax

Этот вопрос взят из учебника, но на него нет ответа. Можете ли вы показать мне, как это решить?

EDIT: Я пытался;

     subl $4, %eax
     andl %eax, %eax
     jg  do
     jmp l1
      .
      .
      .
     do :
     addl $4, %eax
      .
      .
      .
     l1:
     addl $4, %eax

Ответы [ 2 ]

2 голосов
/ 15 декабря 2011

Следующая последовательность and и jle решает проблему (используется синтаксис NASM):

; start execution here if eax is treated as an unsigned integer
unsigned_eax:
    and     dword [eighty - 3], eax
    and     dword [eighty], 80H
    jle     signed_eax ; jumps if eax <= 7FFFFFFFh, continues otherwise
    and     dword [eighty], 0
    jle     do ; jumps if eax > 7FFFFFFFh = always

; start execution here if eax is treated as a signed integer
signed_eax:
    and     dword [FFFFFFFC], eax
    jle     l1 ; jumps if eax < 4, continues if eax >= 4
    and     dword [FFFFFFFB], eax
    jle     l1 ; jumps if eax = 4, continues if eax > 4
    and     dword [zero], 0 ; this and the next instruction simulate "jmp do"
    jle     do
do:
    ; some code
l1:
    ; some code

FFFFFFFC    dd 0FFFFFFFCH
FFFFFFFB    dd 0FFFFFFFBH
zero        dd 0
eighty      dd 80H

Предостережение заключается в том, что это фрагмент кода, который можно использовать один раз, потому что он необратимоизменяет 2 (или 3) переменные.

1 голос
/ 15 декабря 2011

Что-то не так с cmp?

cmp eax, 4
jg do
jmp l1

Если jmp не разрешен, вы можете сделать это так:

cmp eax, 4
jg do
jle l1

Если вам было разрешено изменить eax (или использовать mov или push / pop), ответ будет:

and eax, eax // This line and the one below is to be removed if the value is unsigned
jle l1
and eax, 0xFFFFFFFC // not 3
jle l1
jg do
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...