banner

[Rule] Rules  [Home] Main Forum  [Portal] Portal  
[Members] Member Listing  [Statistics] Statistics  [Search] Search  [Reading Room] Reading Room 
[Register] Register  
[Login] Loginhttp  | https  ]
 
Forum Index Thảo luận hệ điều hành Windows được viết bằng ASm nhưng sao nó lại khác nhau  XML
  [Programming]   được viết bằng ASm nhưng sao nó lại khác nhau 25/11/2007 10:10:42 (+0700) | #1 | 99883
[Avatar]
kegiaumat055
Member

[Minus]    0    [Plus]
Joined: 28/06/2007 22:19:18
Messages: 25
Offline
[Profile] [PM]
Anh ơi cho em hỏi 2 chương trình Hello.asm này đều được viết bằng ASm nhưng sao nó lại khác nhau.Anh có thể giải thích được không và chọn cách viết nào là tốt nhất

Đây là hello.asm thứ nhất:

Code SEGMENT
ASSUME CS:Code,DS:Code
ORG 100h
Begin
MOV AH,09h
MOV DX,Offset String
Int 20h
String DB ' hello,how are you ? $ '
Code Ends
END Begin

Đây là hello.asm thứ hai:
.model small
.stack 100h
.data
s DB “hello,how are you ? $” ; khai báo xâu kí tự cần in
.code
mov AX,@data ; lấy địa chỉ data segment ghi vào DS
mov DS,AX ; Vì model small, đây cũng là địa chỉ
; segment của xâu s

; xuất chuỗi
mov DX, OFFSET s ; lấy địa chỉ offset ghi vào DX
mov AH , 9
int 21h ; gọi hàm 9, ngắt 21h để in

mov AH, 4Ch ; Thoát khỏi chương trình
int 21h
end
[Up] [Print Copy]
  [Question]   Re: được viết bằng ASm nhưng sao nó lại khác nhau 26/11/2007 03:40:08 (+0700) | #2 | 100021
[Avatar]
kegiaumat055
Member

[Minus]    0    [Plus]
Joined: 28/06/2007 22:19:18
Messages: 25
Offline
[Profile] [PM]
Sao không có ai trả lời vậy
[Up] [Print Copy]
  [Question]   được viết bằng ASm nhưng sao nó lại khác nhau 26/11/2007 03:50:51 (+0700) | #3 | 100023
sdkvietnam
Member

[Minus]    0    [Plus]
Joined: 24/11/2007 16:53:33
Messages: 1
Offline
[Profile] [PM]

kegiaumat055 wrote:
Anh ơi cho em hỏi 2 chương trình Hello.asm này đều được viết bằng ASm nhưng sao nó lại khác nhau.Anh có thể giải thích được không và chọn cách viết nào là tốt nhất

Đây là hello.asm thứ nhất:

Code SEGMENT
ASSUME CS:Code,DS:Code
ORG 100h
Begin
MOV AH,09h
MOV DX,Offset String
Int 20h<- ngat 21 ha ban
String DB ' hello,how are you ? $ '
Code Ends<- cai nay o cuoi no nam truoc end begin
END Begin

 


ban hoi no khac nhau o cho nao thi moi tra loi duoc chu bansmilie
[Up] [Print Copy]
  [Question]   được viết bằng ASm nhưng sao nó lại khác nhau 26/11/2007 06:20:25 (+0700) | #4 | 100043
[Avatar]
mystery_hacker
Member

[Minus]    0    [Plus]
Joined: 30/06/2006 16:16:03
Messages: 365
Location: Khánh Hòa
Offline
[Profile] [PM] [Yahoo!]

kegiaumat055 wrote:
Anh ơi cho em hỏi 2 chương trình Hello.asm này đều được viết bằng ASm nhưng sao nó lại khác nhau.Anh có thể giải thích được không và chọn cách viết nào là tốt nhất

Đây là hello.asm thứ nhất:

Code SEGMENT
ASSUME CS:Code,DS:Code
ORG 100h
Begin
MOV AH,09h
MOV DX,Offset String
Int 20h
String DB ' hello,how are you ? $ '
Code Ends
END Begin

Đây là hello.asm thứ hai:
.model small
.stack 100h
.data
s DB “hello,how are you ? $” ; khai báo xâu kí tự cần in
.code
mov AX,@data ; lấy địa chỉ data segment ghi vào DS
mov DS,AX ; Vì model small, đây cũng là địa chỉ
; segment của xâu s

; xuất chuỗi
mov DX, OFFSET s ; lấy địa chỉ offset ghi vào DX
mov AH , 9
int 21h ; gọi hàm 9, ngắt 21h để in

mov AH, 4Ch ; Thoát khỏi chương trình
int 21h
end 

Mình ko nhớ rõ nhưng hình như là chương trình thứ nhất được viết theo chỉ dẫn phân đoạn chuẩn còn chương trình thứ hai được viết theo chỉ dẫn phân đoạn đơn giản. Viết theo cách thứ 2 thường sẽ giúp chương trình ngắn gọn và dễ hiểu hơn!
[Up] [Print Copy]
  [Question]   được viết bằng ASm nhưng sao nó lại khác nhau 26/11/2007 07:23:30 (+0700) | #5 | 100062
[Avatar]
pthanhkim
Member

[Minus]    0    [Plus]
Joined: 06/03/2005 20:07:28
Messages: 27
Offline
[Profile] [PM]

kegiaumat055 wrote:
Anh ơi cho em hỏi 2 chương trình Hello.asm này đều được viết bằng ASm nhưng sao nó lại khác nhau.Anh có thể giải thích được không và chọn cách viết nào là tốt nhất

Đây là hello.asm thứ nhất:

Code SEGMENT
ASSUME CS:Code,DS:Code
ORG 100h
Begin
MOV AH,09h
MOV DX,Offset String
Int 20h
String DB ' hello,how are you ? $ '
Code Ends
END Begin

Đây là hello.asm thứ hai:
.model small
.stack 100h
.data
s DB “hello,how are you ? $” ; khai báo xâu kí tự cần in
.code
mov AX,@data ; lấy địa chỉ data segment ghi vào DS
mov DS,AX ; Vì model small, đây cũng là địa chỉ
; segment của xâu s

; xuất chuỗi
mov DX, OFFSET s ; lấy địa chỉ offset ghi vào DX
mov AH , 9
int 21h ; gọi hàm 9, ngắt 21h để in

mov AH, 4Ch ; Thoát khỏi chương trình
int 21h
end 


Chương trình 1 không cần đoạn stack mặc định IP Flags=100h không có đoạn DATA. Chương trình 2 sử dụng stack và có đoạn DATA

Thân chào
[Up] [Print Copy]
  [Question]   Re: được viết bằng ASm nhưng sao nó lại khác nhau 26/11/2007 10:58:29 (+0700) | #6 | 100147
[Avatar]
computerline
Member

[Minus]    0    [Plus]
Joined: 30/03/2007 13:46:50
Messages: 144
Offline
[Profile] [PM] [Email] [WWW] [Yahoo!]
Mình cũng chỉ mới học qua ASM nhưng theo mình thì hai chương trình này khác nhau là vì nó được viết cho 2 trình compiler khác nhau.
Trình thứ nhất được viết cho trình dịch MASM 16 bit.
Code:
Code SEGMENT 
ASSUME CS:Code,DS:Code 
ORG 100h 
Begin 
MOV AH,09h 
MOV DX,Offset String 
Int 20h 
String DB ' hello,how are you ? $ ' 
Code Ends 
END Begin

Còn trình thứ hai được viết cho trình dịch TASM 16 bit.
Code:
model small 
.stack 100h 
.data 
s DB “hello,how are you ? $” ; khai báo xâu kí tự cần in 
.code 
mov AX,@data ; lấy địa chỉ data segment ghi vào DS 
mov DS,AX ; Vì model small, đây cũng là địa chỉ 
; segment của xâu s 

; xuất chuỗi 
mov DX, OFFSET s ; lấy địa chỉ offset ghi vào DX 
mov AH , 9 
int 21h ; gọi hàm 9, ngắt 21h để in 

mov AH, 4Ch ; Thoát khỏi chương trình 
int 21h 
end

Về cơ bản thì 2 chương trình trên không khác nhau vì nó chỉ thực hiện có mỗi việc là in ra dòng chữ "hello,how are you ?" lên cửa sổ console nhưng vì nó được viết cho 2 trình dịch khác nhau nên có thể có chút thay đổi trong mã cũng là chuyện bình thường. Thân
Không có nghề gì trong xã hội là thấp hèn cả - chỉ có nhân cách mới phân biệt thấp cao
[Up] [Print Copy]
  [Question]   Re: được viết bằng ASm nhưng sao nó lại khác nhau 26/11/2007 11:42:05 (+0700) | #7 | 100163
[Avatar]
kegiaumat055
Member

[Minus]    0    [Plus]
Joined: 28/06/2007 22:19:18
Messages: 25
Offline
[Profile] [PM]
.Em có sách" Kĩ thuật vi xử lí và lập trình ASSEMBLY cho hệ vi xử lí" của Đỗ Xuân Tiến và sách điện tử "Tra cứu ASM" bày làm theo cách 1.Nhưng "cấu trúc máy tính & ASM" và "Giao trinh hop ngu - Assembly" thì bày làm cách 2 .Vậy cách nào là tốt nhất.Xin các anh giúp đỡ nhiều
[Up] [Print Copy]
  [Question]   Re: được viết bằng ASm nhưng sao nó lại khác nhau 26/11/2007 12:42:41 (+0700) | #8 | 100182
[Avatar]
tmd
Member

[Minus]    0    [Plus]
Joined: 28/06/2006 03:39:48
Messages: 2951
Offline
[Profile] [PM]
Nhớ lại thuở xưa một chút.
Trong 2 cái đoạn code đó, phân biệt rõ ràng nhất là cách thức sử dụng ngắt. Hai đoạn code đó đều có thể compile, đoạn trên thành .com , đoạn dưới thành .exe .
Một cái chỉ sử dụng có 64k bytes bộ nhớ , loại này là .com, sử dụng ngắt 20h. Loại kia sử dụng nhiều hơn 64k bytes bộ nhớ, loại này là .exe , sử dụng ngắt 21h. Nói cụt ngủn vậy hơi khó hiểu. Bạn tìm hiểu sự khác biệt giữa .com và .exe sẽ hiểu.
Bạn nên tìm hiểu sơ về các đời cpu intel, tập lệnh đi theo các đời đó, cách thức quản lý bộ nhớ, cách dùng ngắt qua các đời, bộ thanh ghi qua các đời. Học assembly mệt dữ lắm.
Hồi đi học, môn này là môn sát thủ.
Cái code đó từ trang này của microsoft đây
How to Use Int 20h to Terminate an .EXE Program
http://support.microsoft.com/kb/72848
3 giai đoạn của con... người, ban đầu dek biết gì thì phải thăm dò, sau đó biết rồi thì phải thân thiết, sau cùng khi quá thân thiết rồi thì phải tình thương mến thương. Nhưng mà không thương được thì ...
[Up] [Print Copy]
  [Question]   Re: được viết bằng ASm nhưng sao nó lại khác nhau 26/11/2007 23:53:16 (+0700) | #9 | 100274
[Avatar]
kegiaumat055
Member

[Minus]    0    [Plus]
Joined: 28/06/2007 22:19:18
Messages: 25
Offline
[Profile] [PM]
Nhớ lại thuở xưa một chút.
Trong 2 cái đoạn code đó, phân biệt rõ ràng nhất là cách thức sử dụng ngắt. Hai đoạn code đó đều có thể compile, đoạn trên thành .com , đoạn dưới thành .exe .
Một cái chỉ sử dụng có 64k bytes bộ nhớ , loại này là .com, sử dụng ngắt 20h. Loại kia sử dụng nhiều hơn 64k bytes bộ nhớ, loại này là .exe , sử dụng ngắt 21h. Nói cụt ngủn vậy hơi khó hiểu. Bạn tìm hiểu sự khác biệt giữa .com và .exe sẽ hiểu.
Bạn nên tìm hiểu sơ về các đời cpu intel, tập lệnh đi theo các đời đó, cách thức quản lý bộ nhớ, cách dùng ngắt qua các đời, bộ thanh ghi qua các đời. Học assembly mệt dữ lắm.
Hồi đi học, môn này là môn sát thủ.
Cái code đó từ trang này của microsoft đây
How to Use Int 20h to Terminate an .EXE Program
http://support.microsoft.com/kb/72848  
Ý em muốn hỏi là dùng cái nào là tốt nhất
[Up] [Print Copy]
  [Question]   Re: được viết bằng ASm nhưng sao nó lại khác nhau 27/11/2007 08:18:27 (+0700) | #10 | 100417
[Avatar]
kegiaumat055
Member

[Minus]    0    [Plus]
Joined: 28/06/2007 22:19:18
Messages: 25
Offline
[Profile] [PM]
Chẳng lẽ hvaonline.net không có ai là nhân tài về ASM sao.Có một câu hỏi cỏn con của em cũng không trả lời đựoc
[Up] [Print Copy]
  [Question]   Re: được viết bằng ASm nhưng sao nó lại khác nhau 27/11/2007 08:59:47 (+0700) | #11 | 100428
[Avatar]
rename
Member

[Minus]    0    [Plus]
Joined: 28/06/2006 23:02:03
Messages: 32
Location: [color=red]i[/color]
Offline
[Profile] [PM]
Cái nào viết gọn hơn, ít byte hơn thì tốt hơn, thế thôi
[Up] [Print Copy]
  [Question]   Re: được viết bằng ASm nhưng sao nó lại khác nhau 27/11/2007 12:26:27 (+0700) | #12 | 100473
[Avatar]
tmd
Member

[Minus]    0    [Plus]
Joined: 28/06/2006 03:39:48
Messages: 2951
Offline
[Profile] [PM]
Nếu bạn học cái môn này, chỉ để cho qua, học cho vui, thì bạn muốn dùng cái kiểu code nào cũng được hết, tùy bạn suy nghỉ lấy. Còn bạn học cho biết để sau này sử dụng lại nó, bạn tìm hiểu mấy thứ tui nói đó. Học mà không tự suy nghỉ được, chịu chết đó bạn. Môn này không chịu tìm hiểu, là chẳng biết thứ gì đâu.
3 giai đoạn của con... người, ban đầu dek biết gì thì phải thăm dò, sau đó biết rồi thì phải thân thiết, sau cùng khi quá thân thiết rồi thì phải tình thương mến thương. Nhưng mà không thương được thì ...
[Up] [Print Copy]
  [Question]   Re: được viết bằng ASm nhưng sao nó lại khác nhau 27/11/2007 14:13:43 (+0700) | #13 | 100517
[Avatar]
hakuso
HVA Friend

Joined: 04/01/2004 13:28:06
Messages: 287
Location: làng Đo Đo
Offline
[Profile] [PM]

kegiaumat055 wrote:
Ý em muốn hỏi là dùng cái nào là tốt nhất 


Như thế nào là "tốt" ?

kegiaumat055 wrote:
Chẳng lẽ hvaonline.net không có ai là nhân tài về ASM sao.Có một câu hỏi cỏn con của em cũng không trả lời đựoc 


Phải là nhân tài trong HVA này mới có thể trả lời được câu hỏi này !! Vậy thì HVA không có "nhân tài" rồi


Live, fight, work and study
[Up] [Print Copy]
  [Question]   Re: được viết bằng ASm nhưng sao nó lại khác nhau 04/12/2007 18:49:14 (+0700) | #14 | 101856
[Avatar]
_BlacK_EyE_
Member

[Minus]    0    [Plus]
Joined: 04/12/2007 05:47:44
Messages: 36
Offline
[Profile] [PM] [Yahoo!] [ICQ]
Cần phải nói ngay là : nên dùng cái thứ nhất.
Lý do: dung lượng rất khác nhau. Nếu bạn dịch thành công 2 đoạn code trên thì sẽ nhận được 2 chương trình khác nhau.
Cái đầu tiên sẽ dịch ra một chương trình COM , là một DOS-Application ( giống như NC vậy ). Còn cái thứ hai sẽ tạo ra một file EXE cho window. Và bạn hãy so sánh dung lượng của cả hai sẽ thấy ngay. Thân.
[Up] [Print Copy]
  [Question]   được viết bằng ASm nhưng sao nó lại khác nhau 05/12/2007 07:01:16 (+0700) | #15 | 101980
mfeng
Researcher

Joined: 29/10/2004 15:16:29
Messages: 243
Offline
[Profile] [PM]

kegiaumat055 wrote:
Anh ơi cho em hỏi 2 chương trình Hello.asm này đều được viết bằng ASm nhưng sao nó lại khác nhau.Anh có thể giải thích được không và chọn cách viết nào là tốt nhất

Đây là hello.asm thứ nhất:
Code:
Code SEGMENT
ASSUME CS:Code,DS:Code
ORG 100h
Begin
MOV AH,09h
MOV DX,Offset String
Int 20h
String DB ' hello,how are you ? $ '
Code Ends
END Begin

Đây là hello.asm thứ hai:
Code:
.model small
.stack 100h
.data
s DB “hello,how are you ? $” ; khai báo xâu kí tự cần in
.code
mov AX,@data ; lấy địa chỉ data segment ghi vào DS
mov DS,AX ; Vì model small, đây cũng là địa chỉ
; segment của xâu s

; xuất chuỗi
mov DX, OFFSET s ; lấy địa chỉ offset ghi vào DX
mov AH , 9
int 21h ; gọi hàm 9, ngắt 21h để in

mov AH, 4Ch ; Thoát khỏi chương trình
int 21h 
end

 


Khác nhau về cấu trúc của hai đoạn code trên vì chúng sử dụng các mô hình bộ nhớ khác nhau:

- Đoạn code 1 dùng mô hình tiny, cả code & data thuộc một segment (64KB). Mô hình này dịch ra được file .COM trong DOS. Mã sinh ra của file COM thường nhỏ, do không cần exe header như file EXE.
- Đoạn code 2 dùng mô hình small, code & data riêng ở 2 segment khác nhau. Mô hình này dịch ra file exe.


Chú ý là chương trình dùng mô hình tiny bị giới hạn bởi kích thước (64KB), nên thường sử dụng khi viết chương trình nhỏ. Mô hình thứ 2 cho phép viết chương trình kích thước lớn hơn. Cả hai đoạn code trên đều viết cho assembly compiler trên DOS (hoặc DOS ảo), không thể sinh ra file exe thực sự chạy trên WIndows. Muốn viết chương trình bằng asm for Win, cần phải dùng Asm compiler cho Windows. cấu trúc file code Asm viết trên Win về cơ bản khác trên DOS.

PS: Đoạn code thứ nhất quên lời gọi Int 21h để in ra chuỗi ký tự smilie
[Up] [Print Copy]
[digg] [delicious] [google] [yahoo] [technorati] [reddit] [stumbleupon]
Go to: 
 Users currently in here 
1 Anonymous

Powered by JForum - Extended by HVAOnline
 hvaonline.net  |  hvaforum.net  |  hvazone.net  |  hvanews.net  |  vnhacker.org
1999 - 2013 © v2012|0504|218|