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 Xin giúp đỡ asm trong 8086.  XML
  [Programming]   Xin giúp đỡ asm trong 8086. 29/02/2008 02:10:54 (+0700) | #1 | 117127
[Avatar]
johan_tran
Member

[Minus]    0    [Plus]
Joined: 16/05/2007 12:54:02
Messages: 98
Location: Hải Phòng
Offline
[Profile] [PM] [WWW] [Yahoo!]
Em đang tự tìm tài liệu để học asm nên rất lúng túng vì đọc bị vấp hơn nữa cũng không biết hỏi ai mong các anh giải thích giúp.
Em xin đưa ra một ví dụ:
Code:
.model small
.stack 100h
.data
hello db 'Hello Johan',0dh,0ah,'$'

.code
main  proc
      mov    ax,@data
      mov    ds,ax

      mov    ah,9
      mov    dx,offset hello
      int    21h

      mov    ax,4C00h
      int    21h
main  endp
end   main

Với đoạn code trên có những vấn đề sau em chưa hiểu:
1- .STACK 100h ; ngăn xếp này lằm ở chỗ nào ạ
2- hello db 'hello johan', 0dh,0ah,'$' ; 0dh và 0ah có ý nghĩa gì ạ.
3- MOV AX,@data ; theo như sách thì lệnh này đưa dữ liệu trong phần .data ở trên vào AX, nhưng AX chỉ có 2 bytes thì để như thế nào ạ.
4- MOV AH,9 ; tại sao lại phải là AH mà không phải AL, và tại sao phải đưa vào AX chứ không phải thanh khác.

Xin cảm ơn.
[Up] [Print Copy]
  [Question]   Xin giúp đỡ asm trong 8086. 29/02/2008 03:29:30 (+0700) | #2 | 117140
[Avatar]
Z0rr0
Q+WRtaW5pc3RyYXRvc+g

Joined: 14/08/2002 12:52:01
Messages: 1323
Location: Underground
Offline
[Profile] [PM] [WWW] [Yahoo!]

johan_tran wrote:
Em đang tự tìm tài liệu để học asm nên rất lúng túng vì đọc bị vấp hơn nữa cũng không biết hỏi ai mong các anh giải thích giúp.
Em xin đưa ra một ví dụ:
Code:
...

Với đoạn code trên có những vấn đề sau em chưa hiểu:
1- .STACK 100h ; ngăn xếp này lằm ở chỗ nào ạ
2- hello db 'hello johan', 0dh,0ah,'$' ; 0dh và 0ah có ý nghĩa gì ạ.
3- MOV AX,@data ; theo như sách thì lệnh này đưa dữ liệu trong phần .data ở trên vào AX, nhưng AX chỉ có 2 bytes thì để như thế nào ạ.
4- MOV AH,9 ; tại sao lại phải là AH mà không phải AL, và tại sao phải đưa vào AX chứ không phải thanh khác.

Xin cảm ơn. 


1 - ngăn xếp được bố trí ngay tại vị trí khai báo khi toàn bộ binary được tải lên bộ nhớ, theo hướng trừ trên xuống với kích thước 100 hexa (256 bytes)
2 - 0dh = 13, 0ah = 10, là 2 giá trị đại diện kí tự xuống dòng. Chuỗi này khi xuất ra màn hình sẽ tự động đưa con nháy xuống dòng
3 - Mov AX,@data trường hợp này AX sẽ chứa địa chỉ đầu của vùng data; lệnh này kết hợp với mov ds, ax để chỉ đến vùng data segment
4 - Lệnh gọi đến int 21h yêu cầu chuẩn bị dữ liệu cho AH, DS, DX, ... nếu không sử dụng các ngắt như int 21 thì chứa 1 byte trên ở phần nào cũng được
Hibernating
[Up] [Print Copy]
  [Question]   Re: Xin giúp đỡ asm trong 8086. 29/02/2008 05:53:29 (+0700) | #3 | 117161
[Avatar]
johan_tran
Member

[Minus]    0    [Plus]
Joined: 16/05/2007 12:54:02
Messages: 98
Location: Hải Phòng
Offline
[Profile] [PM] [WWW] [Yahoo!]

Z0rro wrote:
1 - ngăn xếp được bố trí ngay tại vị trí khai báo khi toàn bộ binary được tải lên bộ nhớ, theo hướng trừ trên xuống với kích thước 100 hexa (256 bytes)  

Vậy là ngăn xếp này nằm ở RAM phải không anh? Và các đôi bytes chứa các ký tự trên được đặt sát nhau liên tục hả anh?

Z0rro wrote:
4 - Lệnh gọi đến int 21h yêu cầu chuẩn bị dữ liệu cho AH, DS, DX, ... nếu không sử dụng các ngắt như int 21 thì chứa 1 byte trên ở phần nào cũng được 

Đấy anh nói rõ ràng thế có hơn không, em chưa đọc thấy ở đâu viết ngắt 21 yêu cầu chuẩn bị dữ liệu ở các thanh ghi trên. Em xin tổng kết lại quá trình như sau anh xem có đúng không.

.stack 100h ; chuẩn bị một dãy các ô nhớ liền nhau trong RAM với dung lượng 256 byte.

.data
hello db 'Hello Johan',0dh,0ah,'$' ; ghi liên tục các ký tự trên nên stack

mov ax,@data
mov ds,ax ; ghi địa chỉ segment( địa chỉ đầu tiên của ô nhớ) của dãy ký tự trên vào DS.

mov ah,9 ; ghi số 9 vào thanh AL
mov dx,offset hello ; ghi vào DX địa chỉ offset của vùng nhớ dãy ký tự trên.
int 21h ; Lúc này DS đã có địa chỉ segment và DX có địa chỉ offset của dãy ký tự và ngắt gọi chương trình con in dãy đó ra màn hình.

[Up] [Print Copy]
  [Question]   Re: Xin giúp đỡ asm trong 8086. 29/02/2008 08:30:29 (+0700) | #4 | 117186
[Avatar]
Z0rr0
Q+WRtaW5pc3RyYXRvc+g

Joined: 14/08/2002 12:52:01
Messages: 1323
Location: Underground
Offline
[Profile] [PM] [WWW] [Yahoo!]
Vậy là ngăn xếp này nằm ở RAM phải không anh? Và các đôi bytes chứa các ký tự trên được đặt sát nhau liên tục hả anh?
 

Ngăn xếp ở trên nằm cùng vùng nhớ với dữ liệu và mã thực thi của chương trình, trên bộ nhớ động do hệ điều hành quản lý.

Đấy anh nói rõ ràng thế có hơn không, em chưa đọc thấy ở đâu viết ngắt 21 yêu cầu chuẩn bị dữ liệu ở các thanh ghi trên. Em xin tổng kết lại quá trình như sau anh xem có đúng không. 

Em xem chi tiết các yêu cầu của ngắt 21h tại đây: http://lrs.uni-passau.de/support/doc/interrupt-57/INT-21.HTM
Trong bài trên, để xuất chuỗi cần chuẩn bị AH=9h (hexadecimal), ko phải 9 decimal

.stack 100h ; chuẩn bị một dãy các ô nhớ liền nhau trong RAM với dung lượng 256KB. 

256bytes, không phải KB

.data
hello db 'Hello Johan',0dh,0ah,'$' ; ghi liên tục các ký tự trên nên stack 

Định nghĩa vùng data segment chứ có ghi cái gì đâu. Vùng data này nằm sau 256bytes của stack ở trên.

mov ah,9 ; ghi số 9 vào thanh AL 

mov ah, 9h mới đúng
Hibernating
[Up] [Print Copy]
  [Question]   Re: Xin giúp đỡ asm trong 8086. 29/02/2008 12:33:22 (+0700) | #5 | 117228
[Avatar]
johan_tran
Member

[Minus]    0    [Plus]
Joined: 16/05/2007 12:54:02
Messages: 98
Location: Hải Phòng
Offline
[Profile] [PM] [WWW] [Yahoo!]

Z0rro wrote:
Em xem chi tiết các yêu cầu của ngắt 21h tại đây: http://lrs.uni-passau.de/support/doc/interrupt-57/INT-21.HTM  

Cảm ơn anh link rất tuyệt.

Anh ơi vậy đoạn string trên được ghi vào bộ nhớ động khi nào ạ, có phải khi đọc đến .data không. Nếu vậy thì trong đoạn code trên không dùng đến stack rồi. Vậy thì em code lại như sau:
Code:
.model small

.data
hello db 'Hello Johan',0dh,0ah,'$'

.code

      mov   ax,seg hello
      mov   ds,ax
      mov   dx,offset hello

      mov   ah,09h 
      int   21h

      mov    ax,4C00h
      int    21h

end

; ghi địa chỉ segment của string vào ax
; ghi nội dung của ax vào ds ( đây là yêu cầu của function 9h của ngắt 21 chứ em cũng chưa biết vì sao lại phải ghi vào ds. Em thử ghi vào ES, CS và SS thì nó đưa chữ hello johan ra giữa màn hình smilie)
; ghi địa chỉ offset của string vào dx
; gọi function 9h ngắt 21 in ra màn hình.
Có điều em chưa hiểu là cặp segment:offset trên chỉ là địa chỉ của một byte đầu tiên trong string thì làm thế nào mà nó lại in ra được cả chuỗi vậy anh.
[Up] [Print Copy]
  [Question]   Re: Xin giúp đỡ asm trong 8086. 19/03/2008 09:35:21 (+0700) | #6 | 120068
[Avatar]
computerline
Member

[Minus]    0    [Plus]
Joined: 30/03/2007 13:46:50
Messages: 144
Offline
[Profile] [PM] [Email] [WWW] [Yahoo!]
Mình nghĩ là vẫn phải sử dụng .stack 100h vì theo mình được biết, khi biên dịch tập tin nguồn này sang tập tin thực thi dạng .com thì hệ điều hành sẽ sử dụng 100h bytes đầu tiên vào việc chứa các tham số và các lệnh hệ thống. Còn dữ liệu của chương trình sẽ được chứa sau vùng nhớ này.
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: Xin giúp đỡ asm trong 8086. 22/04/2008 22:11:24 (+0700) | #7 | 126811
tinnis
Member

[Minus]    0    [Plus]
Joined: 13/04/2008 12:54:08
Messages: 1
Offline
[Profile] [PM]
Em cũng đang học lập trình con 8086 này,tuy nhiên vẫn kô hiểu lắm về 1 số lệnh của nó,mấy anh chỉ em:

Code:
mov ah,01h
     int 21h
     mov bl,al

     mov dl,bl
     mov ah,02h
     int 21h



Đoạn mã này là để nhập và in ra trên màn hình 1 ký tự nhưng em kô hiểu tại sao lại phải mov al vào bl rồi mới mov bl vào dl,nếu em mov trực tiếp al vào bl có đc hay kô??

Còn nữa,mấy anh có thể cho em xin bảng các lệnh của 8086 (Lệnh để làm gì,sau lệnh đó thì nó lưu vào đâu,cách xài lệnh) hay mấy anh cho em xin nick Y!M để em được thỉnh giáo..Em cảm ơn mấy anh..
[Up] [Print Copy]
  [Question]   Re: Xin giúp đỡ asm trong 8086. 23/04/2008 01:19:22 (+0700) | #8 | 126848
facialz
Elite Member

[Minus]    0    [Plus]
Joined: 20/07/2004 03:48:17
Messages: 197
Location: HoChiMinh city
Offline
[Profile] [PM]

tinnis wrote:
Em cũng đang học lập trình con 8086 này,tuy nhiên vẫn kô hiểu lắm về 1 số lệnh của nó,mấy anh chỉ em:

Code:
mov ah,01h
     int 21h
     mov bl,al

     mov dl,bl
     mov ah,02h
     int 21h



Đoạn mã này là để nhập và in ra trên màn hình 1 ký tự nhưng em kô hiểu tại sao lại phải mov al vào bl rồi mới mov bl vào dl,nếu em mov trực tiếp al vào bl có đc hay kô?? 

- Tôi cũng không hiểu tại sao.
- Được.

tinnis wrote:
Còn nữa,mấy anh có thể cho em xin bảng các lệnh của 8086 (Lệnh để làm gì,sau lệnh đó thì nó lưu vào đâu,cách xài lệnh) hay mấy anh cho em xin nick Y!M để em được thỉnh giáo..Em cảm ơn mấy anh.. 


http://www.emu8086.com/assembly_language_tutorial_assembler_reference/8086_instruction_set.html
[Up] [Print Copy]
  [Question]   Re: Xin giúp đỡ asm trong 8086. 23/04/2008 23:19:08 (+0700) | #9 | 127037
Mr.Khoai
Moderator

Joined: 27/06/2006 01:55:07
Messages: 954
Offline
[Profile] [PM]

johan_tran wrote:
.data
hello db 'Hello Johan',0dh,0ah,'$' ; ghi liên tục các ký tự trên nên stack  

khoai không có biết lập trình, nhưng cái này không phải là ghi dữ liệu lên stack mà là khai báo một vùng heap chứa chuỗi trên, với tên "biến" trỏ đến vùng nhớ đó là hello.

Sau khi Code:
mov    ax, @.data
mov    ds, ax
mov    ah,9               ; Cái này không ảnh hưởng đến ds:dx
mov    dx,offset hello

thì ds:dx sẽ chứa địa chỉ của hello (segment:offset là data:[offset hello]). ds:dx sẽ được dùng trong int 21h để biết nên bắt đầu in ra màn hình từ đâu.

khoai

PS: Vẫn không hiểu sao lúc đầu không mov ds, @.data smilie
[Up] [Print Copy]
  [Question]   Re: Xin giúp đỡ asm trong 8086. 23/04/2008 23:49:46 (+0700) | #10 | 127047
mfeng
Researcher

Joined: 29/10/2004 15:16:29
Messages: 243
Offline
[Profile] [PM]
Code:
mov    ax, @.data
 mov    ds, ax


x86 không cho phép truy cập cả thanh ghi đoạn và địa chỉ bộ nhớ trong cùng một lệnh, vì vậy phải lấy thanh ghi ax làm trung gian khi khởi tạo giá trị DS tới địa chỉ segment của vùng nhớ .data
[Up] [Print Copy]
  [Question]   Re: Xin giúp đỡ asm trong 8086. 24/04/2008 04:38:24 (+0700) | #11 | 127134
[Avatar]
computerline
Member

[Minus]    0    [Plus]
Joined: 30/03/2007 13:46:50
Messages: 144
Offline
[Profile] [PM] [Email] [WWW] [Yahoo!]

tinnis wrote:
Em cũng đang học lập trình con 8086 này,tuy nhiên vẫn kô hiểu lắm về 1 số lệnh của nó,mấy anh chỉ em:

Code:
mov ah,01h
     int 21h
     mov bl,al

     mov dl,bl
     mov ah,02h
     int 21h



Đoạn mã này là để nhập và in ra trên màn hình 1 ký tự nhưng em kô hiểu tại sao lại phải mov al vào bl rồi mới mov bl vào dl,nếu em mov trực tiếp al vào bl có đc hay kô??

Còn nữa,mấy anh có thể cho em xin bảng các lệnh của 8086 (Lệnh để làm gì,sau lệnh đó thì nó lưu vào đâu,cách xài lệnh) hay mấy anh cho em xin nick Y!M để em được thỉnh giáo..Em cảm ơn mấy anh.. 


Theo mình thì bạn hoàn toàn có thể mov thẳng al vào dl. Vì 2 thanh ghi al và dl đều là thanh ghi 8 bit nên việc ghi trực tiếp qua như vậy theo mình cũng không có gì sai cả. Còn về bảng các Instruction của ASM thì bạn có thể tham khảo tại địa chỉ :
http://fatih.kesgin.org/mul06/intel/
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]
  [Programming]   Xin giúp đỡ asm trong 8086. 29/10/2009 04:54:26 (+0700) | #12 | 196924
seven_007
Member

[Minus]    0    [Plus]
Joined: 11/10/2007 23:00:07
Messages: 15
Offline
[Profile] [PM]
mình đang viết chương trình xuất đồng hồ trong hệ thống ra giữa màn hình trong asm nhưng mình chỉ mới lấy được đồng hồ trong hệ thống. có ai có cách nào giúp mình xuất nó ra giữa màn hình không
[Up] [Print Copy]
  [Programming]   Xin giúp đỡ asm trong 8086. 29/10/2009 04:55:41 (+0700) | #13 | 196925
seven_007
Member

[Minus]    0    [Plus]
Joined: 11/10/2007 23:00:07
Messages: 15
Offline
[Profile] [PM]

seven_007 wrote:
mình đang viết chương trình xuất đồng hồ trong hệ thống ra giữa màn hình trong asm nhưng mình chỉ mới lấy được đồng hồ trong hệ thống. có ai có cách nào giúp mình xuất nó ra giữa màn hình không vậy.cám ơn nhiều 
[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|