convertir c a ensamblador con instrucción predicada [closed]

6 minutos de lectura

convertir c a ensamblador con instruccion predicada closed
amy

Quiero convertir este código en ensamblador usando instrucciones predicadas

If (A>B){

    C=A;
    D=B;
    E=0

}

else{

    C=B;
} 

¿Es correcto o cómo puedo usar jump?

cmp R1,R2; considering B is assigned to R2 and A assigned to R1
movlf R3,R1;R3 assign to C
mov R4,R2;R4 assign to D
mov R5,0; R5 assign to E
movlt R3,R2

  • ¿Sobre qué lenguaje ensamblador estás preguntando?

    – interjay

    14 de mayo de 2016 a las 8:43

convertir c a ensamblador con instruccion predicada closed
margaret flor

ADVERTENCIA: Respuesta para novatos. Puede aburrir a los usuarios experimentados hasta la muerte.


No estoy seguro si usó mal la terminología o si realmente quiere usar instrucciones predicadas1.

En este último caso, utilizando predicación ARM v6 como caso de estudio (y heredando sus premisas sobre el uso de registros), el montaje es simplemente

;r1 = A    r2 = B    r3 = C    r4 = D    r5 = E
;
;A, B unsigned            | ;A, B signed
                          |
cmp r1, r2                | cmp r1, r2 
                          |
movhi r3, r1              | movgt r3, r1
movhi r4, r2              | movgt r4, r2
movhi r5, #0              | movgt r5, #0
                          |
movls r3, r2              | movle r3, r2

Aquí di dos versiones basadas en el signo de las variables involucradas.

movhi medio muévete si es más alto. movls medio mover si es menor o igual.
movgt medio mover si es mayor. movle medio mover si es menor o igual.
Significan la misma comparación aritmética, solo que este último usa las banderas adecuadas para los números con signo.

Agrupé las instrucciones, por lo que es fácil identificar el si-entonces y el demás bloques
Observe cómo las instrucciones en el mismo bloque tienen el mismo sufijo (p. ej. hi y ls).

Lo que realmente hace que este código sea un si-entonces-otro construcción en lugar de otra cosa es el hecho de que las condiciones hils y gtle están mutuamente excluyentes (solo uno de los dos puede ser verdadero).
Entonces solo se puede ejecutar un bloque de instrucciones.

El uso de condiciones no mutuamente excluyentes da lugar a múltiples si-entonces-otro declaraciones.


Si usó mal la terminología y en realidad solo quería implementar un declaración condicional (o selección)es decir, un si-entonces-otroentonces el enfoque habitual es un rama condicional2 como Nutan ya mostró.
Aquí una versión un poco más legible:

 cmp r1, r2
 bls _A_less_same_B

 mov r3, r1
 mov r4, r2
 eor r5, r5, r5

b _end_if

_A_less_same_B:
 mov r3, r2

_end_if:

Depende de usted la carga de convertir este código para que funcione con enteros con signo.

Las palabras elegantes que terminan con dos puntos (:) son llamados etiquetasson una forma útil de nombrar puntos en código (y datos)3.
Piense en eso como números de línea flexibles.

b medio ramauna vez que se ejecuta, la siguiente instrucción se obtiene de la etiqueta (dirección) especificada como operando (por ejemplo, de _end_if).
bls es solo un predicado b (bls medio rama si es menor o igual), comúnmente conocido como rama condicional.

Las ramas condicionales son como las ramas normales, pero se pueden “ignorar” si las condiciones especificadas no se cumplen.
Se dice que un salto condicional es tomado si se cumplen las condiciones y la CPU ejecuta el salto, obteniendo así las siguientes instrucciones de la etiqueta especificada como operando.
se dice que es no tomado si no se cumplen las condiciones y la CPU continúa la ejecución desde la instrucción después la rama (el flujo del programa caer a través).

Las “condiciones” generalmente significan banderas establecidas y borradas. Algunas instrucciones, como cmpestablezca y borre estos indicadores.
Otras instrucciones, como bls utiliza estas banderas.

Las banderas se mantienen en registros dedicados (ps en ARM), pero hay arquitecturas, sobre todo MIPS, que no tienen un registro de banderas.

Puede usar su dedo para simular el flujo del programa. por ejemplo si A > B el flujo es el siguiente:

                            [Start Here]
                             ¯¯¯¯+¯¯¯¯¯
 cmp r1, r2                      |
 bls _A_less_same_B              + [Branch not taken, fall through]
                                 |
 mov r3, r1                      |
 mov r4, r2                      |
 eor r5, r5, r5                  |
                                 |
b _end_if                        +--[Branch always taken]----+
                                                             |
_A_less_same_B:                                              |
 mov r3, r2                                                  |
                                                             |
_end_if:                         +--[Land here]--------------+
                                 |
                                 V

La curva tiene la intención de representar un “salto sobre” el código que queremos omitir (el demás en este caso).


No reconozco el sabor de ensamblaje de su pregunta, por lo que no puedo ayudar a escribir ejemplos concretos.
No lo haría de todos modos porque siento que esta explicación general es suficiente y con la esperanza de que tal falta de esfuerzo de mi parte te anime a intentar resolver el ejercicio por ti mismo.

Lo cual es un paso obligatorio en la ruta del aprendizaje.


1 Instrucciones que se obtienen, decodifican (probablemente también se emiten) pero solo se ejecutan si se establecen o borran indicadores particulares.

2 Tenga en cuenta que ramas condicionales es mejor evitarlos si es posible. Dependiendo de la microarquitectura de orientación, puede haber una forma más óptima de lograr el mismo resultado. Vale la pena mencionar esto, no te molestes con eso ahora.

3 En realidad compensaciones que se convertirán en direcciones.

  • Esta es una respuesta realmente excelente a una pregunta no tan buena. ¡Buen trabajo!

    – David Holzer

    14 mayo 2016 a las 9:20

  • en BRAZO, mov r5, #0 es una forma mejor y más eficiente de poner a cero un registro. Se siente raro no usar xor, pero eso solo es bueno en x86, donde la codificación de instrucciones de longitud variable significa que evitar un byte inmediato en realidad ahorra espacio y se reconoce como un modismo de puesta a cero. En el código de máquina ARM Thumb2, eor r5,r5 es una instrucción 4B, pero mov r5, #0 es una instrucción 2B. También, eor tendrá una dependencia falsa en el valor anterior, porque no hay razón para que una microarquitectura ARM sea un caso especial eor same,same como un idioma de reducción a cero.

    – Peter Cordes

    14 mayo 2016 a las 9:44

  • @PeterCordes Mi instinto me decía que no había cero modismos, pero era demasiado perezoso para comprobarlo. Gracias por proporcionar, estoy actualizando la respuesta.

    –Margaret Bloom

    14 de mayo de 2016 a las 9:48

  • @PeterCordes: es peor que eso: en ARM y POWER, las instrucciones se mantienen intencionalmente dependientes para preservar el orden de la memoria (esto entra en memory_order_consume territorio, he aquí dragones). Es arquitectónicamente no es una instrucción de ruptura de dependencia. En x86 con su sólido modelo de memoria, no es necesario rastrear la dependencia a través de instrucciones de procesamiento de datos.

    – FEO

    14 mayo 2016 a las 12:49

  • @EOF: ahh, no me había dado cuenta de que el seguimiento de dependencias de datos estaba documentado para arquitecturas con un orden débil (aparte de Alpha). Supongo que MIPS también lo documenta. Gracias por arrojar luz sobre eso; Solo he mirado en detalle los manuales de Intel, que por supuesto no lo mencionan. No me sorprendería que las CPU de Intel realicen un seguimiento interno de las dependencias de datos para el ordenamiento de la memoria, de modo que puedan especular/OOO de formas que no afecten el ordenamiento visible a nivel mundial. De todos modos, es interesante que ARM sea arquitectónicamente necesario para no hacer dependencias de ruptura xor-zero.

    – Peter Cordes

    14 mayo 2016 a las 12:58

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad