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

Làm cách nào để in giá trị 'al'?In ra một số trong ngôn ngữ lắp ráp?

+6

Bạn cần phải xác định loại máy tính của bạn và điều hành hệ thống, vì I/O thường phụ thuộc vào nền tảng. – unwind

+1

Ông đã làm, nó có một thẻ "win16". –

+3

win16 thực sự? Vẫn đang sử dụng Windows 3.1 là chúng ta? –

Trả lời

21

Bạn đã thử int 21h service 2 chưa? DL là ký tự cần in.

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

Để in giá trị số nguyên, bạn sẽ phải viết một vòng để phân tách số nguyên thành các ký tự riêng lẻ. Nếu bạn không sao với việc in giá trị trong hex, điều này là khá tầm thường.

Nếu bạn không thể dựa vào dịch vụ DOS, bạn cũng có thể sử dụng BIOS int 10h với AL được đặt thành 0Eh hoặc 0Ah.

+0

Trợ giúp tuyệt vời .. đã tìm kiếm một thời gian dài .. ở khắp mọi nơi nó đã được mov ah, 09 mà cho in mảng nhưng không mov ah, 02 cho in ấn giá trị duy nhất. – unrealsoul007

-1

Gọi hàm WinAPI (nếu bạn đang phát triển ứng dụng thắng)

+2

f bạn viết một cửa sổ ứng dụng (ngay cả với) trong asm hoặc C ... Sau đó, chức năng sẽ là một chức năng WinAPI. Nó giống như trả lời "* bạn nên đi khám bác sĩ *" cho ai đó nói "* Tôi bị bệnh *". – user2284570

6

Ngôn ngữ lắp ráp không có phương tiện in trực tiếp. Người lắp ráp của bạn có thể hoặc không thể đi kèm với một thư viện cung cấp một cơ sở như vậy, nếu không bạn phải tự viết nó, và nó sẽ là một chức năng khá phức tạp. Bạn cũng phải quyết định nơi in mọi thứ - trong một cửa sổ, trên máy in? Trong lắp ráp, không ai trong số này được thực hiện cho bạn.

0

Bạn có thể có một số may mắn gọi MessageBoxA của API Win32, mặc dù Win16 có hỗ trợ phương thức cụ thể đó cho người khác trả lời hay không.

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

Vui lòng thêm một số câu không phải là một phần của mã để chi tiết câu trả lời ... – 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

Rất cảm ơn Kay. –

+0

Không cần trả lại giá trị thông qua 'i' trong bộ nhớ. 'mov dl, al' sẽ hoạt động tốt. –

+0

4 năm trôi qua và tôi quên ngôn ngữ lắp ráp. :( Có thể bạn đã đúng. Cảm ơn bạn. <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

Vui lòng thêm một số câu không phải là một phần của mã để chi tiết câu trả lời ... – user2284570

+1

định dạng khủng khiếp. Được bình chọn là gần như không thể đọc được với hàng tấn khoảng trống, không thụt lề và không có bình luận. –

3

DOS giá trị In 32 bit lưu trữ trong EAX với sản lượng hệ thập lục phân (ví 80386+)
(trên 64 OS chút sử dụng 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 chuỗi đầu ra trực tiếp vào videobuffer mà không cần sử dụng phần mềm interupts:

;----------------------- 
; 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: DX = con trỏ đến chuỗi kết thúc bằng "$"

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

Hãy thử giải thích một số mã của bạn. – Marcs