2009-12-17 18 views
18
mov al,10 
add al,15 

'al' değerinin değerini nasıl yazdırabilirim?Montaj dilinde bir numara mı yazdırılıyor?

+6

ve işletme: "$"

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 biten dizeye DX = işaretçi Sistem, G/Ç genellikle çok platform bağımlı olduğundan. – unwind

+1

O yaptı, bir "win16" etiketi var. –

+3

win16 gerçekten mi? Hala Windows 3.1 kullanıyoruz? –

cevap

21

int 21h service 2 denediniz mi? Yazdırılacak karakter DL'dur.

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

tamsayı değeri yazdırmak için, bireysel karakter tamsayı ayrıştırmak için bir döngü yazmak gerekecek. Değeri altıya yazdırmakla sorun yoksa, bu oldukça önemsiz.

DOS hizmetlerine güvenemez, ayrıca kullanmak mümkün olabilir BIOS int 10h0Eh veya 0Ah için ayarlanmış AL ile.

+0

Müthiş yardım .. uzun zamandır arıyordu .. her yerde mov ah, 09 dizileri basmak için değil, mov ah, 02 tek değer baskı için. – unrealsoul007

-1

Çağrı WinAPI fonksiyonu

+2

f Windows uygulamasında (hatta) asm veya C olarak yazılır. Ardından, işlevler bir WinAPI işlevi olacaktır. "* Ben hastayım" diyen birine "* bir doktor görmelisin" cevabını vermek gibi. – user2284570

6

Assembly dili şey baskı doğrudan araçlara sahip (u kazan-uygulama geliştirme olursa). Toplayıcınız böyle bir tesis sağlayan bir kütüphaneye sahip olabilir veya gelmeyebilir, aksi takdirde kendiniz yazmanız gerekir ve oldukça karmaşık bir işlev olacaktır. Ayrıca, bir şeylerin nerede yazdırılacağına da karar vermelisiniz - bir pencerede, yazıcıda? Montajcıda, bunların hiçbiri sizin için yapılmaz.

0

Win16'nın bu özel yöntemi destekleyip desteklemediği başka birisinin yanıt vermesine rağmen, Win32 API'sinin MessageBoxA'ını çağırmak için biraz şansınız olabilir.

1
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 
+4

Lütfen cevabı detaylandırmak için kodun bir parçası olmayan bazı cümleler ekleyin ... – user2284570

-1
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 
-1
mov al,4 ; input 

; print AL 
    or al,30h ; Important! =>Convert an integer from 0-9 to its ASCII encoding 
    mov i,al 

    MOV AH, 2 ; 
    MOV DL, i ; Print Character. 
    INT 21H ; 
+0

Very Thanks Kay. –

+0

Belleğe 'i 'aracılığıyla değeri döndürmeye gerek yoktur. mov dl, iyi çalışırdı. –

+0

4 yıl geçti ve montaj dilini unuttum. :( Muhtemelen haklısınız. Teşekkür ederiz. <3 –

-1
;  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 
+3

Lütfen yanıtın ayrıntılarını vermek için kodun bir parçası olmayan bazı cümleler ekleyin ... – user2284570

+1

korkunç biçimlendirme. Tonlarca boşluk ile neredeyse okunamaz, girintisiz ve yorumsuz olduğu için reddedildi. –

3

.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 

Alternatif
(64 bit işletim sistemi dosbox kullanın) (80386 + için) onaltılık çıkışı ile EAX saklanan

DOS Baskı 32 bitlik değer dize çıktısını doğrudan yazılım ara bağlantısı kullanmadan video oynatıcısına yönlendirin:

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

AH = 09 DS: http://stanislavs.org/helppc/int_21-9.html


Sen makine türünü belirtmek gerekir
.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 
+1

Lütfen kodunuzun bazılarını açıklamaya çalışınız. – Marcs