Ausdrucke eine Nummer in Assemblersprache?
Frage
mov al,10
add al,15
Wie drucke ich den Wert ' al '?
Lösung
Haben Sie versucht, int 21h
service 2 ? DL
ist das Zeichen zu drucken.
mov dl,'A' ; print 'A'
mov ah,2
int 21h
den Integer-Wert drucken, erhalten Sie eine Schleife schreiben müssen, um die ganze Zahl auf einzelne Zeichen zu zersetzen. Wenn Sie in Ordnung mit Druck den Wert in hex, ist dies ziemlich trivial.
Wenn Sie nicht auf DOS Dienste verlassen können, können Sie auch in der Lage sein, das BIOS int 10h
mit AL
Satz 0Eh
oder 0Ah
.
Andere Tipps
Assemblersprache hat keine direkten Mittel etwas zu drucken. Ihr Assembler kommen oder auch nicht mit einer Bibliothek kann die Belieferung der eine solche Einrichtung, sonst muss man es selbst schreiben, und es wird ziemlich komplexe Funktion sein. Sie müssen auch entscheiden, wo die Dinge drucken - in einem Fenster, auf dem Drucker? In Assembler, nichts davon ist für Sie erledigt.
DOS 32-Bit-Wert in EAX mit hexadezimaler Ausgabe gespeichert Drucke (für 80386+)
(Auf 64-Bit-OS Verwendung 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
Alternative String Ausgabe direkt an den videobuffer ohne Software interupts mit:
;-----------------------
; 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..
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
Sie könnten etwas Glück haben die Win32-API MessageBoxA Aufruf, obwohl ob Win16 unterstützt, dass bestimmte Verfahren für jemanden anderes zu beantworten.
AH = 09 DS: DX = Zeiger auf Zeichenkette in "$" enden
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
Angenommen, Sie sind einen Bootloader oder eine andere Anwendung zu schreiben, den Zugriff auf das BIOS hat, hier ist eine grobe Skizze von dem, was Sie tun können:
- Isolieren Sie die erste Ziffer des Hex-Byte
- Wenn es größer als 9 (d 0x0A bis 0x0F) ist, subtrahieren 10 von ihm (Skalierung es auf 0 bis 5 nach unten), und fügen Sie 'A' (0x41).
- Wenn sie weniger als oder gleich 9 (d.h. 0x00 bis 0x09), fügt '0' zu.
- Wiederholen Sie diesen Vorgang mit dem nächsten Hexadezimalzeichens.
Hier ist meine Umsetzung dieses:
; 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
Anruf WinAPI Funktion (wenn u win-Anwendung entwickeln)
; 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
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