resueltos programas numeros numero lenguaje ingresar imprimir explicados ensamblador ejercicios ejemplos datos cadena assembly x86 real-mode

assembly - programas - lenguaje ensamblador pdf



¿Imprimiendo un número en lenguaje ensamblador? (10)

¿Has probado int 21h service 2 ? DL es el personaje a imprimir.

mov dl,''A'' ; print ''A'' mov ah,2 int 21h

Para imprimir el valor entero, tendrá que escribir un bucle para descomponer el entero en caracteres individuales. Si estás de acuerdo con imprimir el valor en hexadecimal, esto es bastante trivial.

Si no puede confiar en los servicios de DOS, también podría usar el BIOS int 10h con AL configurado en 0Eh o 0Ah .

mov al,10 add al,15

¿Cómo imprimo el valor de '' al ''?


AH = 09 DS: DX = puntero a cadena que termina en "$"

returns nothing - outputs character string to STDOUT up to "$" - backspace is treated as non-destructive - if Ctrl-Break is detected, INT 23 is executed

ref: http://stanislavs.org/helppc/int_21-9.html

.data string db 2 dup('' '') .code mov ax,@data mov ds,ax mov al,10 add al,15 mov si,offset string+1 mov bl,10 div bl add ah,48 mov [si],ah dec si div bl add ah,48 mov [si],ah mov ah,9 mov dx,string int 21h


DOS Imprime el valor de 32 bits almacenado en EAX con salida hexadecimal (para 80386+)
(en el sistema operativo de 64 bits use DOSBOX)

.code mov ax,@DATA ; get the address of the data segment mov ds,ax ; store the address in the data segment register ;----------------------- mov eax,0FFFFFFFFh ; 32 bit value (0 - FFFFFFFF) for example ;----------------------- ; convert the value in EAX to hexadecimal ASCIIs ;----------------------- mov di,OFFSET ASCII ; get the offset address mov cl,8 ; number of ASCII P1: rol eax,4 ; 1 Nibble (start with highest byte) mov bl,al and bl,0Fh ; only low-Nibble add bl,30h ; convert to ASCII cmp bl,39h ; above 9? jna short P2 add bl,7 ; "A" to "F" P2: mov [di],bl ; store ASCII in buffer inc di ; increase target address dec cl ; decrease loop counter jnz P1 ; jump if cl is not equal 0 (zeroflag is not set) ;----------------------- ; Print string ;----------------------- mov dx,OFFSET ASCII ; DOS 1+ WRITE STRING TO STANDARD OUTPUT mov ah,9 ; DS:DX->''$''-terminated string int 21h ; maybe redirected under DOS 2+ for output to file ; (using pipe character">") or output to printer ; terminate program... .data ASCII DB "00000000",0Dh,0Ah,"$" ; buffer for ASCII string

Cadena alternativa de salida directamente al videobuffer sin utilizar interrupciones de software:

;----------------------- ; Print string ;----------------------- mov ax,0B800h ; segment address of textmode video buffer mov es,ax ; store address in extra segment register mov si,OFFSET ASCII ; get the offset address of the string ; using a fixed target address for example (screen page 0) ; Position`on screen = (Line_number*80*2) + (Row_number*2) mov di,(10*80*2)+(10*2) mov cl,8 ; number of ASCII cld ; clear direction flag P3: lodsb ; get the ASCII from the address in DS:SI + increase si stosb ; write ASCII directly to the screen using ES:DI + increase di inc di ; step over attribut byte dec cl ; decrease counter jnz P3 ; repeat (print only 8 ASCII, not used bytes are: 0Dh,0Ah,"$") ; Hint: this directly output to the screen do not touch or move the cursor ; but feel free to modify..


El lenguaje ensamblador no tiene medios directos para imprimir nada. Su ensamblador puede o no venir con una biblioteca que proporciona dicha instalación, de lo contrario, debe escribirlo usted mismo, y será una función bastante compleja. También tiene que decidir dónde imprimir las cosas: ¿en una ventana, en la impresora? En ensamblador, nada de esto está hecho para ti.


Es posible que tenga suerte al llamar a MessageBoxA de la API de Win32, aunque el hecho de que Win16 admita ese método en particular es para que otra persona lo conteste.


Llame a la función WinAPI (si está desarrollando una aplicación Win)


Suponiendo que está escribiendo un gestor de arranque u otra aplicación que tiene acceso al BIOS, aquí hay un bosquejo de lo que puede hacer:

  • Aislar el primer dígito del byte hexadecimal
  • Si es mayor que 9 (es decir, 0x0A a 0x0F), reste 10 de él (redúzcalo a 0 a 5), ​​y agregue ''A'' (0x41).
  • Si es menor o igual que 9 (es decir, 0x00 a 0x09), agregue ''0'' a él.
  • Repita esto con el siguiente dígito hexadecimal.

Aquí está mi implementación de esto:

; Prints AL in hex. printhexb: push ax shr al, 0x04 call print_nibble pop ax and al, 0x0F call print_nibble ret print_nibble: cmp al, 0x09 jg .letter add al, 0x30 mov ah, 0x0E int 0x10 ret .letter: add al, 0x37 mov ah, 0x0E int 0x10 ret


; good example of unlimited num print .model small .stack 100h .data number word 6432 string db 10 dup(''$'') .code main proc mov ax,@data mov ds,ax mov ax,number mov bx ,10 mov cx,0 l1: mov dx,0 div bx add dx,48 push dx inc cx cmp ax,0 jne l1 mov bx ,offset string l2: pop dx mov [bx],dx inc bx loop l2 mov ah,09 mov dx,offset string int 21h mov ax,4c00h int 21h main endp end main


PRINT_SUM PROC NEAR CMP AL, 0 JNE PRINT_AX PUSH AX MOV AL, ''0'' MOV AH, 0EH INT 10H POP AX RET PRINT_AX: PUSHA MOV AH, 0 CMP AX, 0 JE PN_DONE MOV DL, 10 DIV DL CALL PRINT_AX MOV AL, AH ADD AL, 30H MOV AH, 0EH INT 10H PN_DONE: POPA RET PRINT_SUM ENDP


mov al,3 ;print ♥ mov dl,al ;call print service(2) to print from dl mov ah,2 int 21h ;return to DOS mov ah,76 ;76 = 4ch int 21h ;call interrupt