¿Por qué usar XOR u OR para "omitir" un salto condicional?

0

Actualmente estoy trabajando en un desafío para rootearme, pero tuve que leer la solución en Internet porque ya no podía avanzar. Leí este artículo que habla sobre el desafío en el que estoy trabajando actualmente.

Él está "pasando por alto" (no sé si es el término correcto) la instrucción JNS usando:

(gdb) set $eflags = $eflags ^ 128

Y también el JNE usando:

(gdb) set $eflags = $eflags | 64

¿Alguien puede explicar por qué está utilizando el operador XOR u OR? ¿Y por qué con el valor 128 y el valor 64?

EDITAR: Esta es una pregunta que ya hice en StackOverflow pero nadie respondió.

    
pregunta S7_0 25.07.2016 - 14:54
fuente

1 respuesta

2
  

Ahora estamos en la instrucción JNS. Esto significa saltar corto si no es cero.   ...
  Así que volvamos a donde estaba la instrucción JNS y desarmamos el indicador SF   Así se ejecuta el salto. SF es el séptimo bit en el registro por lo que en   Para cancelarlo necesitamos xor con 2 ^ 7 = 128

En realidad, aquí hay un error en la primera oración, JNS significa "Saltar si no firmar", es decir, se toma el salto si la bandera de signo está no establecida. La siguiente lógica es válida: decide que quiere que se realice el salto ya que, de lo contrario, el programa saldrá. Por lo tanto, el bit de signo debe estar borrado .

Como dice, el indicador de signo es el bit 7 , un xor con 128 (= 2 ^ 7, o 0b10000000 en binario) lo volteará. (el resultado de xor es 1 si exactamente uno de los bits de entrada es 1 .) Desde que comprobó justo antes de que se estableciera el bit, no hay riesgo de que accidentalmente establezca la poco. En general, se podría and con el inverso (es decir, 127 o 0b01111111 ) para borrar el bit. (el resultado de and es 1 si exactamente ambas entradas son 1 .) Wikipedia, entre otras, tiene tablas de verdad para las funciones lógicas.

En el segundo caso, el bit en la posición 6 debe establecerse, y or con 64 (= 2 ^ 6, o 01000000) lo hace. (el resultado de or es 1 si al menos un bit de entrada es un 1 .) Podría haber usado xor para alternarlo también, pero eso nuevamente requeriría verificar si el el bit se establece primero.

    
respondido por el ilkkachu 25.07.2016 - 15:41
fuente

Lea otras preguntas en las etiquetas