سؤال

mov al,10
add al,15

كيف يمكنني طباعة قيمة "أمن'?

هل كانت مفيدة؟

المحلول

هل جربت int 21h الخدمة 2.? DL هي الشخصية للطباعة.

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

لطباعة القيمة الصحيحة، سيتعين عليك كتابة حلقة لتحلل عدد صحيح للأحرف الفردية. إذا كنت بخير مع طباعة القيمة في عرافة، فهذا هو تافهة جميلة.

إذا لم تتمكن من الاعتماد على خدمات DOS، فقد تكون قادرا أيضا على استخدام BIOS. int 10h مع AL ضبط ل 0Eh أو 0Ah.

نصائح أخرى

لغة التجميع ليس لديها وسيلة مباشرة لطباعة أي شيء. يجوز للمجمع الخاص بك أو لا يأتي مع مكتبة تزود هذه المنشأة، وإلا عليك كتابة ذلك بنفسك، فستكون وظيفة معقدة للغاية. يجب عليك أيضا تحديد مكان طباعة الأشياء - في نافذة، على الطابعة؟ في المجمع، أي من هذا يتم من أجلك.

DOS طباعة قيمة 32 بت مخزنة في EAX مع الناتج السداسي عشري (80386+)
(على 64 بت استخدام 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

إخراج السلسلة البديلة مباشرة إلى VideoBuffer دون استخدام وسائل الإعلام:

;-----------------------
; 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

قد يكون لديك بعض الحظ الذي يقوم بتوصيل MessageBoxa Win32 API الخاص ب API، على الرغم من أن Win16 يدعم هذه الطريقة المعينة مخصصة لشخص آخر للإجابة عليه.

آه = 09 DS: DX = مؤشر إلى سلسلة تنتهي في "$"

returns nothing


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

المرجع: 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

على افتراض أنك تكتب أداة تحميل أداة تحميل أو تطبيق آخر يمكن الوصول إلى BIOS، إليك رسم تقريبي لما يمكنك القيام به:

  • عزل الرقم الأول من بايت عرافة
  • إذا كان أكبر من 9 (أي 0x0a إلى 0x0f)، فطرح 10 منها (قم بزيادة حجمها إلى 0 إلى 5)، وأضف "A" (0x41).
  • إذا كانت أقل من أو تساوي 9 (IE 0x00 إلى 0x09)، أضف "0" إليها.
  • كرر هذا مع رقم سداسي عشري التالي.

هنا هو تطبيقي لهذا:

; 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   

استدعاء وظيفة Winapi (إذا كنت تقوم بتطوير تطبيق فوز)

;        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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top