PDA

View Full Version : giúp với



antín
18-03-2004, 00:24
Tôi đang viết chương trỉnh mã hóa dư liệu ( bằng thụât toán DES)
nhưng sử lý từng bit khó quá. Có ai thạo giúp với.

bete
18-03-2004, 14:18
0 rõ antín muốn "xử lý từng bit" ra sao ?

Nhưng thường thì:

x AND 0 -> 0 : có thể dùng để CLEAR (xóa) bits
x AND 1 -> x : có thể dùng để CHECK/KEEP (kiểm / giữ nguyên) bits
x AND x -> x

x OR 0 -> x : có thể dùng để CHECK/KEEP (kiểm / giữ nguyên) bits (nhưng thường
là dùng (x AND 1) rồi)
x OR 1 -> 1 : có thể dùng để SET (lập) bits
x OR x -> x

x XOR 0 -> x : có thể dùng để CHECK/KEEP (kiểm / giữ nguyên) bits (nhưng thường
là dùng (x AND 1) rồi)
x XOR 1 -> NOT x : có thể dùng để INVERSE (đảo) bits
x XOR x -> 0

Tóm lại: giả sử mình có 1 byte dữ liệu X; đánh số các bit: 0 -> 7 (1 byte)

1) Để xóa (CLEAR) bit i & giữ nguyên bit j của byte dữ liệu X -> tạo 1 mask (mặt nạ ?) thỏa: bit i của mask là 0 & bit j của mask là 1 (tương tự cho các bits còn lại)
==> X = X AND mask -> xóa bit i & giữ nguyên bit j của byte dữ liệu X

2) Để lập (SET) bit i & giữ nguyên bit j của byte dữ liệu X -> tạo 1 mask (mặt nạ ?) thỏa: bit i của mask là 1 & bit j của mask là 0 (tương tự cho các bits còn lại)
==> X = X OR mask -> lập bit i & giữ nguyên bit j của byte dữ liệu X

3) Để đảo (INVERSE) bit i & giữ nguyên bit j của byte dữ liệu X -> tạo 1 mask (mặt nạ ?) thỏa: bit i của mask là 1 & bit j của mask là 0 (tương tự cho các bits còn lại)
==> X = X XOR mask -> đảo bit i & giữ nguyên bit j của byte dữ liệu X

4) Để kiểm (CHECK) / lấy giá trị ở bit i của byte dữ liệu X -> tạo 1 mask (mặt nạ ?) thỏa: bit i của mask là 1 & các bits còn lại của mask là 0
==> Y = X AND mask -> Y là 0 nếu bit i của byte dữ liệu X là 0; Y khác 0 nếu bit i của byte dữ liệu X khác 0

Lưu ý: bạn có thể lập / xóa / đảo nhiều hơn 1 bit (2, 3, 4...) chỉ bằng 1 lần AND / OR / XOR . Nhưng để kiểm / lấy giá trị thì làm từng bit.
Nếu bạn làm cho 2 bit j & bit j: tạo 1 mask (mặt nạ ?) thỏa: bit i & bit j của mask là 1 & các bits còn lại của mask là 0
==> Y = X AND mask -> Y là 0 nếu bit i & bit j của byte dữ liệu X đều là 0; Y khác 0 nếu bit i HOẶC bit j của byte dữ liệu X khác 0 (nếu bit i là 1 còn bit j là 0 hoặc ngược lại thì Y vẫn khác 0) => mình biết được là cả 2 bit i & bit j đều là 0 (hay là có ít nhứt 1 bit là 1)

jiSh@n
18-03-2004, 23:44
Còn SHL với SHR sao bete ko nói luôn thể? lol

bete
19-03-2004, 00:10
SHL thường dùng để nhân đôi
SHR thường dùng để chia đôi

==> tui 0 biết antín "xử lý bit" như nào => tui đoán là lập / xóa / đảo / kiểm giá trị của các bit thôi nên 0 nhắc tới (ở mức hợp ngữ - assembly language - thì có thể dùng SHL & SHR để kiểm giá trị của bit đầu / bit cuối => nhưng mình có thể xài AND thay vào đó rồi)

0 biết SHL & SHR còn có thể xài cho ứng dụng nào khác 0 jiSh hả ?

songok
19-03-2004, 01:59
Xin man phep dua ra y kien cua minh nhe : ban co the dung toan tu XOR de ma hoa du lieu, duoc khong ?

bete
19-03-2004, 18:45
ý của songok là cho byte dữ liệu X, mình lập mask M và lưu trữ Y = X XOR M
Tới khi giải mã thì làm Z = Y XOR M = X ?

Cái này có lẻ thuộc về phần đảo bit ?

bete
20-03-2004, 22:51
Để trả lời cho ccâu hỏI của antín:

1) Để xóa (CLEAR) bit i & giữ nguyên bit j của byte dữ liệu X -> tạo 1 mask (mặt nạ ?) thỏa: bit i của mask là 0 & bit j của mask là 1 (tương tự cho các bits còn lại)
==> X = X AND mask -> xóa bit i & giữ nguyên bit j của byte dữ liệu X

hàm ClearBit
input1: byte dữ liệu X
input2: số nguyên i (mình muốn xóa bit thứ i => i: 0->7)

khởi tạo mask (byte) M = 1 => bit 0 của M là 1, các bít còn lại là 0
M = (M shl i) => bit i của M là 1, các bít còn lại là 0
M = NOT M => bit i của M là 0, các bít còn lại là 1
trả về: Y = X AND M (bit i của Y là 0; bit j (j khác i) của Y = bit j của X)

Sử dụng: X = ClearBit(X, i);

2) Để lập (SET) bit i & giữ nguyên bit j của byte dữ liệu X -> tạo 1 mask (mặt nạ ?) thỏa: bit i của mask là 1 & bit j của mask là 0 (tương tự cho các bits còn lại)
==> X = X OR mask -> lập bit i & giữ nguyên bit j của byte dữ liệu X

hàm SetBit
input1: byte dữ liệu X
input2: số nguyên i (mình muốn lập bit thứ i => i: 0->7)

khởi tạo mask (byte) M = 1 => bit 0 của M là 1, các bít còn lại là 0
M = (M shl i) => bit i của M là 1, các bít còn lại là 0
trả về: Y = X OR M (bit i của Y là 1; bit j (j khác i) của Y = bit j của X)

Sử dụng: X = SetBit(X, i);

3) Để đảo (INVERSE) bit i & giữ nguyên bit j của byte dữ liệu X -> tạo 1 mask (mặt nạ ?) thỏa: bit i của mask là 1 & bit j của mask là 0 (tương tự cho các bits còn lại)
==> X = X XOR mask -> đảo bit i & giữ nguyên bit j của byte dữ liệu X

hàm InverseBit
input1: byte dữ liệu X
input2: số nguyên i (mình muốn đảo bit thứ i => i: 0->7)

khởi tạo mask (byte) M = 1 => bit 0 của M là 1, các bít còn lại là 0
M = (M shl i) => bit i của M là 1, các bít còn lại là 0
trả về: Y = X XOR M (bit i của Y là đảo bit i của X; bit j (j khác i) của Y = bit j của X)

Sử dụng: X = InverseBit(X, i);

4) Để kiểm (CHECK) / lấy giá trị ở bit i của byte dữ liệu X -> tạo 1 mask (mặt nạ ?) thỏa: bit i của mask là 1 & các bits còn lại của mask là 0
==> Y = X AND mask -> Y là 0 nếu bit i của byte dữ liệu X là 0; Y khác 0 nếu bit i của byte dữ liệu X khác 0

hàm GetBit
input1: byte dữ liệu X
input2: số nguyên i (mình muốn check bit thứ i => i: 0->7)

khởi tạo mask (byte) M = 1 => bit 0 của M là 1, các bít còn lại là 0
M = (M shl i) => bit i của M là 1, các bít còn lại là 0
trả về Y = X AND M (bit i của Y là bit i của X; bit j (j khác i) của Y là 0)

Sử dụng: Z = GetBit(X, i);

5) Để hoán vị bit i & bit j của byte dữ liệu X:

Nếu làm dài dòng (nhưng dễ hiểu):

Hàm SwapBit
input1: byte dữ liệu X
input2: số nguyên i (mình muốn đổi bit thứ i)
input2: số nguyên j (mình muốn đổi bit thứ j)

Y = X;
Y1 = GetBit(X, i) => Y1 là 0 nếu bit i của X là 0; Y1 khác 0 nếu bit i của X là 1;
Y2 = GetBit(X, j) => Y2 là 0 nếu bit j của X là 0; Y2 khác 0 nếu bit j của X là 1;
nếu Y1 là 0 => Y=ClearBit(Y,j); nếu Y1 khác 0 => Y=SetBit(Y,j);
nếu Y2 là 0 => Y=ClearBit(Y,i); nếu Y2 khác 0 => Y=SetBit(Y,i);
trả về Y

Sử dụng: X = SwapBit(X, i, j);

Panda1982
21-03-2004, 01:21
Tôi đang học Assembly và đang viết chương trình đảo 1 kí tự thành số nhị phân . Tôi có dùng Shl (SHL Al,1) mà không hiểu sao khi biên dịch chương trình lại báo :
Expected : Instruction or directive

Ai biết giúp tôi với . Tôi xin cảm ợn
Ngoài cách kiểm tra giá trị của CF là JC và JNC thì còn cách nào khác khộng Nếu có mong bạn miểu tả cả cú pháp và chức năng .

songok
21-03-2004, 03:40
nhung neu ma hoa bang toan tu XOR thi nguoi ta se giai ma duoc neu nhu kien nhan thu het tat cac 255 ky tu

bete
21-03-2004, 05:07
songok nói đúng lắm => 0 rõ songok nói trong bài trước mã hóa bằng XOR là thế nào ?
Trường hợp để gây khó khăn cho người khác giải mã thì tui nghĩ có thể xài pasword là 1 chuỗi ký tự => xem như chuỗi của nhiều bytes => byte thứ 1 của dữ liệu được XOR với byte thứ 1 của pasword, byte thứ 2 của dữ liệu được XOR với byte thứ 2 của pasword, ..., byte thứ n của dữ liệu được XOR với byte thứ n của pasword, byte thứ n+1 của dữ liệu được XOR với byte thứ 1 của pasword, byte thứ n+2 của dữ liệu được XOR với byte thứ 1 của pasword, ....; có được 0 songok hả ?

bete
21-03-2004, 05:15
Tui đoán Pandal làm kiểu:

shift left byte dữ liệu
nếu cờ nhớ (carry flag) là 1 thì in ra 1; ngược lại in ra 0
lặp lại thêm 7 lần như vậy nữa

?

SHL AL, 1 thì tui 0 thấy 0 có gì sai cú pháp hết (cũng 0 nhớ rõ về hợp ngữ lắm) !
Kiểm cờ nhớ bằng JC hay JNC cũng thấy đúng luôn !
Penđal1982 nghĩ nó báo lỗi ở 1 trong 2 chỗ này ? => có thể cho biết Pendal1982 viết như thế nào (1 cách chính xác) 0 ?

Panda1982
21-03-2004, 17:03
Bete đoán đúng lắm . Đó là cách mà mình làm . Nhưng vừa rồi mình chẳng biết sửa chữa thế nào mà không còn gặp lỗi đó nữa (thành thật xin lỗi) . Bây giời thì mình lại gặp một lỗi khác : Chương trình mình đã viết xong nhưng không hiểu sai ở đâu mà chỉ khi nhập kí tự có số hex là số chẵn ( 'r' chẳng hạn ) thì nó chạy bình thường còn nếu nhập kí tự có số hex là số lẻ ( 'e ' ) thì nó in ra limit chữ số 0 .
Mong các bạn giúp mình với . Nếu bạn cần mình sẽ gửi cho bạn chương trình của mình . ( gửi vào địa chỉ nào thì tiện ?)

-Liệu có thể so sánh giá trị của các thanh ghi trực tiếp với 1 số nhị phân hoặc là 1 số hex , 1 giá trị decimal có được không ?
Chẳng hạn như :
CMP DL,1d
CMP DL,4Ch
CMP DL,0000 0001

Nếu không được mong chỉ giúp mình cách tiện lợi nhất để có thể so sánh .

Mình xin cảm ơn

antin
22-03-2004, 03:23
Thanks moi nguoi da giup do

bete
22-03-2004, 09:11
gửi Panda1982: bạn có thể gửi bài lên ngay diễn đàn, mọi người sẽ xem giúp

bete
22-03-2004, 10:03
Gửi Panda1982
-Liệu có thể so sánh giá trị của các thanh ghi trực tiếp với 1 số nhị phân hoặc là 1 số hex , 1 giá trị decimal có được không ?
Tui 0 nhớ rõ lắm (tui nghĩ là được -- để coi lại đã). Nếu cả 2 tóan hạng của CMP phải là thanh ghi (register) thì có thể cất (load) hằng số vô 1 thanh ghi khác rồi CMP 2 thanh ghi với nhau

jiSh@n
22-03-2004, 11:31
SHL thường dùng để nhân đôi
0 biết SHL & SHR còn có thể xài cho ứng dụng nào khác 0 jiSh hả ?
Hầu hết các ngôn ngữ LT đề có SHL và SHR. Ví dụ Pascal là shl, shr, C là >>, <<

Panda1982
23-03-2004, 04:51
Cảm ơn Bete nhiều lắm vì bạn đã tích cực giúp mình . Liệu bạn có thể giúp mình giải quyết lỗi chương trình chuyển kí tự sang nhị phân được không ? Nếu được thì minh gửi mã của mình vào đâu để bạn có thể xem . Mình viết dài lắm (nghĩ thế )
Mình không biết làm cách nào để gửi bài lên diễn đàn, giúp mình với .

bete
23-03-2004, 12:33
Gửi Panda1982: bạn có thể chọn "Trả lời nhanh" rồi "copy & paste" cái chương trình lên . Nếu bạn nghĩ chương trình dài quá -> 0 tiện thì bạn chọn "Go advanced" thay vì "Trả lời nhanh" -> sẽ có chỗ cho bạn "attach" cái chương trình (bạn nên đổi tên chương trình từ .ASM qua .txt khi attach)

Panda1982
24-03-2004, 03:25
;Chuong trinh hien thi ma nhi phan cua ki tu va dem so bit 1
.Model small
.Stack
.Data
Msg1 db 'Nhap 1 ki tu bat ki:$'
Msg2 db 'Ma nhi phan la:$'
Msg3 db 'So bit 1 la:$'
Crl db 13,10,'$'
.Code
Main Proc

;Khoi tao Ds
Mov Ax,@Data
Mov Ds,Ax

;Hien thi Msg1
Mov Ah,9
Lea Dx,Msg1
Int 21h

;Doc ki tu va cat vao Bl
Mov Ah,1
Int 21h
Mov Bl,Al

;Cach 1 dong
Mov Ah,9
Lea Dx,Crl
Int 21h

;Hien thi Msg2
Mov Ah,9
Lea Dx,Msg2
int 21h

;Hien thi tung bit_Hien thi 8 bit tu trai sang phai
Mov Cx,8
Mov Ah,2

Lap:

SHL Bl,1 ;Dua bit msb vao CF
JC Case1 ;CF=1?
JNC Case2 ;CF=0?

Case1:
Mov Dl,'1'
Int 21h
Add Bh,1
Loop Lap

Case2:
Mov Dl,'0'
Int 21h
Loop Lap

;Cach ra 1 dong
Mov Ah,9
Lea Dx,Crl
Int 21h

;DEM SO BIT 1
;In ra Msg3
Mov Ah,9
Lea Dx,Msg3
Int 21h

;In ra so bit 1
Mov Ah,2
Add Bh,30h
Mov Dl,Bh
Int 21h
;Tro ve Dos
Mov Ah,4ch
Int 21h

Main Endp
End Main

Panda1982
24-03-2004, 03:27
Chương trình này khi chạy với kí tự có mã ASCII dạng số hex chẵn thì không sao nhưng nếu với kí tự có số hex lẻ thì nó in ra limit số 0 . Bạn giúp mình tìm chỗ sai với . Vì mình mới học nên không tránh khỏi viết rườm rà . Nếu bạn thấy có thể rút ngắn được đoạn nào thì giúp mình với nhé .
Mình xin cảm ơn .

bete
24-03-2004, 17:46
Panda1982 sửa 2 chỗ:

Case1:
Mov Dl,'1'
Int 21h
Add Bh,1
Loop Lap <=========

Case2:
Mov Dl,'0'
Int 21h
Loop Lap <=======

thành:

Case1:
Mov Dl,'1'
Int 21h
Add Bh,1
jmp Loop_Lap <=======

Case2:
Mov Dl,'0'
Int 21h

Loop_Lap: <=========
Loop Lap <=========

Lý do: nêu nhập vô 1 kí tự ứng với số hex lẻ: khi xét bit cuối => CF = 1; CX = 0
==> chương trình sẽ vào Case 1 & làm:

Case1:
Mov Dl,'1'
Int 21h
Add Bh,1

==> lúc này CX = 0 => chương trình sẽ bỏ qua (0 loop) lệnh "Loop Lap" (của Case1) kế tiếp
mà đi xuống lệnh kế => vô Case2:

Case2:
Mov Dl,'0'
Int 21h

==> vì CX =0 => lệnh "Loop Lap" (của Case2) kế sẽ làm 65536 lần (CX bắt đầu từ 0; giảm dần (trở thành số âm) cho đến khi trở lại thành 0) => mình sẽ thấy quá trời số 0

Panda1982
24-03-2004, 18:32
Cảm ơn Bete nhé . Bạn đã giúp đỡ mình rất nhiều .

Panda1982
28-03-2004, 22:08
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