hoi dap 8086

Màu nền
Font chữ
Font size
Chiều cao dòng

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.

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

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.

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.

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.

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.

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..

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

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

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

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/

Bạn đang đọc truyện trên: Truyen2U.Pro

#0105