¿Alguna vez hay una situación en la que ASM simplemente no sea de bajo nivel suficiente? Después de todo, el ensamblador todavía tiene que ser ensamblado. ¿Alguien ha escrito alguna vez un programa en binario? Me pregunto si alguna vez hay una razón teórica para hacerlo práctico o incluso si es posible en las computadoras modernas.¿Habría algún motivo para escribir código en binario puro?
Respuesta
Motivo histórico: Está ejecutando una máquina que requiere que su código de arranque se active en el panel frontal. (Y sí, esto se hizo. Regularmente en la primera generación de máquinas).
No es lo que buscaba razón moderna: Cuando está escribiendo un ensamblador, tiene que descubrirlo el proceso.
Hay muchas otras situaciones, y escribir un ensamblador no/no debería involucrar escribir funciones/programas en binario. – Potatoswatter
@Potatoswatter: no escribe el ensamblado en código de máquina a menos que esté escribiendo el primer ensamblaje. Pero * usted * debe entregar (o encabezar) el código suficiente para saber qué se supone que debe hacer el ensamblaje. Estoy de acuerdo con la respuesta. – dmckee
Esto se hizo en los primeros días de las computadoras personales. Vi una revisión de una computadora IMSAI que lo elogió por tener interruptores de paletas en su panel frontal, mucho mejor que los conmutadores de la Altair 8800. (IIRC, también fue la revisión que elogió el kit por su facilidad de ensamblaje, ya que el revisor solo tuvo que sacar su osciloscopio una vez). Eso fue, sin embargo, hace un tiempo. –
Solía ser muy común pasar de binario a ensamblador para comprender un volcado.
¿No está utilizando el ensamblador? No puedo pensar en ninguna razón. El ensamblador ya está programando el metal desnudo. Lo único beneficioso es permitir el uso de etiquetas como "agregar" para la instrucción real (binaria). etc.
Lo tiene, si no hay [dis] ensamblador disponible. He estado en situaciones de pirateo de firmware donde pasé el tiempo suficiente mirando secuencias de instrucciones de PowerPC sin procesar para poder reconocer y ensamblar manualmente algunos tipos de instrucciones. (Terminé portando un desensamblador: http://homepage.mac.com/potswa/source/DisDave.sit, si logras instalarlo.)
Algunos ISA son mucho más simples que otros. Los RISC siguen formatos simples y es fácil orientarse porque las instrucciones suelen tener la misma longitud y estar alineadas con los límites de las palabras. x86-64, por otro lado, está lleno de codificaciones de longitud variable y códigos de prefijo.
En FPGA proyecta o cuando se trata de circuitos personalizados, es muy común idear algún tipo de flujo de instrucciones y codificarlo a mano en binario.
En un mundo post-apocalíptico donde todos los teclados y monitores han sido destruidos y la única manera de programar tetris en su computadora es alternar en su panel frontal, sí.
Pero en serio ¿por qué alguien querría hacer tal cosa?
Editar: obviamente hay personas diseñando procesadores que tienen que programar en binario, hasta que puedan conseguir un ensamblador ejecutándose en sus procesadores, pero son un grupo muy pequeño de personas.
Primero deberá encontrar una computadora con interruptores de palanca en el panel. Recuerdo un CDC Cyber mainframe de un millón de dólares. Se alteró, pero primero tenía que encontrar el gabinete correcto y luego abrir la puerta. Allí estaban: 60 conmutadores para las palabras de 60 bits. Ahh recuerdos. –
Mi primer trabajo de programación paga fue en un Burroughs 1800, que tenía luces intermitentes y parpadeantes. Cuando ascendimos a un Burroughs 5900, perdimos los conmutadores y las luces intermitentes y no teníamos idea de qué hacía la computadora. Sí ... recuerdos. –
Recuerdos, solo con las luces parpadeantes, allá en los viejos tiempos, había más conmutadores entonces. Recuerdo, las tarjetas perforadas de tiempo eran artículos de lujo, y la depuración te volvía loco. (Bueno, yo personalmente no). – Potatoswatter
Cuando está hackeando formatos binarios a mano, como lo hace A Whirlwind Tutorial on Creating Really Teensy ELF Executables for Linux.
Bueno, puede usar hexadecimal para programar algunas instrucciones básicas de carga de arranque en una RAM o una ROM en lugar de utilizar un ensamblador, si usted fuera el desarrollador de chips. Lo hice por un softcore que escribí.
Realistamente, después de haber hecho eso, el siguiente paso es escribir un ensamblador básico en Perl o algo así.
generación de código dinámico:
Si usted tiene un problema muy simple de resolver, y el rendimiento es importante que a menudo es una buena idea para analizar el problema del espacio y generar una función especializada sobre la marcha para resolver el problema .
Un ejemplo práctico: matemáticas de alto rendimiento con matrices dispersas.
Esto a menudo implica multiplicar matrices de números, miles o millones de veces. Como muchos de los elementos de la matriz pueden ser cero o uno, puede ahorrar una gran cantidad de tiempo si elimina todas las multiplicaciones triviales.
Para hacer esto, un pequeño generador de código puede analizar las matrices y generar el código de máquina para la aritmética de la matriz sobre la marcha. Cómo hacer esto puede ir desde el uso de una biblioteca JIT (o función de lenguaje incorporado) a esquemas muy simples.
Para el caso de multiplicaciones de matriz dispersa, puede obtener un gran rendimiento simplemente pegando fragmentos de código preconstruidos para los diferentes casos juntos. Esto se puede hacer en 50 líneas de C-code.
- aprovechando opcodes indocumentados (todavía existe en varios procesadores de hoy en día!) Tenía que ver esto no hace demasiado tiempo en 6502 procesadores basados.
- cuando flasheo un programa en circuitos construidos en casa con un microcontrolador. Microcontroladores útiles para todo tipo de cosas en estos días.
En 1997 solía hacer esto en las calculadoras TI-83 cuando estaba en la escuela y no tenía acceso a un cable de enlace.
Normalmente, en ese momento, simplemente escribiría un programa de ensamblaje, usaría TASM para compilarlo y luego lo transferiría a la calculadora mediante un cable de enlace. Pero si estaba aburrido y quería poner algo pequeño, había memorizado las instrucciones de bytes suficientes para poder escribirlas para ciertas cosas.
Nota al margen Por supuesto, esto fue divertido si hubo un error en el programa, ya que podría dañar fácilmente la memoria RAM de la calculadora completa. Entonces, tendría que mantener presionado el botón ON y/o quitar las pilas AAA y esperar que eso haya sido suficiente para restablecer el cálculo (sin los programas que estaban en la memoria). De lo contrario, para hacer un restablecimiento completo, debe usar un destornillador para desenroscar una batería de respaldo especial. Buenos tiempos ...
Versión corta de esto (y de hecho todas las respuestas reales): cuando no hay ninguna herramienta disponible para hacerlo por usted. – dmckee
Recuerdo haber leído que Woz escribió el primer Apple BASIC (Apple I? Apple II?) En lenguaje de máquina. Antes de tener dispositivos de almacenamiento, era necesario ingresar códigos hexadecimales en el monitor.
Incluso si se salta el ensamblador e ingresa directamente al código de máquina, no usará binario, sino hexadecimal.
En la escuela, tuve que parchar el código en memoria usando un depurador sin el beneficio de un ensamblador. Mientras entretiene, esta es una habilidad que virtualmente no tiene ningún valor fuera de la depuración de sistemas integrados.
Además, tenga en cuenta que los mnemotécnicos de código de operación utilizados en el montaje deben tener una correspondencia 1: 1 con los códigos de operación reales (por lo tanto, el término "mnemotécnico"), por lo que no podrá hacer nada no podrías hacer en asamblea. La función del ensamblador es convertir mnemónicos en códigos de operación (también determina qué versión de una instrucción específica se debe usar, por ejemplo, MOV inmediatos o indirectos), etiquetas a direcciones y tareas similares.
Es bueno saber qué está pasando dentro del ensamblador, pero esto casi nunca aparecerá a menos que esté buscando un error en un ensamblador, hackeando un gadget incrustado o MacGyvering su salida de una realmente, muy raro situación.
Sin diferencia. Hex (o octal, que me dicen que muchos antiguos prefieren (diferente longitud de palabra, 'ya ken?)) Es simplemente una taquigrafía binaria. – dmckee
Y el sol está caliente y el agua está mojada. Sin embargo, ¿prefieres escribir "01011010" o "5A?" Además, aún no he visto el depurador que te permita ingresar binario; todos los que he visto requerían entrada hexagonal o (ugh) octal. –
Si está creando un intérprete. Quizás tengas el intérprete completo, pero no el analizador. Puede probar al intérprete escribiendo el programa a ser interpretado en binario puro.
No tenía ningún ensamblador para mi Atari de ocho bits, así que escribí el código de máquina directamente. Para iniciar el código desde BASIC, escriba el código como bytes de datos decimales o como una cadena. (Sí, en realidad podría escribir código en una cadena, el único código de carácter del 256 que no podía escribir era 155 - el código de retorno. Afortunadamente no hay instrucción de código de máquina 6502 con ese valor, por lo que era solo un problema cuando una rama pasó a ser 101 bytes hacia atrás (-101 = 155))
todavía recuerdo una pieza común de código para iniciar un temporizador:.
104 (pla)
169, 7 (lda #7)
162, 6 (ldx #6)
160, 10 (ldy #10)
76, 92, 228 (jmp 0xE45C)
En los últimos años he asistido a algunos concursos de montaje de optimización de tamaño. Aunque la mayoría del código es ensamblado, aún debe saber exactamente qué instrucciones produce el ensamblador para que sepa cuántos bytes son. Además, algunas veces usa trucos como tener algunos bytes como datos y como código, o tener algunos bytes siendo instrucciones diferentes dependiendo de si ingresa el primer byte o ingresa en medio de una instrucción. Luego, escribe las instrucciones como bytes de datos en el medio del código de ensamblaje.
Cuando estaba en formación durante mis días de la Marina, (alguna vez alrededor 1986) que tiene un equipo que nos dieron a conocer la electrónica de solución de problemas, no se programa la solución de problemas, que fue programado por la introducción de información binaria en la parte frontal del equipo , y tuvimos que decirle al instructor lo que rompieron en la máquina en función de los resultados y la solución de problemas del hardware. Por lo que yo sé, todavía podría haber una de esas máquinas alrededor.
Ojalá pudiera encontrar mi código fuente para él, de hecho escribí un simulador de la máquina y una compilación para el lenguaje de la máquina. ¡Fue increíble cuánto trabajo se podía hacer con 1024 bytes de memoria! :)
Ritual de novatadas para el nuevo miembro del equipo.
Algunas veces se beneficia al trabajar con el código máquina sin procesar, no solo con el lenguaje ensamblador. Por ejemplo, considere enviar un archivo binario por correo electrónico, pero con un programa de correo electrónico que no sepa cómo decodificar los archivos adjuntos. En un momento, algunas personas escribieron pequeños programas que podían decodificar el resto de un archivo adjunto, pero todo en el programa era un carácter imprimible. Entonces, decodifique sus archivos adjuntos, guardará el cuerpo del correo electrónico como whatever.com
y luego lo ejecutará. Descodificaría el archivo adjunto y escribiría un archivo binario que luego podría ejecutar.
Para otro ejemplo, hace años en Fidonet había un desafío bastante simple: escribir un programa que simplemente imprime un número que se incrementa cada vez que se ejecuta, pero (la parte que lo hizo complicado) no está permitido usar cualquier archivo externo u otro almacenamiento para hacer el trabajo. Para evitar que esto se vuelva demasiado aburrido, también era una especie de código de golf, aunque el tamaño medido era bytes ejecutables, no el código fuente. Algunas de las entradas a este desafío usaron código de auto modificación que dependía en gran medida de cómo se codificaban las instrucciones y demás.
Buscando un segundo, veo que todavía tengo el código fuente a uno de mis intentos:
.model tiny,c
.286
.code
.startup
main proc
mov si,offset count
inc byte ptr [si]
mov al, [si]
mov bx,4090h
shr al, 4
call convert
lodsb
and al,0fh
mov byte ptr end_convert, 08bh
convert:
add al,bl
daa
adc al,bh
daa
int 29h
end_convert:
ret
db 0d6h
; mov dx, si
mov ah,3ch
xor cx, cx
int 21h
xchg bx, ax
mov dx,offset main
mov cx,offset the_end - offset main
int 21h
ret
main endp
count:
db 0
name:
db 'c.com', 0
the_end:
end
que será mejor dejar de fumar ahora, antes de que yo soy responsable de que nadie tenga ataques de apoplejía (la esperanza de que no es demasiado tarde ...)
Un ejemplo realmente genial es este famoso políglota, que es un DOS válido.¡Archivo COM entre otras cosas porque el código ASCII en su código fuente funciona como instrucciones binarias x86! http://ideology.com.au/polyglot/polyglot.txt
Ejemplos más aburridas ...
Muchos procesadores implementan instrucciones ISA como secuencias de micro-instrucciones más primitivas (básicamente colecciones de señales de control de camino de datos) que son "microcodificado" en una ROM de microcódigo.
Para un procesador lo suficientemente simple, puede escribir microcódigo directamente en binario en lugar de ensamblarlo desde un lenguaje mnemónico. O si está realizando un ingeniería inversa de un procesador, es posible que no conozca su conjunto de microinstrucciones y solo tenga que adivinar el formato de las microinstrucciones ... en cuyo caso probablemente también esté trabajando en binario. De cualquier forma, este es un nivel más bajo que el lenguaje ensamblador.
Algunas veces el código para procesadores antiguos como el 6502 usaba instrucciones no documentadas que no tenían mnemónicos oficiales, por lo que tenía que escribir valores binarios en lugar de instrucciones de ensamblaje.
Para un proyecto universitario tuve que diseñar un microcontrolador simplificado en VHDL (un lenguaje de descripción de hardware). Para probarlo, escribí un programa extremadamente simple en binario, porque era la forma más conveniente de alimentar el programa en el microcontrolador simulado.
- 1. En un código paralelo OpenMP, ¿habría algún beneficio para memset para ejecutarse en paralelo?
- 2. Cargar un archivo binario usando JavaScript puro
- 3. cómo depurar código nativo puro en android?
- 4. Evitar IORefs en código puro
- 5. ¿Es posible escribir código para escribir código?
- 6. Escribir archivo binario en Ruby
- 7. Código JavaScript puro para autenticación básica HTTP?
- 8. HtmlAgilityPack - ¿Se cierra el <form> por algún motivo?
- 9. Incrementando la tabla MySQL por 10 por algún motivo
- 10. No se puede escribir un archivo binario
- 11. Codificación :: UndefinedConversionError al escribir un archivo binario
- 12. C# ¿hay algún motivo para utilizar ArrayList en lugar de List <T>?
- 13. Bash: escribir número entero de archivo binario
- 14. ¿Algún navegador web permite escribir en stdout?
- 15. ¿Hay algún buen software de código abierto para escribir casos de prueba?
- 16. ¿Hay algún módulo que me falte para ayudarme a escribir un código mejor?
- 17. Escribir un búfer binario en un archivo en Python
- 18. Escribir un archivo descargado binario en un disco en Java
- 19. ¿Hay algún atributo de html puro para especificar qué elemento debe centrarse en la carga
- 20. ¿Hay algún módulo Perl puro para crear imágenes y colocar texto en la imagen?
- 21. escribir una cadena de presentar en modo binario
- 22. ¿Algún motivo para la cláusula GROUP BY sin función de agregación?
- 23. Cómo escribir un blob binario en el disco en Informix
- 24. ¿Podría escribir mejor este código?
- 25. Escribir en el medio de un archivo binario existente C++
- 26. Archivo de objeto a código binario
- 27. Escribir código para Mac con Lazarus
- 28. Biblioteca para escribir el código de JavaScript
- 29. Mejores prácticas para escribir código abierto Java
- 30. ¿Puede Webkit JavaScript PUT o POST una imagen REST-style como binario puro?
Quizás deba preguntar esto a alguien de Intel/AMD. –
@David: ¿Cuál es su punto? –