philip - convertir c para ensamblar con instrucción predicada
fundamentos de marketing philip kotler y gary armstrong pdf (1)
Quiero convertir este código a ensamblado usando instrucción predicada
If (A>B){
C=A;
D=B;
E=0
}
else{
C=B;
}
¿Es correcto o cómo puedo usar el salto?
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
ADVERTENCIA : respuesta para novatos. Puede aburrir a los usuarios experimentados.
No estoy seguro de si ha utilizado mal la terminología o si realmente desea usar instrucciones predicadas 1 .
En el último caso, usando la predicción ARM v6 como un caso de estudio (y heredando sus premisas sobre el uso del registro), el ensamblaje 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
significa moverse si es más alto . movls
significa mover si es más bajo o igual .
movgt
significa mover si es mayor . movle
significa moverse si es menor o igual .
Significan la misma comparación aritmética, es solo que este último usa las banderas adecuadas para los números con signo.
Agrupé las instrucciones, por lo que es fácil identificar los bloques if-then y else .
Tenga en cuenta que las instrucciones en el mismo bloque tienen el mismo sufijo (por ejemplo, hi
y ls
).
Lo que realmente hace que este código sea una construcción si-luego-más en lugar de otra cosa es el hecho de que las condiciones hi
- ls
y gt
- le
son mutuamente excluyentes (solo una de las dos puede ser verdadera).
De modo que solo se puede ejecutar un bloque de instrucciones .
El uso de condiciones no mutuamente excluyentes da lugar a múltiples declaraciones if-then-else .
Si utilizó mal la terminología y realmente quería implementar una declaración (o selección) condicional , es decir, un if-then-else , entonces el enfoque habitual es una rama condicional 2 como Nutan ya se muestra.
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 en dos puntos (:) se llaman etiquetas , son una forma útil de nombrar puntos en el código (y datos) 3 .
Piense en eso como números de línea flexibles.
b
significa bifurcación , una 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
significa rama si es menos o igual ), comúnmente conocida como rama condicional .
Las ramas condicionales son como las ramas normales, pero pueden "ignorarse" si las condiciones especificadas no se cumplen.
Se dice que se toma un salto condicional 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 no se toma si las condiciones no se cumplen y la CPU continúa la ejecución de la instrucción después de la bifurcación (el flujo del programa no se cumple).
Las "condiciones" generalmente significan banderas establecidas y despejadas . Algunas instrucciones, como cmp
, establecen y borran estas banderas.
Otras instrucciones, como bls
usan estas banderas.
Las banderas se mantienen en un registro dedicado ( ps
en ARM), pero hay arquitecturas, sobre todo MIPS, que no tienen un registro de banderas.
Puedes usar tu 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
El doblez significa imaginar un "salto sobre" el código que queremos omitir (el resto en este caso).
No reconozco el sabor de la asamblea de su pregunta, así que no puedo ayudar escribiendo ejemplos concretos.
No lo haría de todos modos ya que creo que esta explicación general es suficiente y con la esperanza de que esa falta de esfuerzo de mi parte lo incite a intentar resolver el ejercicio usted mismo.
Que es un paso obligatorio en la ruta de aprendizaje.
1 Instrucción que se capta, decodifica (probablemente también se emite) pero solo se ejecuta si se configuran o borran determinados indicadores.
2 Tenga en cuenta que es mejor evitar las ramas condicionales si es posible. Según la microarquitectura de orientación, puede haber una forma más óptima de lograr el mismo resultado. Esto solo fue digno de mención, no te preocupes por eso ahora mismo.
3 De hecho, compensaciones que se convertirán en direcciones.