[Programming] Xin giúp đỡ asm trong 8086. |
29/02/2008 02:10:54 (+0700) | #1 | 117127 |
|
johan_tran
Member
|
0 |
|
|
Joined: 16/05/2007 12:54:02
Messages: 98
Location: Hải Phòng
Offline
|
|
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. |
|
|
|
|
[Question] Xin giúp đỡ asm trong 8086. |
29/02/2008 03:29:30 (+0700) | #2 | 117140 |
|
Z0rr0
Q+WRtaW5pc3RyYXRvc+g
|
Joined: 14/08/2002 12:52:01
Messages: 1323
Location: Underground
Offline
|
|
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 |
|
|
|
[Question] Re: Xin giúp đỡ asm trong 8086. |
29/02/2008 05:53:29 (+0700) | #3 | 117161 |
|
johan_tran
Member
|
0 |
|
|
Joined: 16/05/2007 12:54:02
Messages: 98
Location: Hải Phòng
Offline
|
|
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.
|
|
|
|
|
[Question] Re: Xin giúp đỡ asm trong 8086. |
29/02/2008 08:30:29 (+0700) | #4 | 117186 |
|
Z0rr0
Q+WRtaW5pc3RyYXRvc+g
|
Joined: 14/08/2002 12:52:01
Messages: 1323
Location: Underground
Offline
|
|
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 |
|
|
|
[Question] Re: Xin giúp đỡ asm trong 8086. |
29/02/2008 12:33:22 (+0700) | #5 | 117228 |
|
johan_tran
Member
|
0 |
|
|
Joined: 16/05/2007 12:54:02
Messages: 98
Location: Hải Phòng
Offline
|
|
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 )
; 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. |
|
|
|
|
[Question] Re: Xin giúp đỡ asm trong 8086. |
19/03/2008 09:35:21 (+0700) | #6 | 120068 |
|
computerline
Member
|
0 |
|
|
Joined: 30/03/2007 13:46:50
Messages: 144
Offline
|
|
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 |
|
|
|
[Question] Re: Xin giúp đỡ asm trong 8086. |
22/04/2008 22:11:24 (+0700) | #7 | 126811 |
tinnis
Member
|
0 |
|
|
Joined: 13/04/2008 12:54:08
Messages: 1
Offline
|
|
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.. |
|
|
|
|
[Question] Re: Xin giúp đỡ asm trong 8086. |
23/04/2008 01:19:22 (+0700) | #8 | 126848 |
facialz
Elite Member
|
0 |
|
|
Joined: 20/07/2004 03:48:17
Messages: 197
Location: HoChiMinh city
Offline
|
|
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 |
|
|
|
|
[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
|
|
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 |
|
|
|
|
[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
|
|
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 |
|
|
|
|
[Question] Re: Xin giúp đỡ asm trong 8086. |
24/04/2008 04:38:24 (+0700) | #11 | 127134 |
|
computerline
Member
|
0 |
|
|
Joined: 30/03/2007 13:46:50
Messages: 144
Offline
|
|
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 |
|
|