Trả lời
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
.
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
Gọi hàm WinAPI (nếu bạn đang phát triển ứng dụng thắng)
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
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.
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.
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
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
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
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 ;
Rất cảm ơn Kay. –
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. –
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 –
; 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
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
đị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. –
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..
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
Hãy thử giải thích một số mã của bạn. – Marcs
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
Ông đã làm, nó có một thẻ "win16". –
win16 thực sự? Vẫn đang sử dụng Windows 3.1 là chúng ta? –