Obtener dia de la semana 16 bits.

Iniciado por Juan, Mayo 15, 2013, 11:42:15 AM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Código: asm
; Ejemplo obtener dia de la semana.
; juan fary (mDrinky)

org 0x100

mov ah,0x2A
int 21h

cmp al,0 ; Es domingo
je Domingo

cmp al,1 ; es lunes

cmp al,3 ; es miercoles
je Miercoles

cmp al,4 ; es jueves
je Jueves

cmp al,5 ; es viernes
je Viernes

cmp al,6 ; es sabado
je Sabado

salir:

mov ah,0x1
int 21h

mov ah,0x4C
mov al,0

int 0x21

Domingo:
    push textDomingo
    call _print
    jmp salir

Lunes:
    push textLunes
    call _print
    jmp salir

Martes:
    push textMartes
    call _print
    jmp salir

Miercoles:
    push textMiercoles
    call _print
    jmp salir

Jueves:
    push textJueves
    call _print
    jmp salir

Viernes:
    push textViernes
    call _print
    jmp salir

Sabado:
    push textSabado
    call _print
    jmp salir

_print:      ; Función que imprime en pantalla.
    push bp
    mov bp,sp

    mov ah,0x9
    mov dx,word[bp+4]
    int 21h

    pop bp

    ret 2

textDomingo             db 'Es Domindo$'
textLunes               db 'Es Lunes$'
textMartes              db 'Es Martes$'
textMiercoles           db 'Es Miercoles$'
textJueves              db 'Es Jueves$'
textViernes             db 'Es Viernes'
textSabado              db 'Es Sabado$'     

¿Por qué no usar un array de punteros? :-\
I code for $$$.

(PGP ID 0xCC050E77)
ASM, C, C++, VB6... skilled [malware] developer

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
¿Por qué no usar un array de punteros? :-\

Coincido XD

Mayo 15, 2013, 02:24:40 PM #3 Ultima modificación: Mayo 15, 2013, 03:00:04 PM por mDrinky
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
¿Por qué no usar un array de punteros? :-\

Emm, como sería lo que tu dices?


un saludo!




EDITO:

Lo pense y supongo que dices asi...

Código: asm
; Ejemplo obtener dia de la semana.  V2.0
; juan fary (mDrinky)

org 0x100

mov ah,0x2A
int 21h

xor dx,dx
xor ah,ah

mov cx,2
mul cx

mov bx,Dias
add bx,ax

mov dx,[bx]

push dx
call _print

salir:

mov ah,0x1
int 21h

mov ah,0x4C
mov al,0

int 0x21


_print:      ; Función que imprime en pantalla.
    push bp
    mov bp,sp

    mov ah,0x9
    mov dx,word[bp+4]
    int 21h

    pop bp

    ret 2

Dias                    dw D1,D2,D3,D4,D5,D6,D7

D1                      db 'Es Domingo$'
D2                      db 'Es Lunes$'
D3                      db 'Es Martes$'
D4                      db 'Es Miercoles$'
D5                      db 'Es Jueves$'
D6                      db 'Es Viernes'
D7                      db 'Es Sabado$'   


saludos!

A eso me refería pero se puede simplificar más:
Código: asm
mov ah,0x2A
int 21h

mov bx, ax
shl bx, 2

push [Dias + bx]
call _print
I code for $$$.

(PGP ID 0xCC050E77)
ASM, C, C++, VB6... skilled [malware] developer

Con el fragmento que as puesto no muestra correctamente el resultado  :-\

No he programado nunca para 16bits... Tal vez sea por no limpiar la parte superior de AX. Mira a ver así:
Código: asm
mov ah,0x2A
int 21h

xor ah, ah
mov bx, ax
shl bx, 2

push [Dias + bx]
call _print
I code for $$$.

(PGP ID 0xCC050E77)
ASM, C, C++, VB6... skilled [malware] developer

Ya se porque es... al ser para 16 bits la palabra es de 2 bytes y no 4, el error esta aquí:

Código: php
shl bx, 2


En 32 bits estaría bien multiplicar por 4, pero para 16 tienes que multiplicar por 2.

Así funciona correctamente...

Código: asm
    mov ah,0x2A
    int 21h
     
    xor ah, ah
    mov bx, ax
    shl bx, 1
     
    push [Dias + bx]
    call _print     


un saludo!

Sí, lo copié de tu código sin pensar y no caí en que eran punteros de dos bytes :P
I code for $$$.

(PGP ID 0xCC050E77)
ASM, C, C++, VB6... skilled [malware] developer