PDA

View Full Version : Giúp tôi (assembly)



Panda1982
01-04-2004, 18:22
Mình gặp một rắc rối mới trong khi học Assembly có ai có thể giúp mình ?
-Cho mình thuật toán cho phép user nhập 4 kí tự trên 1 hàng và dịch từng kí tự đó thành số nhị phân (Cách dịch thành số nhị phân thì mình biết rồi! )
- Không hiểu lệnh Org là gì --> có thể giúp mình hiểu nó có chức năng và thuật toán thế nào không ?

Mình xin cảm ơn

bete
02-04-2004, 03:15
Gửi Panda1982: bạn có thể đọc 1 kí tự từ bàn phím rồi phải 0 ?
Bạn có thể dịch 1 kí tự thành số nhị phân tương ứng rồi phải 0 ?
Tui đoán bạn kẹt ở chỗ phải làm 2 vòng lặp lồng nhau mà chỉ có 1 biến đếm CX ?
Nếu vậy thì tui thấy có ít nhứt 2 cách . Bạn xài CX cho 1 vòng lặp & xài thanh ghi khác cho vòng lặp kia . Cách khác là bạn vẫn xài CX cho 2 vòng lặp (như vậy thì lệnh jump của bạn sẽ dễ hơn) nhưng bạn phải PUSH & POP CX : bạn đặt CX = 4 cho vòng lặp ngòai; tại đầu vòng lặp trong bạn PUSH CX (để lưu vô stack); đặt CX = 8; dịch kí tự thành số nhị phân; POP CX (phục hồi CX từ stack); rồi làm lệnh jump cho vòng lặp ngoài

bete
02-04-2004, 05:18
Gửi Panda1982: Chỉ thị dịch ORG : báo cho trình biên dịch hợp ngữ biết phải đặt lệnh hoặc dữ liệu đầu tiên kết tiếp ở 1 offset cho trước nào đó

Thường có 2 công dụng:

1) Để thi hành 1 chương trình ".COM", DOS nạp (load) nó vào bộ nhớ (vào 1 segment); khởi tạo vùng PSP ở 256 bytes đầu tiên của segment, và gán 100H vô con trỏ lệnh IP (Instruction Pointer) . Nhu vậy khi mình viết mã cho ".COM", nên dùng ORG (ORG 100H thì phải ?) để báo cho trình biên dịch hợp ngữ là đặt lệnh hợp ngữ kế tiếp ở 100H (tính từ đầu của segment) => khi được thi hành sẽ 0 bị đè bởi PSP & IP sẽ chỉ tới đúng lệnh đầu tiên của chương trình

2) Giả sử mình muốn truy xuất trực tiếp 1 địa chỉ tuyệt đối nào đó trong bộ nhớ ; ví dụ offset 200H của segment B000H chẳng hạn thì mình đặt địa chỉ tuyệt đối của segment tại B000H (qua chỉ thị SEG hay SEGMENT gì đó thì phải, tui 0 nhớ rõ) và đặt offset tại 200H bằng:

ORG 200H
du_lieu db ...........

Có sai sót gì mong các bạn chỉ giúp (xin cám ơn trước)

Panda1982
02-04-2004, 10:44
Cảm ơn Bete . Mình sẽ thử cách làm của bạn . Nếu có gì không hiểu mong bạn lại giúp mình .
Mình xin cảm ơn .

Panda1982
06-04-2004, 19:51
Gửi Bete
Mình hôm trước vội quá chỉ kịp tải trang về chưa kịp đọc nội dung của bạn viết .
Chỗ mình mắc là đọc 4 kí tự trên một hàng cơ . Nếu mình dùng cách đọc một kí tự thì phải dùng tới 4 lần Int21h . Hơn nữa sau mỗi lần như vậy thì nội dung trong AL lại bị thay đổi . Nếu mình lưu lại vào 2 thanh ghi khác (byte thấp và byte cao) thì sau đó kiểm tra việc nhập đúng rất phức tạp . Bạn có thể chỉ cho mình cụ thể cách làm đề bài này không ? (Mình chưa học gì đến ngăn xếp đâu)
- Chỉ cho user nhập vào 1 số hex tối đa là 4 kí tự (trên 1 dòng)
- Sau đó kiểm tra xem nhập có đúng kiểu số hex không ? Sai thì bắt nhập lại, Đúng thì dịch số đó ra nhị phân .
MÌnh xin cảm ơn !

bete
09-04-2004, 06:50
Gửi Panda1982: bạn có thể khai báo 1 mảng 4 bytes (hình như cú pháp đại khái là "mang db 4 ?" thì phải). Mỗi lần bạn đọc kí tự xong là bỏ vô mảng ngay

Panda1982
11-04-2004, 17:10
Gửi Bete . Mình mới học Assembly nên đã học mảng gì đâu . Mình đang học quyển Lập trình hợp ngữ (Assembly) và máy vi tính IBM-PC. Và mới học được có vài chương đầu làm quen. Có nhiều thứ mình không rõ lắm . Phiền bạn có thể viết rõ rõ một chút cho mình được không ?

Cảm ơn bạn rất nhiều

bete
13-04-2004, 17:12
Gửi Panda1982:

Bạn có thể thử khai báo mảng 4 byte, 0 cần khởi tạo:
mang db 4 dup (?)

Để truy xuất phần tử đầu tiên của mảng:

lea bx, mang ;base of array
mov si,0 ;index into array
add ah,[bx][si] ;ah <- mang[0] (phần tử đầu tiên có chỉ số là 0 chứ 0 phải 1)

DiemTua
22-04-2004, 05:21
bản chất các kí tự được gõ trên bàn phìm được lưu vào thanh ghi là đã ở dạng mã nhị phân rồi. vần để chỉ là thao tác để lấy nó ra thôi <=> quá tầm thường vậy mà bạn vẫn phải hỏi à. Bạn nên đọc qua cuốn bài tập ASM của Đặng Thành Phu đi

ntquan
18-05-2004, 00:48
Gửi bạn Panda,
đầu tiên bạn dùng ngắt:
(***)
mov ah,0ah
int 21h
để nhập một chuổi ký tự ( 4 ký tự là chuyện nhỏ )
địa chỉ chuổi ký tự sau khi được nhập sẽ có trong DX
khai báo mảng như bạn bete đã làm ( mảng của bạn bete hơi nhỏ, tuỳ ý )
mov DX, offser mang ( dòng nay bỏ ở ***)

mov bx,2
mov al, mang[bx] // lấy ra một ký tự, lặp lại cho đến hết
mov dl,al
Đến đây bạn chỉ việc biến ký tự đó thành nhị phân thôi.

Panda1982
18-05-2004, 02:37
Mình xin cảm ơn các bạn đã nhiệt tình giúp đỡ đặc biệt là Bete. Xin lỗi mình không thể phản hồi thường xuyên vì mình bận quá , mong các bạn thông cảm .