Contador en ensamblaje

Para la feria de ciencias, necesito tres programas que cuenten hasta 50,000 y generen cada número como lo hacen, necesito uno en c ++, uno en java y uno en ensamblador. Tengo los programas c ++ y java, pero no veo qué estoy haciendo mal con mi código ensamblador:

    [org 0x100]
    [bits 32]

    mov ax, 0
    mov bx, target
    jmp start

    start:
    mov cx, 0x01
    add ax, cx
    mov dx, ax
    mov ah, 09
    int 0x21
    mov ax, dx
    cmp ax, bx
    jg term
    jmp start

    term:
    mov dx, msgT
    mov ah, 09
    int 0x21
    mov ah, 00
    int 0x21

    msgT db 'Terminating'
    target dw 50000

Estoy usando el ensamblador NASM, y ahora mismo cuenta hasta 50,000 pero no genera cada número mientras los calcula.

preguntado el 06 de noviembre de 11 a las 15:11

¿En qué plataforma está ejecutando esto? -

lo siento, olvidé incluir eso. Lo estoy ejecutando en Windows 7 -

Si está intentando crear un archivo com de MS-DOS de 16 bits, debería utilizar [bits 16]. Y como @Vlad dice AH = 09h toma una cadena en DX, no un número (ver eg aquí sobre cómo convertir un número en una cadena, también tenga en cuenta que tendrá que $-terminar la cadena en lugar de NUL-terminarla). -

Entonces, usando el método anterior, simplemente cambiaría bufferend: db 0 a bufferend: db $, y luego continuaría haciendo lo que sugirió. -

3 Respuestas

Copiado de mi comentario:

Si está intentando crear un archivo com de MS-DOS de 16 bits, debería utilizar [bits 16]. Y como @Vlad dice AH = 09h toma una cadena en DX, no un número (ver eg aquí sobre cómo convertir un número en una cadena, también tenga en cuenta que tendrá que $ -terminar la cadena en lugar de NUL-terminarla).

Algunas otras cosas:

  • mov bx, target mueve la dirección de target a bx. Tú querías: mov bx, [target].
  • jg term se ramifica en base a firmado comparación (estás comparando efectivamente ax a -15536). Quieres ja term.
  • Debe asegurarse de conservar el número, mantenerlo en un registro requiere un cuidado extremo. Es más fácil simplemente guardarlo en la pila.

La estructura básica de su programa debería ser algo como esto:

    [org 0x100] ; DOS .COM files are loaded at CS:0100h
    [bits 16]   ; And are 16-bits

start:
    mov ax, 0          ; The current count
printloop:
    push ax            ; Save current number 

    call myconvertfunc ; Some function to convert a number in ax and return a '$'-terminated string in dx
    mov ah, 0x09
    int 0x21

    mov dx, newline    ; Point dx to newline string
    mov ah, 0x09       ; Print $-terminated string in dx
    int 0x21

    pop ax             ; Restore current number

    inc ax             ; Next number 
    cmp ax, 50000      ; Compare number to the maximum number 
    jbe printloop      ; Notice branching based on unsigned comparison is needed

    mov ax, 0x4c00     ; Return 0. AH=4Ch AL=Return value
    int 0x21

newline: db 13, 10, '$' ; String containing "\r\n$"

contestado el 23 de mayo de 17 a las 14:05

Gracias por la ayuda, ahora veo mis errores y probaré tu método. - JAW1025

¿Hay alguna forma de incrementar Si hasta el final de una cadena? Lo necesito para 'mi función de conversión'. - JAW1025

¿Quieres decir como inc si o el equivalente add si, 1 ¿O quiere incrementar el valor en la dirección apuntada por si? en ese caso es inc [si]. ¿O pasar al final de la cadena? eso es solo un bucle que se incrementa si y haciendo cmp [si], SOME_VALUE para comprobar si se llega al final. - user786653

la razón por la que quiero incrementar la dirección de si al final de la cadena, es escribir el '$' al final de la misma. ¿Hay algún otro valor para hacer eso? - JAW1025

Creo que no está imprimiendo correctamente.

Este patrón de aquí dice que con Int 21 / AH = 09h imprime un $-cadena terminada, que ni su cuerda ni sus números parecen ser.

Puede que sea necesario codificar la impresión de su propio número, dígito a dígito, tal vez con Int 21 / AH = 02h.

respondido 06 nov., 11:19

Tengo razón cuando pienso que cuando dice que al es el último carácter de salida, pondría al último carácter. - JAW1025

Creo que lo que están diciendo es que después de llamar int 0x21 con ah=02h terminas con el personaje en al, pero lo habrías pasado en dl. Para la impresión de cuerdas, dejará el $ in al al final. Asumo que las rutinas usan al durante su procesamiento y no se moleste en restaurarlo. - Vlad

Ok, entonces, ¿cómo haría esto? Entiendo el concepto de que al es el último valor que se imprimirá, por lo que cuando dl = al se imprimirá y luego se detendrá, pero ¿cómo pondría un valor en dl, cuando el número entero se almacena en ax? - JAW1025

Si lo leo correctamente, al es por cierto el último valor que fue impreso, en lugar del último valor para ser impreso. Es una salida, más que una entrada. En cualquier caso, una forma de obtener el último dígito de un número n, es n mod 10. Entonces, para cortar eso, puedes hacer n = n/10;. Se vuelve complicado porque estarías poniendo tus dígitos al revés, pero te haces una idea. - Vlad

así que para obtener el último valor del número haría n = n mod 10 y luego para cortar el valor haría n = n / 10. Entonces, para obtener el valor de un número de dos dígitos, harías n = n mod 10, luego imprimirías eso, luego harías n = n mod10, n = n / 10 e imprimirías eso. - JAW1025

Espera, el montaje no es sinónimo de material viejo y polvoriento que nadie usa.

Si es para una feria: necesitas mostrar algo de innovación. (El ensamblaje de DOS de 16 bits en win7 es lo opuesto a eso)

¿No tienes más requisitos que ir a la feria y usar tu computadora win7?

  • Si su sistema operativo es de 64 bits

utilizado goasm está completo con IDE y la comunidad es enorme.

  • Si estás en 32 bits

ir con masm32 y winasm.

Estoy a favor de usar el ensamblaje de la vieja escuela, pero no cree programas de 16 bits en Windows 7 e intente usar la API de Windows en lugar de interrupciones. (el código generado seguirá siendo de alrededor de 4kb si eso es lo que necesita mostrar en la feria)

respondido 07 nov., 11:04

Para la feria, todo lo que necesito es hacer un programa de 16 bits que ejecute el estilo de línea de comandos, pero analizaré masm32 y winasm. ¿Qué los hace diferentes? ¿Solo hace que la API de Windows esté disponible> - JAW1025

@ JAW1025: No puedo decir mucho en un comentario, pero el ensamblaje de 32 bits (no solo masm) le permite usar el poder de los registros de 32 bits (eax ... etc) y puede usar la API de Windows. Winasm le brinda el poder de un entorno de desarrollo completo. Sin embargo, si el requisito es utilizar un conjunto de 16 bits, puede olvidarse de él. Tal vez pueda incluir alguna biblioteca para evitar el dolor de usar interrupciones. (busque Irvine16.inc). ¿Resolviste tu problema arriba? - 龚 元 程

El requisito para mi experimento es usar un programa de ensamblaje de 16 bits, sin embargo, a partir de ahora, cuando escriba software en ensamblador, intentaré usar 32 bits. ¿Cuál es la diferencia entre ax y eax? ¿Es literalmente que ax tiene solo 16 bits donde eax es de 32 bits? y sí, resolví mi problema anterior (creo que todavía tengo tiempo para compilarlo y solucionar los problemas). JAW1025

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.