Farbige Hello World in TASM
Guten Tag. Ich bin neu in der Assembler-und ich bin versucht zu drucken eines farbigen "Hallo Welt" in TASM. Hier ist mein code bisher. Es druckt nur "Hallo Welt", ohne eine Farbe.
.model small
.stack 100h
.data
message db 13,10,"Hello World!$"
.code
main proc near
lea dx, message
mov ah, 09h
int 21h
mov ah,4ch
int 21h
main endp
Ich habe so etwas Lesen
mov ah,9 ;Function 9: Write character and attribute at cursor position
mov al,'H' ;AL = character to display
mov bh,0 ;BH = page number
mov bl,02EH ;BL = attribute (yellow on green)
mov cx,1 ;CX = number of times to write character
int 10H ;Int 10H: Video (show the character)
in einem forum, aber ich kann nicht integrieren, es mit meiner hello world. Ich bin verwirrt, warum verwenden Sie, dass insbesondere register und dergleichen. Bitte helfen Sie mir. Ich danke Ihnen sehr!
BEARBEITEN
.model small
.stack 100h
.data
hello db 'Hello World!',0
.code
main proc near
mov ax, @data
mov ds, ax
mov ax, 3
int 10h
mov si, 0 ; cl is the counter register, set it to
; zero (the first character in the string)
start: ; Beginning of loop
mov al, hello[si] ; Read the next byte from memory
cmp al, 0 ; Compare the byte to null (the terminator)
je endthis ; If the byte is null, jump out of the loop
mov ah, 09h
mov al, hello[si]
mov bh, 0
mov bl,02EH
mov cx,11
int 10H
add si, 1 ; Move to the next byte in the string
jmp start ; Loop
endthis:
mov ah, 4ch
int 21h
main endp
end main
Du musst angemeldet sein, um einen Kommentar abzugeben.
Assembler, wie jede Programmiersprache ist, ist eine Folge von beliebigen design-Entscheidungen. Manchmal kann es einen Grund, warum eine bestimmte register verwendet, da ein interrupt-Aufruf input-register (Optimierung), aber vielfach nicht, und man muss nur die Schnittstelle (hier
int 10h
oderint 21h
) als erteilt.Zusammenhang mit Ihrem problem mit mehreren Ausrufezeichen
!!!!!!!!!!!
(ich nehme an, 11 Ausrufezeichen), Sie haben falsche Parameter in Ihremint 10
interrupt-Aufruf:Laut Ralf Brown ' s Interrupt-Liste, die Parameter für
mov ah,9
,int 10h
sind die folgenden:So, statt
mov cx,11
sollte esmov cx,1
.Und die zweite
mov al, hello[si]
ist überflüssig, weilhello[si]
bereits geladen wurde inal
damals mit der vorherigen identisch Unterricht. Dies hat keine Auswirkung auf die Funktionsweise des Codes jedoch.Edit: Zusätzlichen Informationen, wie das setzen und Lesen der cursor-Position mit
int 10h
.Scheint es, dass müssen Sie auch zum aktualisieren der Position des Cursors mit
mov ah,2
,int 10h
Verwendung der folgenden Parameter:Möglicherweise können Sie benötigen zum Lesen der aktuellen cursor-position mit
mov ah,3
,int 10h
Verwendung der folgenden Parameter:1
es druckt nur ein einzelnes!
Ausrufezeichen. Was könnte getan werden, sir?CX = number of times to write character
.hello world
. 🙂 Warum ist es ab auf das Letzte Zeichen des Strings?int 10h
- Aufrufe und deren Parameter zum aktualisieren der Position des Cursors.Wenn Sie die Programmierung in Assembler für DOS sollten Sie sich vertraut mit einige der Häufig verwendeten interrupts, wie
int 10h
undint 21h
. Für jede interrupt-Unterfunktion gibt es einen entsprechenden Satz von Parametern, die Sie brauchen, um passieren, um es durch ein oder mehrere Register.Den interrupt in dem Beispiel-code, den Sie eingefügt wird, "SCHREIBEN ZEICHEN UND ATTRIBUT AN Cursorposition", und Sie finden die Beschreibung hier.
Werden, um eine Zeichenfolge mit color-Attribute müssen Sie Durchlaufen den string in einer Schleife und rufen Sie den interrupt für jedes Zeichen mit den entsprechenden Parametern.