Từ 1 tới 4 trên tổng số 4 kết quả

Đề tài: Lập trình ASM và C

  1. #1
    Ngày gia nhập
    06 2007
    Nơi ở
    một nơi xa xăm...
    Bài viết
    127

    Mặc định Lập trình ASM và C

    - Mình thấy trên diễn đàn có nhiều bạn quan tâm về vấn đề sử dụng ASM trong C.Nên mình viết một bài hy vọng các bạn hình dung được….
    - Để có thể sử dụng hàm ASM trong C chúng ta có 2 cách.
    + Cách 1: là viết trực tiếp code ASM vào tệp C/C++
    + Cách 2 : Viết riêng trên tệp ASM và gọi hàm trong C/C++
    Mình sẽ lần lượt trình bày từng cách và đưa ra ví dụ minh hoạ
    • Cách 1 :
    Chúng ta sẽ viết code dưới mẫu sau
    Code:
    #include….
    void main()
    {
    	//lệnh C/C++
    	asm {  
    		;lệnh ASM
    	      }
    //lệnh C/C++
    }
    Mình ví dụ cụ thể như sau : Mình viết chương trình tính tổng 2 số nguyên có tên là Tong2so.CPP
    Code:
    #include <iostream.h>
    #include<conio.h>
    void main()
    {
    	clrscr();
    	int so1,so2;
    	cout<<”So 1: “;cin>>so1;
    	cout<<”\nSo 2;cin>>so2;
    	asm {
    		mov ax,so1	//chuyển số 1 vào thanh ghi ax
    		mov bx,so2	//Chuyển số 2 vào thanh ghi bx
    		add ax,bx	//cộng ax và bx kết quả để vào ax
    		mov so1, ax	//chuyển kết quả vào số 1
    	      }	
    	cout<<”\nTong là : “<<so1;
    getch();
    }
    các bạn dịch bình thường bằng chương trình biên dịch.(Mình dùng TC 3.0)
    -- Cách 2 mai mình trình bày nốt.Bi giờ phải đi ngủ mai đi học sáng ^^

  2. #2
    Ngày gia nhập
    06 2007
    Nơi ở
    một nơi xa xăm...
    Bài viết
    127

    Trích dẫn Nguyên bản được gửi bởi thanhlv Xem bài viết
    nhưng mà ai lại đi dùng code asm để tính tổng này cho rườm rà chứ,lại còn mất công gọi asm,trong khi code C ngắn hơn
    có trình bày thì cậu trình bày cách gọi tệp asm trong C thôi chứ đừng làm code tính tổng nữa nhé
    Vấn đề không phải là hàm tính tổng bạn à.Vấn đề là mình hy vọng các bạn có thể hình dung được việc chèn code ASM vào C/C++ 1 cách trực tiếp (inline).Chứ đâu phải ASM chỉ có thể làm được việc tính tổng thôi đâu.Mình lấy ví dụ đó cho nó đơn giản và dễ diễn đạt thôi.
    *Còn đây là cách thứ 2: Viết riêng 2 tệp ASM và C.Mình sẽ vẫn lấy ví dụ là hàm tính tổng cho nó dễ hiểu.
    Đầu tiên là các bạn viết một tệp có tên tinhtong1.asm như sau
    Code:
    .model small
    .code
    Alv:
      public @tong2so$qii
      @tong2so$qii proc 
    	push bp		;cat gia tri bp
    	mov bp,sp	;bp->dinh stack
    	mov ax,[bp+6]	;chuyen y vao ax
    	mov bx,[bp+8]	;chuyen x vao bx
    	add ax,bx		;ax=ax+bx
    	pop bp		;phuc hoi bp
    	ret
      @tong2so$qii endp
    End Alv
    sau đó các bạn viết 1 tệp tinhtong.cpp như sau:
    Code:
    #include<conio.h>
    #include<iostream.h>
    extern int tong2so(int,int);
    int main()
    {
    int x,y;
    cout<<"Nhap X : ";cin>>y;
    cout<<"\nNhap Y :";cin>>x;
    cout<<"\nX+Y = "<<tong2so(y,x);
    getch();
    }
    các bạn tạo 1 project và add 2 tệp đó vào và run --> Nhìn kết quả
    Có chỗ nào chưa hiểu thì các bạn cứ hỏi mình sẽ cố gắng giải thích.Chú ý :Nếu muốn hiểu rõ bản chất vẫn đề thì các bạn nên hiểu cơ chế gọi chương trình con của máy tính...
    * Chúc các bạn thành công
    Đã được chỉnh sửa lần cuối bởi Alviss : 11-10-2007 lúc 12:36 PM.

  3. #3
    Ngày gia nhập
    06 2007
    Nơi ở
    Hà nội
    Bài viết
    77

    nhờ bạn giải thích hộ cái đoạn này với(đoạn asm.exe)
    Code:
    .model small
    .stack 100
    .data
      Tb1 db 'nhập vào xâu kí tự,......:$'
      Tb2 db 'các kí tự ... gồm :$'
      Tb3 db 'ko có ....$'
      Xau Db 101 dup(0)
      CRLF Db 13,10,'$'
    .code
    main proc
    mov AX,@data
    mov DS,AX
    lea DX,tb1
    mov AH,09h
    int 21h
    lea DI,xau
    xor BX,BX
    mov AH,01h
    lap:
    int 21h
    cmp AL,0Dh
    je khongnhapnua
    cmp AL,'z'
    jg ngoaikhoang
    cmp AL,32
    je trongkhoang
    cmp AL,'A'
    jl ngoaikhoang
    cmp AL,'a'
    jge trongkhoang
    cpm AL,'Z'
    jg ngoaikhoang
    trongkhoang:
    mov [DI],AL
    inc DI
    inc BL
    ngoaikhoang:
    jmp lap
    khongnhapnua:
    lea DX,CRLF
    mov AH,09h
    int 21h
    cmp BL,0
    jne duara
    lea DX,tb3
    int 21h
    jmp thoat
    duara:
    lea DX,tb2
    mov AH,09h
    int 21h
    lea SI,Xau
    mov AH,02h
    lapduara:
    mov DL,[SI]
    int 21h
    inc SI
    dec BL
    jnz lapduara
    thoat:
    mov AH,04h
    int 21h
    main endp
    end main
    tôi ko rõ đoạn CT này làm nhiệm vụ gì mặc dù thèng bạn tôi nó bảo rất dễ,bạn có thể giải thích từng dòng lệnh giúp tôi và cho biết nó làm công việc gì được ko,mấy cái TB nó lại ko cho tôi biết là gì
    Sống ở trên đời cần có một TẤM LÒNG để lúc đói còn có chỗ mà nhét THỨC ĂN

  4. #4
    Ngày gia nhập
    06 2007
    Nơi ở
    một nơi xa xăm...
    Bài viết
    127

    Đây là diễn đàn về C nên chúng ta không nên đi sâu vào ASM.Tuy nhiên mình sẽ giúp bạn chú thích vào các câu lệnh.Bài trên có 1 ,2 lỗi nhỏ nhưng không đáng kể (chỉ là lỗi cú pháp)
    PHP Code:
    .model small
    .stack 100
    .data   ;khai bao bien
      Tb1 db 
    'nhap vao xau ky tu,......:$'
      
    Tb2 db 'cac ky tu.... gom :$'
      
    Tb3 db 'ko có ....$'
      
    Xau Db 101 dup(0)
      
    CRLF Db 13,10,'$'
    .code
    main proc
        mov AX
    ,@data ;đưa phần địa chỉ segment dữ liệu vào
        mov DS
    ,AX      ;thanh ghi DS
        
    ;//hien xau tb 1 ra man hinh
        
    lea DX,tb1    ;dua dia chi offset cua bien tb1 vao DX
        mov AH
    ,09h    ;chuc nang 9 cua ngat 21h (hien 1 xau ra man hinh)
        
    int 21h
        
    ;//================
        
    lea DI,xau        ;DI chua offset cua bien xau
        
    xor BX,BX    ;BX=0
        mov AH
    ,01h    ;
    lap:            ;doan nay la nhap 1 xau ky tu ket thuc bang Enter
        int 21h        
    ;Nhap 1 ky tu tu ban phim va ma ascii cua no se nam trong al
        cmp AL
    ,0Dh    ;0Dh=13 (Enter) ,so sanh xem co phai phim vua bam la Enter
        je khongnhapnua    
    ;neu dung thi` nhay den nhan khongnhapnua , sai thi thuc hien tiep dong lenh duoi
        cmp AL,'z'    ;so sanh phim vua bam va
    'z'
        
    jg ngoaikhoang    ;nhay den nhankhoangtrang khi maascii cua phim bam ascii cua 'z'
        
    cmp AL,32    ;so sanh al va phim space
        je trongkhoang    
    ;neu dung nhay den nhan trongkhoang
        cmp AL
    ,'A'    ;so sanh al va A
        jl ngoaikhoang    
    ;neu nho hon --> nhay den nhan ngoaikhoang
        cmp AL
    ,'a'    ;so sanh al va a
        jge trongkhoang    
    ;neu al>= a nhay den nhan trongkhoang
        cmp AL
    ,'Z'    ;so sanh al va 'z'
        
    jg ngoaikhoang    ;neu lon hon nhay den ngoaikhoang
    trongkhoang
    :
        
    mov [DI],AL    ;dua gia tri cua phim vua nhap vao bien xau
        inc DI        
    ;tang DI len 1
        inc BL        
    ;tang BL len 1(tuc la da co ky tu duoc nhap)
    ngoaikhoang:
        
    jmp lap        ;neu phim bam la ngoai khoang  hoac chua la phim enter thi nhap lai(tiep)
    khongnhapnua:        ;khi phim bam la Enter(0Dh)
        
    lea DX,CRLF    ;
        
    mov AH,09h    ;xuong dong
    int 21h
        cmp BL
    ,0        ;so sanh bl va 0
        jne duara        
    ;neu khong bang nhau
        lea DX
    ,tb3    ;hien xau tb3 ra man hinh (ko co....)
        
    int 21h        ;neu bl=tuc la ko co ky tu nao duoc nhap)
        
    jmp thoat        ;nhay den nhan thoat
    duara
    :
        
    lea DX,tb2    ;DX chua offset cua tb2
        mov AH
    ,09h    ;hien xau tb2 (cac ky tu gom...)
        
    int 21h        ;
        
    lea SI,Xau        ;si chua offset bien xau
        mov AH
    ,02h    ;chuc nang hien 1 ky tu ra man hinh cua ngat 21
    lapduara
    :
        
    mov DL,[SI]    ;DL chua ma ASCII cua ky tu can hien
        int 21h        
    ;hien ky tu do len bang ngat 21
        inc SI        
    ;tang si len 1
        dec BL        
    ;giam bl di 1
        jnz lapduara    
    ;neu bl van con != 0 thi tiep thuc dua ra
    thoat
    :
        
    mov AH,04ch    ;chuc nag tro ve dos
        int 21h        
    ;ngat 21h
        main endp
        end main 
    Như vậy bạn biết đoạn code trên làm j` rồi chứ.Nó làm 1 việc rất đơn giản là cho bạn nhập vào 1 xâu rồi hiện nó ra màn hình.Hết!
    Đã được chỉnh sửa lần cuối bởi Alviss : 11-10-2007 lúc 02:10 PM.

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