Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 19 kết quả

Đề tài: Bắt đầu với MASM!

  1. #1
    Ngày gia nhập
    10 2006
    Nơi ở
    Hà Nội
    Bài viết
    146

    Mặc định Bắt đầu với MASM!

    Trong bài này mình sẽ hướng dẫn các bạn cách cài đặt và thiết lập các chương trình ASM đơn giản.
    Trước hết bạn phải tải file về cài đặt: mời vào http://www.masm32.com
    để tải bản mới nhất về cài hoặc down trực tiếp từ diễn đàn:

    Theo mình bạn nên tải về chương trình sau: emulator-demo402
    tại trang http://www.emu8086.com
    Nó là chương trình mô phỏng bộ VXL 8086/8088 của Intel, rất tiện dùng cho chúng ta chạy chương trình .asm và quan sát các thay đổi trong thanh ghi (register).

    Sau khi cài đặt thành công, bạn có thể soạn chương trình trong notepad rồi open cho chạy cũng được.
    Trước hết bạn chạy emu8086.exe
    sau đó vào file/opem chọn file vừa viết code rồi chọn emulate, một cửa sổ hiện ra sau đó chon run, thế là chương trình của mình chạy tốt rồi.
    để quan sát sự hoạt động của các thanh ghi bạn chọn chức năng chạy từng bước.

  2. #2
    Ngày gia nhập
    10 2006
    Nơi ở
    Hà Nội
    Bài viết
    146

    đây là chương trình mới đầu tiên. In ra lời chào trên màn hình.
    Code

    ;chuong trinh in loi thong bao
    .Model Small
    .Stack 100H
    .Data
    CRLF DB 13,10,'$'
    Thongbao DB 'Cac ban dang chay ung dung cua Nguyen Thanh Son$'
    .Code
    Main proc
    ;khoi dau thanh ghi DS
    mov AX,@Data
    mov DS,AX
    ;ve dau dong moi dung ham 9 cua int 21H
    mov ah,9
    lea dx,CRLF
    int 21H
    ;hien thi loi chao dung ham 9 cua int 21H
    mov ah,9
    lea DX,Thongbao
    int 21H
    ;ve dau dong moi dung ham 9 cua int 21H
    mov ah,9
    lea dx,CRLF
    int 21H
    ;tro ve dos dung ham 4CH cua int 21H
    mov ah,4CH
    int 21H
    Main endp
    End Main
    ----------------------------------------
    bạn có thể thay thông báo bởi 1 lời khác.

  3. #3
    Ngày gia nhập
    10 2006
    Nơi ở
    Hà Nội
    Bài viết
    146

    Một chương trình khác tương tự, nhưng viết cách khác.
    Code:
    name "hi-world"
    
    ; this example prints out  "hello world!"
    ; by writing directly to video memory.
    ; in vga memory: first byte is ascii character, byte that follows is character attribute.
    ; if you change the second byte, you can change the color of
    ; the character even after it is printed.
    ; character attribute is 8 bit value,
    ; high 4 bits set background color and low 4 bits set foreground color.
    
    ; hex    bin        color
    ; 
    ; 0      0000      black
    ; 1      0001      blue
    ; 2      0010      green
    ; 3      0011      cyan
    ; 4      0100      red
    ; 5      0101      magenta
    ; 6      0110      brown
    ; 7      0111      light gray
    ; 8      1000      dark gray
    ; 9      1001      light blue
    ; a      1010      light green
    ; b      1011      light cyan
    ; c      1100      light red
    ; d      1101      light magenta
    ; e      1110      yellow
    ; f      1111      white
     
    
    
    org 100h
    
    ; set video mode    
    mov ax, 3     ; text mode 80x25, 16 colors, 8 pages (ah=0, al=3)
    int 10h       ; do it!
    
    ; cancel blinking and enable all 16 colors:
    mov ax, 1003h
    mov bx, 0
    int 10h
    
    
    ; set segment register:
    mov     ax, 0b800h
    mov     ds, ax
    
    ; print "hello world"
    ; first byte is ascii code, second byte is color code.
    
    mov [02h], 'H'
    
    mov [04h], 'e'
    
    mov [06h], 'l'
    
    mov [08h], 'l'
    
    mov [0ah], 'o'
    
    mov [0ch], ','
    
    mov [0eh], 'W'
     
    mov [10h], 'o'
    
    mov [12h], 'r'
    
    mov [14h], 'l'
    
    mov [16h], 'd'
    
    mov [18h], '!'
    
    
    
    
    ; color all characters:
    mov cx, 12  ; number of characters.
    mov di, 03h ; start from byte after 'h'
    
    c:  mov [di], 11101100b   ; light red(1100) on yellow(1110)
        add di, 2 ; skip over next ascii code in vga memory.
        loop c
    
    ; wait for any key press:
    mov ah, 0
    int 16h
    
    ret

  4. #4
    Ngày gia nhập
    10 2006
    Nơi ở
    Hà Nội
    Bài viết
    146

    Lightbulb Tiếp

    Chương trình quy đổi số nhị phân ra số thập phân:
    Code:
    name "calc-sum"
    
    org 100h ; directive make tiny com file.
    
    ; calculate the sum of elements in vector,
    ; store result in m and print it in binary code.
    
    ; number of elements:
    mov cx, 5
    
    ; al will store the sum:
    mov al, 0
    
    ; bx is an index:
    mov bx, 0
    
    ; sum elements:
    next: add al, vector[bx]
    
    ; next byte:
    inc bx
    
    ; loop until cx=0:
    loop next
    
    
    ; store result in m:  
    mov m, al
    
    
    ; print result in binary:
    mov bl, m
    mov cx, 8
    print: mov ah, 2   ; print function.
           mov dl, '0'
           test bl, 10000000b  ; test first bit.
           jz zero
           mov dl, '1'
    zero:  int 21h
           shl bl, 1
    loop print
    ; print binary suffix:
    mov dl, 'b'
    int 21h
    
    
    
    mov dl, 0ah ; new line.
    int 21h
    mov dl, 0dh ; carrige return.
    int 21h
    
    
    ; print result in decimal:
    mov al, m
    call print_al
    
    
    
    
    ; wait for any key press:
    mov ah, 0
    int 16h
    
    
    
    ret
    
    ; variables:
    vector db 5, 4, 5, 2, 1
    m db 0
    
    
    print_al proc
    cmp al, 0
    jne print_al_r
        push ax
        mov al, '0'
        mov ah, 0eh
        int 10h
        pop ax
        ret 
    print_al_r:    
        pusha
        mov ah, 0
        cmp ax, 0
        je pn_done
        mov dl, 10
        div dl    
        call print_al_r
        mov al, ah
        add al, 30h
        mov ah, 0eh
        int 10h    
        jmp pn_done
    pn_done:
        popa  
        ret  
    endp

  5. #5
    Ngày gia nhập
    10 2006
    Nơi ở
    Hà Nội
    Bài viết
    146

    Chương trình so sánh hai số nhập từ bàn phím:
    Code:
    name "flags"
    
    org 100h
    
    ; this sample shows how cmp instruction sets the flags.
    
    ; usually cmp instruction is followed by any relative
    ; jump instruction such as: je, ja, jl, jae...
    
    ; it is recommended to click "flags" and "analyze"
    ; for better visual expirience before stepping through this code.
    
    ; (signed/unsigned)
    ; 4 is equal to 4
    mov ah, 4
    mov al, 4
    cmp ah, al
    nop
    
    ; (signed/unsigned)
    ; 4 is above and greater then 3
    mov ah, 4
    mov al, 3
    cmp ah, al
    nop
    
    ; -5 = 251 = 0fbh
    
    ; (signed)
    ; 1 is greater then -5
    mov ah, 1
    mov al, -5
    cmp ah, al
    nop
    
    ; (unsigned)
    ; 1 is below 251
    mov ah, 1
    mov al, 251
    cmp ah, al
    nop
    
    ; (signed)
    ; -3 is less then -2
    mov ah, -3
    mov al, -2
    cmp ah, al
    nop
    
    ; (signed)
    ; -2 is greater then -3
    mov ah, -2
    mov al, -3
    cmp ah, al
    nop
    
    ; (unsigned)
    ; 255 is above 1
    mov ah, 255
    mov al, 1
    cmp ah, al
    nop
    
    ; now a little game:
    game:  mov dx, offset msg1
           mov ah, 9
           int 21h
    
           ; read character in al:
           mov ah, 1 
           int 21h
    
           cmp al, '0'
           jb stop
    
           cmp al, '9'
           ja stop
    
           cmp al, '5'
           jb below
           ja above
           mov dx, offset equal_5
           jmp print
    below: mov dx, offset below_5     
           jmp print
    above: mov dx, offset above_5
    print: mov ah, 9
           int 21h
           jmp game  ; loop.
    
    
    stop: ret  ; stop
    
    
    msg1 db "enter a number or any other character to exit:  $"
    equal_5 db " is five! (equal)", 0Dh,0Ah, "$"
    below_5 db " is below five!" , 0Dh,0Ah, "$"
    above_5 db " is above five!" , 0Dh,0Ah, "$"

  6. #6
    Ngày gia nhập
    10 2006
    Nơi ở
    Hà Nội
    Bài viết
    146

    Mặc định Bắt đầu với MASM!

    Chương trình cho phép nhập hai số từ 0->9, và in ra hiệu của chúng:
    Code:
    ;nhap vao hai so nguyen nam trong khoang 0-9,va tinh hieu cua chung
    .model small 
    .stack 100
    .data
        x       db  ?
        y       db  ?
        str1    db  "x=","$"
        str2    db  "y=","$"
        LRCF    db  13,10,"$" 
        str3    db  "Hieu hai so la:$"
    .code
    Main Proc
            ;khoi tao thanh ghi ds
        mov ax,@data
        mov ds,ax
            ;hien thi x= 
        mov ah,9
        lea dx,str1
        int 21h
        call nhap
        mov x,al 
            ;sau khi nhap x= thi xuong dong
        mov ah,9 
        lea dx,LRCF
        int 21H
                   
            ;hien thi y=
        mov ah,9
        lea dx,str2
        int 21h
        call nhap
        mov y,al  
            ;sau khi nhap y= thi xuong dong
        mov ah,9 
        lea dx,LRCF
        int 21H 
            ;thuc hien phep tinh so hoc 
        mov al,y
        cmp x,al
        ja  lonhon
        sub al,x
        mov dl,al
        call inra
    
        jmp kethuc
    Main endp
    lonhon:
        sub x,al
        mov dl,x
        call inra
    kethuc:
        mov ah,4ch
        int 21h
    inra proc 
        add dl,30h
        mov x,dl
        mov ah,9
        lea dx,str3
        int 21h
        mov dl,x
        mov ah,2
        int 21h
        ret
    inra endp          
    nhap proc
        mov ah,1
    nhaplai:
        int 21h
        cmp al,30h
        jb  nhaplai                         
        cmp al,39h
        ja  nhaplai
        sub al,30h
        ret
    nhap endp 
         
    end Main

  7. #7
    Ngày gia nhập
    07 2006
    Nơi ở
    Hanoi, Vietnam
    Bài viết
    2,750

    Trong bộ cài masm32 có sẵn một Editor cho việc viết code rất tiện đó, sao không dùng mà lại đi dùng cái Notepad? Cái đó chính là qeditor đó, nếu dự án lớn mà viết code vào Notepad thì khi mở file nguồn ra mất cả buổi. he he

    Cảm ơn nhiều lắm, Tuyệt đó, nhưng chương trình bạn viết đều là 16 bit đó chứ, đâu có phải là 32 bit?
    Email: admin[@]congdongcviet.com | CC to: info[@]congdongcviet.com
    Phone: 0972 89 7667 (Office: 04 6329 2380)
    Yahoo & Skype: dreaminess_world (Vui lòng chỉ rõ mục đích ngay khi liên hệ, cảm ơn!)

    Một người nào đó coi thường ý thức kỷ luật cũng có nghĩa là người đó đã coi thường tương lai số phận của chính bản thân người đó. Những người coi thường ý thức kỷ luật sẽ không bao giờ có được sự thành công trong sự nghiệp!

  8. #8
    Ngày gia nhập
    10 2006
    Nơi ở
    Hà Nội
    Bài viết
    146

    ý của mình là đang dùng cái emu8086, chứ nếu dùng MAS32 thì đâu dùng notepad làm gì. Vả lại các chương trình mình viết là để cho emu8086, thì nó chỉ 16 bit thôi.

  9. #9
    Ngày gia nhập
    10 2006
    Nơi ở
    Hà Nội
    Bài viết
    146

    Chương trình nhập n số từ bàn phím. in ra tồng của n số đó.
    -nhập số n -> lưu và CX
    -loop nhãn Nhâp tới khi CX=0
    -Cứ mỗi lần nhập thì tổng = tổng + al ,
    -Lưu vào DL
    -in ra tổng
    -trở về Dos.

  10. #10
    Ngày gia nhập
    07 2006
    Nơi ở
    Hanoi, Vietnam
    Bài viết
    2,750

    Cho Dreaminess hỏi, muốn viết một lệnh để thu gọn việc nhập và in một chuỗi thì viết làm sao nhỉ? PoPoPo có thể chỉ giùm không? Cảm ơn nhiều
    Email: admin[@]congdongcviet.com | CC to: info[@]congdongcviet.com
    Phone: 0972 89 7667 (Office: 04 6329 2380)
    Yahoo & Skype: dreaminess_world (Vui lòng chỉ rõ mục đích ngay khi liên hệ, cảm ơn!)

    Một người nào đó coi thường ý thức kỷ luật cũng có nghĩa là người đó đã coi thường tương lai số phận của chính bản thân người đó. Những người coi thường ý thức kỷ luật sẽ không bao giờ có được sự thành công trong sự nghiệp!

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn