SlideShare a Scribd company logo
Inline ASM gọi hàm!
Sau khi xây dựng một hàm bằng ngôn ngữ C/C++ chuẩn, chúng ta có thể dùng
hàm này trong inline ASM của C/C++; sau đây là chương trình tính tổng 2 số 10
và 16:
PHP Code:
#include <iostream>
#include <conio.h>
using namespace std;

int Tong(int a, int b)
{
    return (a+b);
}

int main()
{
    int retValue;
    _asm
    {
         push 10
         push 16
         call Tong    //Gọi hàm đây
         add esp, 8
         mov retValue, eax
    }

     cout << "Tong cua 10+16 = " << retValue;
     getch();
     return 0;
}
Tại sao chúng ta phải inline ASM trong C/C++??? Sau một thời gian Peter tìm
hiểu về ASM thì Peter bắt đầu muốn dùng ASM trong ngôn ngữ C/C++ _ Đơn giản
vì bắt gặp một câu trả lời "bâng quơ" không giải thích là "mã ASM chạy nhanh hơn
mã C/C++"; Peter hiểu là mã C/C++ sẽ được dịch thành mã máy, 1 câu lệnh mã
C/C++ có thể sinh vài lệnh mã máy; nên Peter nghĩ rằng đây là lời giải đáp thiết
thực cho câu trả lời bâng quơ trên.....
Chúc các bạn học tốt!
Đã được chỉnh sửa lần cuối bởi peterdrew : 29-06-2010 lúc 06:39 PM.

#2
 25-05-2010, 10:17 PM
                                                         Ngày gia nhập: 04 2009
                                                         Nơi ở: một căn hộ nhỏ trên trái đất
                icttrack                                 Bài viết: 389
                XCoworker Member




@peterdrew: Thủ thuật thì anh cũng phải giải thích chứ.
Chẳng hạn tại sao phải push 10, 16
Tại sao phải add esp, 8, nếu ko làm thì có chuyện gì xảy ra.
__________________
 Being top programmers always requires advanced knowledge of C/C++
                                  and assembly

             http://i138.photobucket.com/albums/q...1989/mysig.png
#3
 25-05-2010, 10:44 PM
                                                          Ngày gia nhập: 05 2010
                                                          Nơi ở: Cách Mạng Tháng 8
                 Nature Master                            Bài viết: 210
                 Thành viên nhiệt tình




Hàm trong ASM sẽ lấy các đối số trong Stack nên phải push vào.

Về lệnh add esp, 8 thì phải nói tới nguyên tắc dùng Stack của 1 hàm: trước khi
thực hiên hàm , con trỏ Stack ờ đâu thì sau khi hàm thực hiện xong phải trả nó
về đúng vị trí ấy.
Con trỏ esp ở địa chỉ cao, khi push vào thì nó giảm xuống. Ở đây ta push 2 số int
nên esp giảm 8 byte. Thay vì pop 2 lần mà chẳng cần sử dụng giá trị đó thì ta chỉ
việc cộng esp với 8 để quay về vị trí cũ là được.
__________________
Nothing last forever !!
#4
 25-05-2010, 10:58 PM
                                                            Ngày gia nhập: 01 2010
                                                            Nơi ở: до свидания!
             Banned                                         Bài viết: 1,842




Trích dẫn:
Nguyên bản được gửi bởi Nature Master

Hàm trong ASM sẽ lấy các đối số trong Stack nên phải push vào.

Về lệnh add esp, 8 thì phải nói tới nguyên tắc dùng Stack của 1 hàm: trước khi
thực hiên hàm , con trỏ Stack ờ đâu thì sau khi hàm thực hiện xong phải trả nó
về đúng vị trí ấy.
Con trỏ esp ở địa chỉ cao, khi push vào thì nó giảm xuống. Ở đây ta push 2 số int
nên esp giảm 8 byte. Thay vì pop 2 lần mà chẳng cần sử dụng giá trị đó thì ta chỉ
việc cộng esp với 8 để quay về vị trí cũ là được.
Hoàn toàn chuẩn! Lời giải đáp này đã giải quyết được các yêu cầu của Ictrack rồi;
tuy nhiên trước khi đọc bài này thì các bạn cũng nên tìm hiểu cách làm việc của
lệnh Add; hai thanh ghi esp (tại sao không dùng cái khác?!!! khi hiểu được tác
dụng của thanh ghi này rồi thì việc thao tác phía sau mới dễ dàng được) và eax.
Hy vọng các bạn tiếp tục trao đổi nếu cần thiết.
p/s: Thật ra thì cái này Ic đã hiểu rồi, chỉ muốn Peter giải thích cho mọi người
hiểu thôi! Tuy nhiên bạn Nature Master đã rõ ràng rồi, Peter không ý kiến thêm.
#5
 25-05-2010, 11:12 PM
                                                          Ngày gia nhập: 05 2010
                                                          Nơi ở: Cách Mạng Tháng 8
                 Nature Master                            Bài viết: 210
                 Thành viên nhiệt tình
Trích dẫn:
Nguyên bản được gửi bởi peterdrew
p/s: Thật ra thì cái này Ic đã hiểu rồi, chỉ muốn Peter giải thích cho mọi người
hiểu thôi! Tuy nhiên bạn Nature Master đã rõ ràng rồi, Peter không ý kiến thêm.

Thật ra thì chưa có "ma" nào hỏi cả, anh Peter ạ
__________________
Nothing last forever !!
#6
 26-05-2010, 04:56 PM
                                                   Ngày gia nhập: 06 2007
                                                   Nơi ở: C:WINDOWSsystem32dllcache
                                                   Bài viết: 2,679
                 langman
                 Thành viên mới




@anh pt và Nature Master
langman góp ý thế này :
còn thiếu cân bằng si và sp nữa
PHP Code:
mov esi,esp
        push 10        // b sẽ nhận giá trị này
        push 16        // a sẽ nhận giá trị này
        call Tong    //Gọi hàm đây
        add esp, 8
        mov retValue, eax
__________________
^_,^

Mình là 1 con gà trong công nghệ.




Đã được chỉnh sửa lần cuối bởi langman : 26-05-2010 lúc 05:08 PM.

#7
 26-05-2010, 05:17 PM
                                                         Ngày gia nhập: 04 2009
                                                         Nơi ở: một căn hộ nhỏ trên trái đất
                icttrack                                 Bài viết: 389
                XCoworker Member




@langman: esp đã được hồi phục sau khi gọi add esp, 8.
Cất esp vào esi làm gì hả langman
__________________
 Being top programmers always requires advanced knowledge of C/C++
                                and assembly

             http://i138.photobucket.com/albums/q...1989/mysig.png
#8
 26-05-2010, 06:10 PM
                                               Ngày gia nhập: 06 2007
                                               Nơi ở: C:WINDOWSsystem32dllcache
                                               Bài viết: 2,679
                 langman
                 Thành viên mới




Trích dẫn:
Nguyên bản được gửi bởi icttrack
@langman: esp đã được hồi phục sau khi gọi add esp, 8.
Cất esp vào esi làm gì hả langman
ừa ha
giờ mới để ý , nhưng như thế hình như ko được hay lắm
+ với 1 class thì phải tính toán độ lệch để nhảy về, mà như đã biết thì class tự
làm tròn dung lượng lượng chia hết 4, như thế có thể tính nhầm,
+trong quá trình call hàm thì lại phải lo lắng đến việc tạo sao chép
+trong hàm có đệ quy hoặc *** mà có dùng dến đệ quy thì tính toán độ lệch
kiểu gì



phương án a pt đưa ra để hiểu thêm, rất hay, mà ko áp dụng vào thực tế , vì
+ bỏ qua sự biên dịch thông minh của trình biên dịch
+ kết quả cuối cùng giữa bt và của a cũng sinh mã gần giống nhau thôi mà, cái
tiết kiệm được chỉ là chi phí về thời gian cho việc biên dịch
__________________
^_,^

Mình là 1 con gà trong công nghệ.




#9
 26-05-2010, 07:16 PM
Ngày gia nhập: 04 2009
                                                    Nơi ở: một căn hộ nhỏ trên trái đất
                icttrack                            Bài viết: 389
                XCoworker Member




Trích dẫn:
+ với 1 class thì phải tính toán độ lệch để nhảy về, mà như đã biết thì class tự
làm tròn dung lượng lượng chia hết 4, như thế có thể tính nhầm,
+trong quá trình call hàm thì lại phải lo lắng đến việc tạo sao chép
+trong hàm có đệ quy hoặc *** mà có dùng dến đệ quy thì tính toán độ lệch
kiểu gì
Mình thật sự không hiểu hết ý của langman. Nếu thủ tục trong ASM (hàm trong
C/C++) được thiết lập stack frame (khung ngăn xếp) cẩn thận thì khi gọi đệ quy
chẳng khỏi lo CPU tính toán sai vì mỗi lần gọi thủ tục thì thủ tục đã có một stack
frame của riêng nó.
Dùng đệ quy hay không đệ quy thì bản chất CPU sẽ nhảy đến địa chỉ chứa mã
lệnh của thủ tục, nếu bị gọi đệ quy thì thực ra ta lại quay lại địa chỉ của thủ tục
đó thôi khi mã lệnh của thủ tục đó còn chưa được chạy hết, về vấn đề này thì
việc gọi thủ tục giống lệnh jump chỉ có điều nó sẽ cất nội dung của thanh ghi EIP
chứa địa chỉ của lệnh tiếp theo sau lệnh gọi thủ tục vào trong ngăn xếp.

Trích dẫn:
phương án a pt đưa ra để hiểu thêm, rất hay, mà ko áp dụng vào thực tế , vì
+ bỏ qua sự biên dịch thông minh của trình biên dịch
+ kết quả cuối cùng giữa bt và của a cũng sinh mã gần giống nhau thôi mà, cái
tiết kiệm được chỉ là chi phí về thời gian cho việc biên dịch
Phương án của anh peter là cần thiết nếu ta muốn gọi hàm C, C++ (với chú ý là
hàm C++ ko được phép nạp chồng) ngay trong mã assembly. Điều này là hoàn
toàn có thể xảy ra vì ta muốn tối ưu một đoạn mã nào đó bằng việc viết asm,
yêu cầu của đoạn mã đó là có sử dụng hàm viết bằng ngôn ngữ C hoặc C++ thì
không có cách nào khác ngoài cách gọi kiểu như trên đối với thư viện trong C)
Cần biết rằng cách gọi như anh peter lấy ví dụ là cách mà trong chương trình
chúng ta gọi các hàm như printf, scanf trong thư viện C, vì hàm trong thư viện C
sử dụng quy ước gọi __cdecl.
__________________
 Being top programmers always requires advanced knowledge of C/C++
                                   and assembly

             http://i138.photobucket.com/albums/q...1989/mysig.png
#10
 26-05-2010, 11:10 PM
                                               Ngày gia nhập: 06 2007
                                               Nơi ở: C:WINDOWSsystem32dllcache
                                               Bài viết: 2,679
                 langman
                 Thành viên mới




Trích dẫn:
Nguyên bản được gửi bởi icttrack
Mình thật sự không hiểu hết ý của langman. Nếu thủ tục trong ASM (hàm trong
C/C++) được thiết lập stack frame (khung ngăn xếp) cẩn thận thì khi gọi đệ quy
chẳng khỏi lo CPU tính toán sai vì mỗi lần gọi thủ tục thì thủ tục đã có một stack
frame của riêng nó.
Dùng đệ quy hay không đệ quy thì bản chất CPU sẽ nhảy đến địa chỉ chứa mã
lệnh của thủ tục, nếu bị gọi đệ quy thì thực ra ta lại quay lại địa chỉ của thủ tục
đó thôi khi mã lệnh của thủ tục đó còn chưa được chạy hết, về vấn đề này thì
việc gọi thủ tục giống lệnh jump chỉ có điều nó sẽ cất nội dung của thanh ghi EIP
chứa địa chỉ của lệnh tiếp theo sau lệnh gọi thủ tục vào trong ngăn xếp.


Phương án của anh peter là cần thiết nếu ta muốn gọi hàm C, C++ (với chú ý là
hàm C++ ko được phép nạp chồng) ngay trong mã assembly. Điều này là hoàn
toàn có thể xảy ra vì ta muốn tối ưu một đoạn mã nào đó bằng việc viết asm,
yêu cầu của đoạn mã đó là có sử dụng hàm viết bằng ngôn ngữ C hoặc C++ thì
không có cách nào khác ngoài cách gọi kiểu như trên đối với thư viện trong C)
Cần biết rằng cách gọi như anh peter lấy ví dụ là cách mà trong chương trình
chúng ta gọi các hàm như printf, scanf trong thư viện C, vì hàm trong thư viện C
sử dụng quy ước gọi __cdecl.
cậu ko hiểu ý tớ rồi,
trong bài đó ý tớ nói là
bài của a pt để tìm hiểu sâu về bản chất của vấn đề, rất hay và nên biết
nhưng mà để áp dụng vào thực tế tức là lúc code đổi lời gọi hàm bằng đoạn mã
asm là ko khả thi             vì những lý do tớ đưa ra đó, việc đặt lời gọi hàm vô sẽ
khả thi hơn.
__________________
^_,^

Mình là 1 con gà trong công nghệ.




Inline ASM tính tổng hai số
   peterdrew on Fri Jul 09, 2010 8:38 pm

 Peter mở ra vấn đề này cũng là vì giới thiệu với các bạn một vài code Inline ASM trong
 C/C++; với bài này Peter cho các bạn thấy một ví dụ đơn giản như tính tổng của 2 số
 thực (float) chẳng hạn:


 CODE:
         #include <conio.h>
         #include <stdio.h>
         float a,b,tong;
         int main()
         {
             printf("Nhap vao so thu nhat, a= ");
             scanf("%f",&a);
             printf("Nhap vao so thu 2, b= ");
             scanf("%f",&b);
             _asm
{
                 fld a
                     fld b
                     fadd ST,ST(1)
                     fstp tong
                     fwait
            }
            printf("Tong cua hai so %f va %f la %f",a,b,tong);
            getch();
            return 0;
        }


Hay cũng có thể làm như thế này (với số nguyên (int) có thêm các thao tác Trừ, Nhân
và Chia):


CODE:
        #include <stdio.h>
        #include <conio.h>

        int Cong(int x, int y)
        {
            __asm
            {
                mov eax,x;
                mov ebx,y;
                add eax,ebx;
                mov x,eax;
            }
            return x;
        }

        int Tru(int x, int y)
        {
            __asm
            {
                mov eax,x;
                mov ebx,y;
                sub eax,ebx;
                mov x,eax;
            }
            return x;
        }


        int Chia(int x, int y)
        {
            __asm
            {
                mov eax,x;
                mov ecx,y;
                sub edx,edx;
                div ecx;
                mov x,eax;
            }
            return x;
}

        int Nhan(int x, int y)
        {
            __asm
            {
                mov eax,x;
                mov ebx,y;
                mul ebx;
                mov x,eax;
            }
            return x;
        }

        int main ()
        {
            int func;
            int x,y;
            bool finish=false;

            while (finish==false)
            {
                printf("1: Cong, 2: Tru, 3: Chia, 4: Nhann");
                printf("Lua chon:n");
                scanf("%d",&func);
                printf("Nhap so hang dau tien:n");
                scanf("%d",&x);
                printf("Nhap so hang thu hai:n");
                scanf("%d",&y);

                switch(func)
                {
                case 1:
                    printf("Tong %d va %d la: ",x,y,Cong(x,y));
                    break;
                case 2:
                    printf("Hieu %d cho %d la: ",x,y,Tru(x,y));
                    break;
                case 3:
                    printf("Thuong nguyen %d chia %d la:
        ",x,y,Chia(x,y));
                    break;
                case 4:
                    printf("Tich %d va %d la: ",x,y,Nhan(x,y));
                    break;
                }
            }
            return 0;
        }



Hoặc Inline chuẩn:


CODE:
extern    "C" __declspec(naked)       int   __stdcall      Cong(int x,
            int y)

            {
                 _asm
                 {
                      mov eax, dword ptr [esp+4]
                      add eax, dword ptr [esp+8]
                      ret 8
                 }
            }


            extern "C" __declspec(naked) int __stdcall Tru(int x, int
            y)
            {
                _asm
                {
                     mov eax, dword ptr [esp+4]
                     sub eax, dword ptr [esp+8]
                     ret 8
                }
            }


            extern "C" __declspec(naked) int __stdcall Chia(int x, int
            y)
            {
                _asm
                {
                     mov eax, dword ptr [esp+4]
                     cdq
                     mov ecx, dword ptr [esp+8]
                     div ecx
                     ret 8
                }
            }

            extern "C" __declspec(naked) int __stdcall Nhan(int x, int
            y)
            {
                _asm
                {
                     mov eax, dword ptr [esp+4]
                     mul dword ptr [esp+8]
                     ret 8
                }

            }

    Vậy các bạn thấy thế nào???



    Được sửa bởi peterdrew ngày Sun Sep 05, 2010 3:30 pm; sửa lần 1.
•
•
•
•
•
•
•
    peterdrew




      peterdrew
           Nhập môn




           Tổng số bài gửi: 18
           Points: 24
           Join date: 09/07/2010
           Age: 28
           Đến từ: Viện Vũ khí_Bộ Quốc phòng
•
•   Post n°2
    Inline ASM trong main() để gọi hàm đã được viết bằng C/C++
       peterdrew on Fri Jul 09, 2010 8:49 pm

     Sau khi xây dựng một hàm bằng ngôn ngữ C/C++ chuẩn, chúng ta có thể dùng hàm
     này trong inline ASM của C/C++; sau đây là chương trình tính tổng 2 số 10 và 16 chẳng
     hạn:


     CODE:
             #include <stdio.h>
             #include <conio.h>
             //Xây dựng hàm tính Tổng hai số nguyên
             int Tong(int a, int b)
             {
                 return (a+b);
             }

             int main()
             {
                 int retValue;
                 _asm
                 {
                      push 10
                      push 16
                      call Tong    //Gọi hàm Tổng đã được xây dựng ở trên!
                      add esp, 8
                      mov retValue, eax
                 }

                 printf("Tong cua 10+16 = %d",retValue);
                 getch();
return 0;
             }



    Được sửa bởi peterdrew ngày Fri Jul 09, 2010 8:49 pm; sửa lần 1. (Reason for editing :
    Đặt code vào thẻ!)
•
•
•
•
•
•
•
    pearlz




      pearlz
            Nhập môn




             Tổng số bài gửi: 4
             Points: 6
             Join date: 11/07/2010
•
•   Post n°3
    Re: Inline ASM tính tổng hai số
        pearlz on Sun Sep 05, 2010 1:09 am
    Hê hê có cơ hội trả đòn bác peter rồi nhé!
    cái inline asm thứ 3 có nghĩa là với int thì bác peter có lẽ hơi nhầm theo em phải là idiv và
    imul
    vì trường hợp này bác dùng là int chứ không phải unsigned int
    lí do là int thì có thể chứa cả giá trị dương (+, >0) và âm (-,<0)
    bit trên cùng nhất sẽ dùng để chứa dấu chứ không dùng để chứa giá trị
    nên khi ta dùng mul và div thì sẽ không có xét dấu và kết quả là không chính xác vì bit
    dấu bị đem ra để tính giá trị

    pm: 2 Peterdrew em là perfect bên caulacbovb.net đã từng bị ăn 1 đòn của bác, hế hế hòa
    nhé, cho em kết bạn với bác peter nhé
    yahoo của em là : hoanlevan22 khi nào bác rảnh thì buzz em tiếng nhé!
•
•
•
•
•
•
•
    peterdrew




      peterdrew
           Nhập môn




            Tổng số bài gửi: 18
            Points: 24
            Join date: 09/07/2010
            Age: 28
            Đến từ: Viện Vũ khí_Bộ Quốc phòng
•
•   Post n°4
    Re: Inline ASM tính tổng hai số
        peterdrew on Sun Sep 05, 2010 3:40 pm
    pearlz đã viết:Hê hê có cơ hội trả đòn bác peter rồi nhé!
    p
    cái inline asm thứ 3 có nghĩa là với int thì bác peter có lẽ hơi nhầm theo em phải là idiv và
    imul
    vì trường hợp này bác dùng là int chứ không phải unsigned int
    lí do là int thì có thể chứa cả giá trị dương (+, >0) và âm (-,<0)
    bit trên cùng nhất sẽ dùng để chứa dấu chứ không dùng để chứa giá trị
    nên khi ta dùng mul và div thì sẽ không có xét dấu và kết quả là không chính xác vì bit
    dấu bị đem ra để tính giá trị

    pm: 2 Peterdrew em là perfect bên caulacbovb.net đã từng bị ăn 1 đòn của bác, hế hế hòa
    nhé, cho em kết bạn với bác peter nhé
    yahoo của em là : hoanlevan22 khi nào bác rảnh thì buzz em tiếng nhé!


     Khi nhân thì chẳng cần imul; khi chia thì đúng là Peter chưa để ý cái idiv, thank cậu! Bài
     này post lâu mà bữa nay mới có cậu trả lời đó....


     CODE:
             #include <stdio.h>
             #include <conio.h>
             extern "C" __declspec(naked) int __stdcall Nhan(int x, int
             y)
             {
                 _asm
                 {
                      mov eax, dword ptr [esp+4]
                       mul dword ptr [esp+8]
                       ret 8
                 }
             }
             int main()
             {
                int i,j;
printf("i= ");
                   scanf("%d",&i);
                   printf("j= ");
                   scanf("%d",&j);
                    printf("%d * %d = %d",i,j,Nhan(i,j));
                   getch();
                   return 0;
               }



     p/s: Còn cái chuyện bên clbvb chẳng có gì cả, Peter thấy quá bình thường!.... Cậu cũng có
     cá tính phết nhỉ??? Hì hì



1.      Dung ngắt để in chuỗi trong C.. các bác giúp với !
     Đề Bài: Viết hàm cắt chuỗi họ tên thành chuỗi họ lót và chuỗi tên. Dùng ngắt để
     in ra chuỗi kết quả
     Ví dụ: chuỗi họ tên là:”Nguyễn Văn A” cắt ra 2 chuỗi là chuỗi họ lót:”Nguyễn
     Văn”,chuỗi tên là:”A”

     Mình mới viết = C thôi còn dùng hàm 9 ngắt 21 để in chuỗi chưa biết thế nào..
     mong các bạn giúp đỡ!
     Code:
      #include <stdio.h>
      #include <string.h>

      void tachchuoi(char *hoten,char **ten)
      {
          int n=strlen(hoten), i=n-1;
          while (hoten[i]==' ') i--;
          while (hoten[i]!=' ') i--;
          *ten = &hoten[i+1];
          hoten[i] = '0';
      }

      int main()
      {   char *hoten, *ten;
          strcpy(hoten,"Le Van An");
          tachchuoi(hoten,&ten);
          printf ("Chuoi Ho lot la: '%s'nChuoi Ten la: '%s' n",hoten,ten);
          return 0;
      }

     Trả Lời Với Trích Dẫn
2.
     Bạn muốn giỏi tiếng Anh?
     TiengAnh123.com

     Học tiếng Anh online KHÔNG giới hạn, 4 kỹ năng, hiệu quả, thú vị chỉ với 200,000đ /1 năm.
     Bạn muốn giỏi tiếng Anh?
     TiengAnh123.com

     Học tiếng Anh trực tuyến 24/24, 7/7, hiệu quả, chất lượng chỉ với200,000 vnđ /1 năm.
     Những thiên tình sử lãng mạn - Giảm40%
     muachung.vn

     Chỉ 84.000đ có bộ trăng mật rực nắng, Nghe tình yêu thức dậy..đầy lãng mạn giá 140.000đ
     Tivi Samsung
     enbac.com
Nhanh tay sở hữu tivi Samsung với thiết kế tinh tế, âm thanh sống động, hình ảnh sắc nét
3.   20-02-2012 21:35#2

     Tung_Huynh




     Rìu Chiến Bạc Chấm
     Tham gia
                 Jul 2009
     Đến từ
                 Thái Nguyên
     Bài
                 4.112
     VZD
                 21.890
     Cảm ơn
                 1.258
     Điểm
                 2.568/1.682 bài viết
     Thông tin game
     Tiền
                 $150
     Yêu thích
                 Tiến lên MN (cấp 0)




     Theo lý thuyết và theo đầu bài.. dùng chức năng 09 của ngắt 21h trong asm để
     in chuỗi thì sẽ sửa thành thế này
     viết asm inline C
     Code:
      int main()
      {
             char *hoten, *ten;
             strcpy(hoten,"Le Van An");
             tachchuoi(hoten,&ten);
             printf ("Chuoi Ho lot la: ");
             asm{
                     lea dx, hoten
                     mov ah, 09h
                     int 21
             }
             printf ("nChuoi Ten la: ");
             asm{
                     lea dx, ten
                     mov ah, 09h
                     int 21
             }
return 0;
      }

     Nhưng hiện tại, mình chạy thử thì ko ra, lý do tại sao thì mình chịu
     Smile Yoyo, Yahoo,... cho Pidgin
     Proud of you - Ðàn Piano Pascal | Hướng dẫn dùng DOSBox
     Trả Lời Với Trích Dẫn
4.
5.

6.   21-02-2012 09:10#3

     warboy




     Búa Gỗ Đôi
     Tham gia
                 Jun 2008
     Bài
                 37
     VZD
                 201
     Cảm ơn
                 17
     Điểm
                 8/6 bài viết
     Thông tin game
     Tiền
                 $1,269
     Yêu thích
                 Tiến lên MN (cấp 0)


            Tung_Huynh
     Theo lý thuyết và theo đầu bài.. dùng chức năng 09 của ngắt 21h trong asm để in chuỗi thì
     sẽ sửa thành thế này
     viết asm inline C
     Code:
      int main()
      {
             char *hoten, *ten;
             strcpy(hoten,"Le Van An");
             tachchuoi(hoten,&ten);
             printf ("Chuoi Ho lot la: ");
             asm{
                     lea dx, hoten
                     mov ah, 09h
                     int 21
             }
             printf ("nChuoi Ten la: ");
             asm{
lea dx, ten
                     mov ah, 09h
                     int 21
          }
          return 0;
 }

Nhưng hiện tại, mình chạy thử thì ko ra, lý do tại sao thì mình chịu
hề chắc là do khai báo con trỏ

More Related Content

PDF
Slide py-sys-devops-final-v1
PDF
Python
PDF
Các công cụ cần thiết cho quá trình Reverse Engineering .NET (bản đầy đủ)
PDF
Pascal 2
PDF
Phân tích Confuser 1.9.0.0 - Constant Protection - Bản dịch
PDF
Reverse Engineering .NET - Advanced Patching, Playing with IL
PDF
Tấn công ARP Cache Poisoning (Man In The Middle) Attacks
PDF
Tùy biến Confuser
Slide py-sys-devops-final-v1
Python
Các công cụ cần thiết cho quá trình Reverse Engineering .NET (bản đầy đủ)
Pascal 2
Phân tích Confuser 1.9.0.0 - Constant Protection - Bản dịch
Reverse Engineering .NET - Advanced Patching, Playing with IL
Tấn công ARP Cache Poisoning (Man In The Middle) Attacks
Tùy biến Confuser

Similar to Inline asm in c gọi hàm ngat (20)

PDF
03 Các lệnh nháy
PDF
Đề Cương ôn tập kiến trúc máy tính và thiết bị ngoại vi
PPT
Chuong10
 
PDF
PDF
PDF
Giao trinh hop_ngu
PDF
Giao trinh hop ngu (1)
PDF
Lap trinh assembler
PDF
Tìm hiểu đầy đủ về tràn bộ đệm
PDF
Laptrinhhethong
PPT
Chuong06
 
PPT
Chapter 2
PDF
Cac ham va thu tuc trong pascal
PDF
1 -nhapmon
PDF
BÀI 2: Các khái niệm cơ bản của ngôn ngữ lập trình c++
DOC
Bài giảng ngôn ngữ lập trình c c++ phạm hồng thái[bookbooming.com]
DOCX
Bài Giảng Vi Xử Lý ICTU
PDF
Ky thuat lap trinh c++
PDF
Ngon ngu lap trinh c&c++
PDF
Ngon ngu lap trinh c&c++ (pham hong thai coltech vnu)
03 Các lệnh nháy
Đề Cương ôn tập kiến trúc máy tính và thiết bị ngoại vi
Chuong10
 
Giao trinh hop_ngu
Giao trinh hop ngu (1)
Lap trinh assembler
Tìm hiểu đầy đủ về tràn bộ đệm
Laptrinhhethong
Chuong06
 
Chapter 2
Cac ham va thu tuc trong pascal
1 -nhapmon
BÀI 2: Các khái niệm cơ bản của ngôn ngữ lập trình c++
Bài giảng ngôn ngữ lập trình c c++ phạm hồng thái[bookbooming.com]
Bài Giảng Vi Xử Lý ICTU
Ky thuat lap trinh c++
Ngon ngu lap trinh c&c++
Ngon ngu lap trinh c&c++ (pham hong thai coltech vnu)
Ad

Inline asm in c gọi hàm ngat

  • 1. Inline ASM gọi hàm! Sau khi xây dựng một hàm bằng ngôn ngữ C/C++ chuẩn, chúng ta có thể dùng hàm này trong inline ASM của C/C++; sau đây là chương trình tính tổng 2 số 10 và 16: PHP Code: #include <iostream> #include <conio.h> using namespace std; int Tong(int a, int b) { return (a+b); } int main() { int retValue; _asm { push 10 push 16 call Tong //Gọi hàm đây add esp, 8 mov retValue, eax } cout << "Tong cua 10+16 = " << retValue; getch(); return 0; } Tại sao chúng ta phải inline ASM trong C/C++??? Sau một thời gian Peter tìm hiểu về ASM thì Peter bắt đầu muốn dùng ASM trong ngôn ngữ C/C++ _ Đơn giản vì bắt gặp một câu trả lời "bâng quơ" không giải thích là "mã ASM chạy nhanh hơn mã C/C++"; Peter hiểu là mã C/C++ sẽ được dịch thành mã máy, 1 câu lệnh mã C/C++ có thể sinh vài lệnh mã máy; nên Peter nghĩ rằng đây là lời giải đáp thiết thực cho câu trả lời bâng quơ trên..... Chúc các bạn học tốt! Đã được chỉnh sửa lần cuối bởi peterdrew : 29-06-2010 lúc 06:39 PM. #2 25-05-2010, 10:17 PM Ngày gia nhập: 04 2009 Nơi ở: một căn hộ nhỏ trên trái đất icttrack Bài viết: 389 XCoworker Member @peterdrew: Thủ thuật thì anh cũng phải giải thích chứ. Chẳng hạn tại sao phải push 10, 16 Tại sao phải add esp, 8, nếu ko làm thì có chuyện gì xảy ra. __________________ Being top programmers always requires advanced knowledge of C/C++ and assembly http://i138.photobucket.com/albums/q...1989/mysig.png
  • 2. #3 25-05-2010, 10:44 PM Ngày gia nhập: 05 2010 Nơi ở: Cách Mạng Tháng 8 Nature Master Bài viết: 210 Thành viên nhiệt tình Hàm trong ASM sẽ lấy các đối số trong Stack nên phải push vào. Về lệnh add esp, 8 thì phải nói tới nguyên tắc dùng Stack của 1 hàm: trước khi thực hiên hàm , con trỏ Stack ờ đâu thì sau khi hàm thực hiện xong phải trả nó về đúng vị trí ấy. Con trỏ esp ở địa chỉ cao, khi push vào thì nó giảm xuống. Ở đây ta push 2 số int nên esp giảm 8 byte. Thay vì pop 2 lần mà chẳng cần sử dụng giá trị đó thì ta chỉ việc cộng esp với 8 để quay về vị trí cũ là được. __________________ Nothing last forever !! #4 25-05-2010, 10:58 PM Ngày gia nhập: 01 2010 Nơi ở: до свидания! Banned Bài viết: 1,842 Trích dẫn: Nguyên bản được gửi bởi Nature Master Hàm trong ASM sẽ lấy các đối số trong Stack nên phải push vào. Về lệnh add esp, 8 thì phải nói tới nguyên tắc dùng Stack của 1 hàm: trước khi thực hiên hàm , con trỏ Stack ờ đâu thì sau khi hàm thực hiện xong phải trả nó về đúng vị trí ấy. Con trỏ esp ở địa chỉ cao, khi push vào thì nó giảm xuống. Ở đây ta push 2 số int nên esp giảm 8 byte. Thay vì pop 2 lần mà chẳng cần sử dụng giá trị đó thì ta chỉ việc cộng esp với 8 để quay về vị trí cũ là được. Hoàn toàn chuẩn! Lời giải đáp này đã giải quyết được các yêu cầu của Ictrack rồi; tuy nhiên trước khi đọc bài này thì các bạn cũng nên tìm hiểu cách làm việc của lệnh Add; hai thanh ghi esp (tại sao không dùng cái khác?!!! khi hiểu được tác dụng của thanh ghi này rồi thì việc thao tác phía sau mới dễ dàng được) và eax. Hy vọng các bạn tiếp tục trao đổi nếu cần thiết. p/s: Thật ra thì cái này Ic đã hiểu rồi, chỉ muốn Peter giải thích cho mọi người hiểu thôi! Tuy nhiên bạn Nature Master đã rõ ràng rồi, Peter không ý kiến thêm. #5 25-05-2010, 11:12 PM Ngày gia nhập: 05 2010 Nơi ở: Cách Mạng Tháng 8 Nature Master Bài viết: 210 Thành viên nhiệt tình
  • 3. Trích dẫn: Nguyên bản được gửi bởi peterdrew p/s: Thật ra thì cái này Ic đã hiểu rồi, chỉ muốn Peter giải thích cho mọi người hiểu thôi! Tuy nhiên bạn Nature Master đã rõ ràng rồi, Peter không ý kiến thêm. Thật ra thì chưa có "ma" nào hỏi cả, anh Peter ạ __________________ Nothing last forever !! #6 26-05-2010, 04:56 PM Ngày gia nhập: 06 2007 Nơi ở: C:WINDOWSsystem32dllcache Bài viết: 2,679 langman Thành viên mới @anh pt và Nature Master langman góp ý thế này : còn thiếu cân bằng si và sp nữa PHP Code: mov esi,esp push 10 // b sẽ nhận giá trị này push 16 // a sẽ nhận giá trị này call Tong //Gọi hàm đây add esp, 8 mov retValue, eax __________________ ^_,^ Mình là 1 con gà trong công nghệ. Đã được chỉnh sửa lần cuối bởi langman : 26-05-2010 lúc 05:08 PM. #7 26-05-2010, 05:17 PM Ngày gia nhập: 04 2009 Nơi ở: một căn hộ nhỏ trên trái đất icttrack Bài viết: 389 XCoworker Member @langman: esp đã được hồi phục sau khi gọi add esp, 8.
  • 4. Cất esp vào esi làm gì hả langman __________________ Being top programmers always requires advanced knowledge of C/C++ and assembly http://i138.photobucket.com/albums/q...1989/mysig.png #8 26-05-2010, 06:10 PM Ngày gia nhập: 06 2007 Nơi ở: C:WINDOWSsystem32dllcache Bài viết: 2,679 langman Thành viên mới Trích dẫn: Nguyên bản được gửi bởi icttrack @langman: esp đã được hồi phục sau khi gọi add esp, 8. Cất esp vào esi làm gì hả langman ừa ha giờ mới để ý , nhưng như thế hình như ko được hay lắm + với 1 class thì phải tính toán độ lệch để nhảy về, mà như đã biết thì class tự làm tròn dung lượng lượng chia hết 4, như thế có thể tính nhầm, +trong quá trình call hàm thì lại phải lo lắng đến việc tạo sao chép +trong hàm có đệ quy hoặc *** mà có dùng dến đệ quy thì tính toán độ lệch kiểu gì phương án a pt đưa ra để hiểu thêm, rất hay, mà ko áp dụng vào thực tế , vì + bỏ qua sự biên dịch thông minh của trình biên dịch + kết quả cuối cùng giữa bt và của a cũng sinh mã gần giống nhau thôi mà, cái tiết kiệm được chỉ là chi phí về thời gian cho việc biên dịch __________________ ^_,^ Mình là 1 con gà trong công nghệ. #9 26-05-2010, 07:16 PM
  • 5. Ngày gia nhập: 04 2009 Nơi ở: một căn hộ nhỏ trên trái đất icttrack Bài viết: 389 XCoworker Member Trích dẫn: + với 1 class thì phải tính toán độ lệch để nhảy về, mà như đã biết thì class tự làm tròn dung lượng lượng chia hết 4, như thế có thể tính nhầm, +trong quá trình call hàm thì lại phải lo lắng đến việc tạo sao chép +trong hàm có đệ quy hoặc *** mà có dùng dến đệ quy thì tính toán độ lệch kiểu gì Mình thật sự không hiểu hết ý của langman. Nếu thủ tục trong ASM (hàm trong C/C++) được thiết lập stack frame (khung ngăn xếp) cẩn thận thì khi gọi đệ quy chẳng khỏi lo CPU tính toán sai vì mỗi lần gọi thủ tục thì thủ tục đã có một stack frame của riêng nó. Dùng đệ quy hay không đệ quy thì bản chất CPU sẽ nhảy đến địa chỉ chứa mã lệnh của thủ tục, nếu bị gọi đệ quy thì thực ra ta lại quay lại địa chỉ của thủ tục đó thôi khi mã lệnh của thủ tục đó còn chưa được chạy hết, về vấn đề này thì việc gọi thủ tục giống lệnh jump chỉ có điều nó sẽ cất nội dung của thanh ghi EIP chứa địa chỉ của lệnh tiếp theo sau lệnh gọi thủ tục vào trong ngăn xếp. Trích dẫn: phương án a pt đưa ra để hiểu thêm, rất hay, mà ko áp dụng vào thực tế , vì + bỏ qua sự biên dịch thông minh của trình biên dịch + kết quả cuối cùng giữa bt và của a cũng sinh mã gần giống nhau thôi mà, cái tiết kiệm được chỉ là chi phí về thời gian cho việc biên dịch Phương án của anh peter là cần thiết nếu ta muốn gọi hàm C, C++ (với chú ý là hàm C++ ko được phép nạp chồng) ngay trong mã assembly. Điều này là hoàn toàn có thể xảy ra vì ta muốn tối ưu một đoạn mã nào đó bằng việc viết asm, yêu cầu của đoạn mã đó là có sử dụng hàm viết bằng ngôn ngữ C hoặc C++ thì không có cách nào khác ngoài cách gọi kiểu như trên đối với thư viện trong C) Cần biết rằng cách gọi như anh peter lấy ví dụ là cách mà trong chương trình chúng ta gọi các hàm như printf, scanf trong thư viện C, vì hàm trong thư viện C sử dụng quy ước gọi __cdecl. __________________ Being top programmers always requires advanced knowledge of C/C++ and assembly http://i138.photobucket.com/albums/q...1989/mysig.png #10 26-05-2010, 11:10 PM Ngày gia nhập: 06 2007 Nơi ở: C:WINDOWSsystem32dllcache Bài viết: 2,679 langman Thành viên mới Trích dẫn: Nguyên bản được gửi bởi icttrack Mình thật sự không hiểu hết ý của langman. Nếu thủ tục trong ASM (hàm trong
  • 6. C/C++) được thiết lập stack frame (khung ngăn xếp) cẩn thận thì khi gọi đệ quy chẳng khỏi lo CPU tính toán sai vì mỗi lần gọi thủ tục thì thủ tục đã có một stack frame của riêng nó. Dùng đệ quy hay không đệ quy thì bản chất CPU sẽ nhảy đến địa chỉ chứa mã lệnh của thủ tục, nếu bị gọi đệ quy thì thực ra ta lại quay lại địa chỉ của thủ tục đó thôi khi mã lệnh của thủ tục đó còn chưa được chạy hết, về vấn đề này thì việc gọi thủ tục giống lệnh jump chỉ có điều nó sẽ cất nội dung của thanh ghi EIP chứa địa chỉ của lệnh tiếp theo sau lệnh gọi thủ tục vào trong ngăn xếp. Phương án của anh peter là cần thiết nếu ta muốn gọi hàm C, C++ (với chú ý là hàm C++ ko được phép nạp chồng) ngay trong mã assembly. Điều này là hoàn toàn có thể xảy ra vì ta muốn tối ưu một đoạn mã nào đó bằng việc viết asm, yêu cầu của đoạn mã đó là có sử dụng hàm viết bằng ngôn ngữ C hoặc C++ thì không có cách nào khác ngoài cách gọi kiểu như trên đối với thư viện trong C) Cần biết rằng cách gọi như anh peter lấy ví dụ là cách mà trong chương trình chúng ta gọi các hàm như printf, scanf trong thư viện C, vì hàm trong thư viện C sử dụng quy ước gọi __cdecl. cậu ko hiểu ý tớ rồi, trong bài đó ý tớ nói là bài của a pt để tìm hiểu sâu về bản chất của vấn đề, rất hay và nên biết nhưng mà để áp dụng vào thực tế tức là lúc code đổi lời gọi hàm bằng đoạn mã asm là ko khả thi vì những lý do tớ đưa ra đó, việc đặt lời gọi hàm vô sẽ khả thi hơn. __________________ ^_,^ Mình là 1 con gà trong công nghệ. Inline ASM tính tổng hai số peterdrew on Fri Jul 09, 2010 8:38 pm Peter mở ra vấn đề này cũng là vì giới thiệu với các bạn một vài code Inline ASM trong C/C++; với bài này Peter cho các bạn thấy một ví dụ đơn giản như tính tổng của 2 số thực (float) chẳng hạn: CODE: #include <conio.h> #include <stdio.h> float a,b,tong; int main() { printf("Nhap vao so thu nhat, a= "); scanf("%f",&a); printf("Nhap vao so thu 2, b= "); scanf("%f",&b); _asm
  • 7. { fld a fld b fadd ST,ST(1) fstp tong fwait } printf("Tong cua hai so %f va %f la %f",a,b,tong); getch(); return 0; } Hay cũng có thể làm như thế này (với số nguyên (int) có thêm các thao tác Trừ, Nhân và Chia): CODE: #include <stdio.h> #include <conio.h> int Cong(int x, int y) { __asm { mov eax,x; mov ebx,y; add eax,ebx; mov x,eax; } return x; } int Tru(int x, int y) { __asm { mov eax,x; mov ebx,y; sub eax,ebx; mov x,eax; } return x; } int Chia(int x, int y) { __asm { mov eax,x; mov ecx,y; sub edx,edx; div ecx; mov x,eax; } return x;
  • 8. } int Nhan(int x, int y) { __asm { mov eax,x; mov ebx,y; mul ebx; mov x,eax; } return x; } int main () { int func; int x,y; bool finish=false; while (finish==false) { printf("1: Cong, 2: Tru, 3: Chia, 4: Nhann"); printf("Lua chon:n"); scanf("%d",&func); printf("Nhap so hang dau tien:n"); scanf("%d",&x); printf("Nhap so hang thu hai:n"); scanf("%d",&y); switch(func) { case 1: printf("Tong %d va %d la: ",x,y,Cong(x,y)); break; case 2: printf("Hieu %d cho %d la: ",x,y,Tru(x,y)); break; case 3: printf("Thuong nguyen %d chia %d la: ",x,y,Chia(x,y)); break; case 4: printf("Tich %d va %d la: ",x,y,Nhan(x,y)); break; } } return 0; } Hoặc Inline chuẩn: CODE:
  • 9. extern "C" __declspec(naked) int __stdcall Cong(int x, int y) { _asm { mov eax, dword ptr [esp+4] add eax, dword ptr [esp+8] ret 8 } } extern "C" __declspec(naked) int __stdcall Tru(int x, int y) { _asm { mov eax, dword ptr [esp+4] sub eax, dword ptr [esp+8] ret 8 } } extern "C" __declspec(naked) int __stdcall Chia(int x, int y) { _asm { mov eax, dword ptr [esp+4] cdq mov ecx, dword ptr [esp+8] div ecx ret 8 } } extern "C" __declspec(naked) int __stdcall Nhan(int x, int y) { _asm { mov eax, dword ptr [esp+4] mul dword ptr [esp+8] ret 8 } } Vậy các bạn thấy thế nào??? Được sửa bởi peterdrew ngày Sun Sep 05, 2010 3:30 pm; sửa lần 1. • •
  • 10. • • • • • peterdrew peterdrew Nhập môn Tổng số bài gửi: 18 Points: 24 Join date: 09/07/2010 Age: 28 Đến từ: Viện Vũ khí_Bộ Quốc phòng • • Post n°2 Inline ASM trong main() để gọi hàm đã được viết bằng C/C++ peterdrew on Fri Jul 09, 2010 8:49 pm Sau khi xây dựng một hàm bằng ngôn ngữ C/C++ chuẩn, chúng ta có thể dùng hàm này trong inline ASM của C/C++; sau đây là chương trình tính tổng 2 số 10 và 16 chẳng hạn: CODE: #include <stdio.h> #include <conio.h> //Xây dựng hàm tính Tổng hai số nguyên int Tong(int a, int b) { return (a+b); } int main() { int retValue; _asm { push 10 push 16 call Tong //Gọi hàm Tổng đã được xây dựng ở trên! add esp, 8 mov retValue, eax } printf("Tong cua 10+16 = %d",retValue); getch();
  • 11. return 0; } Được sửa bởi peterdrew ngày Fri Jul 09, 2010 8:49 pm; sửa lần 1. (Reason for editing : Đặt code vào thẻ!) • • • • • • • pearlz pearlz Nhập môn Tổng số bài gửi: 4 Points: 6 Join date: 11/07/2010 • • Post n°3 Re: Inline ASM tính tổng hai số pearlz on Sun Sep 05, 2010 1:09 am Hê hê có cơ hội trả đòn bác peter rồi nhé! cái inline asm thứ 3 có nghĩa là với int thì bác peter có lẽ hơi nhầm theo em phải là idiv và imul vì trường hợp này bác dùng là int chứ không phải unsigned int lí do là int thì có thể chứa cả giá trị dương (+, >0) và âm (-,<0) bit trên cùng nhất sẽ dùng để chứa dấu chứ không dùng để chứa giá trị nên khi ta dùng mul và div thì sẽ không có xét dấu và kết quả là không chính xác vì bit dấu bị đem ra để tính giá trị pm: 2 Peterdrew em là perfect bên caulacbovb.net đã từng bị ăn 1 đòn của bác, hế hế hòa nhé, cho em kết bạn với bác peter nhé yahoo của em là : hoanlevan22 khi nào bác rảnh thì buzz em tiếng nhé! • • • •
  • 12. • • • peterdrew peterdrew Nhập môn Tổng số bài gửi: 18 Points: 24 Join date: 09/07/2010 Age: 28 Đến từ: Viện Vũ khí_Bộ Quốc phòng • • Post n°4 Re: Inline ASM tính tổng hai số peterdrew on Sun Sep 05, 2010 3:40 pm pearlz đã viết:Hê hê có cơ hội trả đòn bác peter rồi nhé! p cái inline asm thứ 3 có nghĩa là với int thì bác peter có lẽ hơi nhầm theo em phải là idiv và imul vì trường hợp này bác dùng là int chứ không phải unsigned int lí do là int thì có thể chứa cả giá trị dương (+, >0) và âm (-,<0) bit trên cùng nhất sẽ dùng để chứa dấu chứ không dùng để chứa giá trị nên khi ta dùng mul và div thì sẽ không có xét dấu và kết quả là không chính xác vì bit dấu bị đem ra để tính giá trị pm: 2 Peterdrew em là perfect bên caulacbovb.net đã từng bị ăn 1 đòn của bác, hế hế hòa nhé, cho em kết bạn với bác peter nhé yahoo của em là : hoanlevan22 khi nào bác rảnh thì buzz em tiếng nhé! Khi nhân thì chẳng cần imul; khi chia thì đúng là Peter chưa để ý cái idiv, thank cậu! Bài này post lâu mà bữa nay mới có cậu trả lời đó.... CODE: #include <stdio.h> #include <conio.h> extern "C" __declspec(naked) int __stdcall Nhan(int x, int y) { _asm { mov eax, dword ptr [esp+4] mul dword ptr [esp+8] ret 8 } } int main() { int i,j;
  • 13. printf("i= "); scanf("%d",&i); printf("j= "); scanf("%d",&j); printf("%d * %d = %d",i,j,Nhan(i,j)); getch(); return 0; } p/s: Còn cái chuyện bên clbvb chẳng có gì cả, Peter thấy quá bình thường!.... Cậu cũng có cá tính phết nhỉ??? Hì hì 1. Dung ngắt để in chuỗi trong C.. các bác giúp với ! Đề Bài: Viết hàm cắt chuỗi họ tên thành chuỗi họ lót và chuỗi tên. Dùng ngắt để in ra chuỗi kết quả Ví dụ: chuỗi họ tên là:”Nguyễn Văn A” cắt ra 2 chuỗi là chuỗi họ lót:”Nguyễn Văn”,chuỗi tên là:”A” Mình mới viết = C thôi còn dùng hàm 9 ngắt 21 để in chuỗi chưa biết thế nào.. mong các bạn giúp đỡ! Code: #include <stdio.h> #include <string.h> void tachchuoi(char *hoten,char **ten) { int n=strlen(hoten), i=n-1; while (hoten[i]==' ') i--; while (hoten[i]!=' ') i--; *ten = &hoten[i+1]; hoten[i] = '0'; } int main() { char *hoten, *ten; strcpy(hoten,"Le Van An"); tachchuoi(hoten,&ten); printf ("Chuoi Ho lot la: '%s'nChuoi Ten la: '%s' n",hoten,ten); return 0; } Trả Lời Với Trích Dẫn 2. Bạn muốn giỏi tiếng Anh? TiengAnh123.com Học tiếng Anh online KHÔNG giới hạn, 4 kỹ năng, hiệu quả, thú vị chỉ với 200,000đ /1 năm. Bạn muốn giỏi tiếng Anh? TiengAnh123.com Học tiếng Anh trực tuyến 24/24, 7/7, hiệu quả, chất lượng chỉ với200,000 vnđ /1 năm. Những thiên tình sử lãng mạn - Giảm40% muachung.vn Chỉ 84.000đ có bộ trăng mật rực nắng, Nghe tình yêu thức dậy..đầy lãng mạn giá 140.000đ Tivi Samsung enbac.com
  • 14. Nhanh tay sở hữu tivi Samsung với thiết kế tinh tế, âm thanh sống động, hình ảnh sắc nét 3. 20-02-2012 21:35#2 Tung_Huynh Rìu Chiến Bạc Chấm Tham gia Jul 2009 Đến từ Thái Nguyên Bài 4.112 VZD 21.890 Cảm ơn 1.258 Điểm 2.568/1.682 bài viết Thông tin game Tiền $150 Yêu thích Tiến lên MN (cấp 0) Theo lý thuyết và theo đầu bài.. dùng chức năng 09 của ngắt 21h trong asm để in chuỗi thì sẽ sửa thành thế này viết asm inline C Code: int main() { char *hoten, *ten; strcpy(hoten,"Le Van An"); tachchuoi(hoten,&ten); printf ("Chuoi Ho lot la: "); asm{ lea dx, hoten mov ah, 09h int 21 } printf ("nChuoi Ten la: "); asm{ lea dx, ten mov ah, 09h int 21 }
  • 15. return 0; } Nhưng hiện tại, mình chạy thử thì ko ra, lý do tại sao thì mình chịu Smile Yoyo, Yahoo,... cho Pidgin Proud of you - Ðàn Piano Pascal | Hướng dẫn dùng DOSBox Trả Lời Với Trích Dẫn 4. 5. 6. 21-02-2012 09:10#3 warboy Búa Gỗ Đôi Tham gia Jun 2008 Bài 37 VZD 201 Cảm ơn 17 Điểm 8/6 bài viết Thông tin game Tiền $1,269 Yêu thích Tiến lên MN (cấp 0) Tung_Huynh Theo lý thuyết và theo đầu bài.. dùng chức năng 09 của ngắt 21h trong asm để in chuỗi thì sẽ sửa thành thế này viết asm inline C Code: int main() { char *hoten, *ten; strcpy(hoten,"Le Van An"); tachchuoi(hoten,&ten); printf ("Chuoi Ho lot la: "); asm{ lea dx, hoten mov ah, 09h int 21 } printf ("nChuoi Ten la: "); asm{
  • 16. lea dx, ten mov ah, 09h int 21 } return 0; } Nhưng hiện tại, mình chạy thử thì ko ra, lý do tại sao thì mình chịu hề chắc là do khai báo con trỏ