Thứ Tư, 5 tháng 3, 2014

Lệnh ASM sưu tầm trong loạt tut kienmanowar

stack-->ngăn xếp, chứa dữ liệu tạm thời, giống như 1 chồng đĩa, cái nào ở trên cùng thì được lấy ra đầu tiên, làm việc theo kiểu FIFO(vào trước ra sau), hoạt động trên
thanh ghi ESP và EBP,
thanh ghi ESP(stack pointer) luôn trỏ đến đỉnh hiện thời của ngăn xếp,
thanh ghi ESP trỏ đến địa chỉ vùng nhớ nơi mà thao tác stack tiếp theo sẽ thực hiện
thanh ghi EIP nó được cập nhật mỗi khi có lệnh được thự hiện, nó trỏ đến địa chỉ của lệnh sẽ được thực hiện tiếp theo
thanh ghi EBP được dùng để truy nhập dữ liệu, nó thường được dùng kết hợp với thanh ghi ESP. trước khi gọi hàm, thì địa chỉ của lệnh trong hàm sẽ được cất vào stack
           đồng thời giá trị của thanh ghi EBP sẽ được đẩy vào stack để thự hiện,
F8-->thực thi câu lệnh đầu tiên trong cửa sổ CPU

số dương: số âm:
hệ 16: 00000000h, 00000001h,..., 7FFFFFFFh        FFFFFFFFh, FFFFFFFEh, FFFFFFFDh, FFFFFFFC,..., 80000000h(số 00000000h là số dương nhỏ nhất, số 7FFFFFFFh là số dương lớn nhất)

hệ 10: 0,1,2,...2147483647      -1,-2,...-2147483647

thanh ghi dữ liệu:
EAX, EBX, ECX, EDX-------------->những thanh ghi chứa dữ liệu 32 bit
AX, BX, CX, DX------------------>những thanh ghi chứa dữ liệu 16 bit
AH, AL; BH, BL;CH, CL; DH, DL--->những thanh ghi chứa dữ liệu 8 bit, đi với H là 8 bit cao, đi với L là 8 bit thấp.

EAX(thanh ghi chứa)--->thường được dùng cho các lệnh liên quan đến số học, logic, phép chuyển đổi,trong các thao tác nhân chia..
EBX(thanh ghi cơ sở)--->đóng vai trò là thanh ghi địa chỉ
ECX(thanh ghi đếm)---->đếm số lần lặp, đếm trong các thao tác dịch bit, quay bit
EDX(thanh ghi dữ liệu)--->cùng với thanh ghi EAX tham gia vào các thao tác của phép nhân, chia ngoài ra còn tham gia vòa các thao tác vào ra.

thanh ghi chỉ số:
ESI-->chỉ số nguồn
EDI-->chỉ số đích
==>thường được dùng trong các thao tác liên quan đến chuỗi hoặc mảng
-thanh ghi bắt đàu bằng chữ E thì đó là thanh ghi 32 bit, nếu thanh ghi nào không có chữ E mà theo sau là chữ X thì đó là thanh ghi 16 bit, và nếu theo sau là H và L thì đó là
thanh ghi 8 bit.
ví dụ thanh ghi EAX có giá trị là 12345678h(chữ h phía sau ý nói ở dạng hexa hệ 16) là thanh ghi có giá trị ở 32 bit
trong lập trình ASM người ta không sử dụng hết 32 bit mà người ta tính toán các bit,
EAX--12345678h--->12345678h là giá trị có chiều dài 32bit của thanh ghi EAX......tương tự các thanh ghi còn lại EBX, ECX, EDX
AX---5678h------->5678h là giá trị có chiều dài 16bit của thanh ghi AX...........tương tự các thanh ghi còn lại BX, CX, DX
AH---56h--------->56h là giá trị có chiều dài 8bit của thanh ghi AH (8bit cao)...tương tự các thanh ghi còn lại BH,BL,CH,CL,DH,DL
AL---78h--------->78h là giá trị có chiều dài 8bit cua thanh ghi AL (8bit thấp)..tương tự các thanh ghi còn lại BH,BL,CH,CL,DH,DL



Cờ(Flag):
cờ trạng thái và cờ điều khiển,
cờ có chiều dài 1 bit nên nó chỉ mang giá trị 0 hoặc 1,
cờ trạng thái hiển thị kết quả của phép tính, cờ điều khiển là nó cho phép hay không cho phép một phép tính
==>mỗi một thao tác của cpu đều dựa vào quyết định của cờ

*Cờ O (cờ of) là cờ trạng thái, là cờ mà nếu như bị tràn(overflow flag) thì sẽ có giá trị là 1(bình thường có giá trị là 0)
thay đổi giá trị thanh ghi EAX=7FFFFFFFh(là số dương lớn nhất, thay đổi giá trị thanh ghi EAX mục đích là để dùng phép cộng(ADD) trong ASM để cộng thêm 1,
vì thanh ghi EAX có chức năng liên quan đến các phép toán...)
tại dòng lệnh ASM sửa lại thành ADD EAX,1
f8 tại dòng lệnh vừa thay đổi
thấy cờ O sẽ có giá trị là 1-->tràn cờ
nếu cộng hai số cùng dấu mà kết quả là số trái dấu thì luôn xảy ra tràn
nếu cộng hai số trái dấu thì dù kết quả là mấy cũng không xảy ra tràn
*Cờ P (cờ PF) là cờ chẵn lẻ nó có 2 giá trị 0(lẻ) 1(chẵn), tính chẵn lẻ ở đây phụ thuộc vào số bit 1 trong thanh ghi.
ví dụ: tại thanh ghi EAX ta đổi thành 00000000,
tại vị trí của lệnh sẽ được thực hiện(lệnh nào cũng được) ta sửa lại thành lệnh ADD EAX,1(cộng 1 cho thanh EAX)
f8 để chạy lệnh đó, thì ta thấy EAX=00000001, đem giá trị này(00000001=1)đổi sang nhị phân ta được 01-->có 1(lẻ) bít 1. ==>cờ PF=0, tương tự
f8 để chạy lệnh đó, thì ta thấy EAX=00000002, đem giá trị này(00000002=2)đổi sang nhị phân ta được 10-->có 1(lẻ) bít 1. ==>cờ PF=0,
f8 để chạy lệnh đó, thì ta thấy EAX=00000003, đem giá trị này(00000003=3)đổi sang nhị phân ta được 011-->có 2(chẵn) bít 1. ==>cờ PF=1
...
==>cờ P này có giá trị là 1 hay 0 thì phụ thuộc vào giá trị(kết quả của thanh ghi), đem kết quả đó đổi sang nhị phân, nếu số bit 1 là chẵn thì PF=1, ngược lại
là PF=0

*Cờ Z (cờ zero) là cờ không, nếu kết quả của thanh ghi là không thì nó sẽ bật lên 1, ngược lại nó bằng 0
ví dụ: EAX=FFFFFFFF, ADD EAX,1 ,F8 --->Z=1(vì EAX=00000000)
==>quan trọng trong crack
*Cờ S (Cờ SF) là cờ dấu, nó có giá trị là 1 khi kết quả của thanh ghi mang giá trị âm, và S=0 khi ngược lại
ví dụ: EAX=FFFFFFF8, ADD EAX,1 ,F8---->S=1(vì EAX=FFFFFFF9=-7)
*cờ C (cờ CF) là cờ nhớ, C=1 khi có nhớ hoặc mược từ bit MSB(bit tận cùng trái có trọng số lớn nhất)


*các cờ điều khiển T, I, D
Cờ T--->là cờ bẫy, T=1 thì bẫy được kích hoạt, CPU sẽ chạy ở chế độ từng dòng lệnh, thường dùng để tìm lỗi chương trình.
Cờ I--->là cờ ngắt, I=1 thì cpu cho phép nhận lệnh ngắt
Cờ D--->là cờ hướng, D=1 khi CPU làm việc với chuỗi ký tự hoạt động từ phải sang trái



*Lệnh NOP là lệnh được sử dụng với mục đích bỏ qua một lệnh nào đó, khi thực thi lệnh tại địa chỉ có sử dụng lệnh NOP thì chương trình sẽ không làm gì cả, các thanh
ghi và stack đều không có sự thay đổi, chỉ có thanh ghi EIP thay đổi.

*Lệnh PUSH là lệnh đưa dữ liệu vào stack, khi ta dùng lệnh PUSH một giá trị nào đó(giá trị đó phải có thật, tồn tại trong chương trình) thì khi ta thực thi lệnh tại đó
thì giá trị đó sẽ được thêm vào ngăn trên cùng của stack, khi đó rõ ràng là giá trị của thanh ghi ESP sẽ thay đổi, vì chức năng của thanh ghi ESP là trỏ đến địa chỉ
ngăn xếp trên cùng của stack
-khi PUSH giatri--->giatri sẽ được thêm vào ngăn đầu tiên
-khi PUSH [điachi]--->giá trị tại địa chỉ sẽ được thêm vào ngăn đầu tiên
*Lệnh POP là lệnh lấy ra giá trị của ngăn xếp đầu tiên trong stack ra, ví dụ khi ta f8 tại lệnh POP EAX, thì kết quả EAX sẽ có giá trị bằng với giá trị của ngăn xếp
đầu tiên trong stack

*Lệnh PUSHAD giống như lệnh PUSH nhưng lệnh này có tác dụng thêm tất cả các giá trị của các thanh ghi trong bảng register(EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI) vào trong
stack và sắp xếp theo thứ tự ngược lại. lệnh này tương đương với PUSH EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI
*Lệnh POPAD giống với POP nhưng nó lấy ra tất cả, tương đương với lệnh POP EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI
*Lệnh MOV để di chuyển hay copy giá trị của thanh ghi, ô nhớ với nhau.
-mov EAX,EBX---->lấy giá trị của thanh ghi EBX gán cho EAX, kết quả giá trị của thanh ghi EAX sẽ giống y chang giá trị của thanh ghi EBX.
-mov EAX,[01234567]---->lấy nội dung của ô nhớ có địa chỉ 01234567 gán cho thanh ghi EAX, ở đây ta chú ý:
DWORD--->32bit dùng thanh ghi có chữ E ở đầu(EAX)
WORD---->16bit dùng thanh ghi có chữ A ở đầu(AX)
BYTE---->8bit dùng thanh ghi có chữ H or L ở cuối(AH,AL)
-mov [01234567],EAX---->lấy giá trị của thanh ghi EAX gán cho địa chỉ 01234567, tức là nội dung tại địa chỉ 01234567 sẽ được thay bởi giá trị của thanh ghi EAX
nhưng xảy ra lỗi không thực hiện được lý do là vì tại địa chỉ 01234567 chỉ có quyền read(nhẫn alt+m sẽ có bảng permistion)(lấy giá trị 32bit)
+nếu muốn lấy giá trị 16bit thì dùng các thanh ghi AX, BX,..
+nếu muốn lấy giá trị 8bit thì dùng các thanh ghi AH, AL,..

*Lệnh MOVSX dùng để copy một thanh ghi hoặc ô nhớ có chiều dài nhỏ hơn(ví dụ AX(16bit)) sang thanh ghi có chiều dài lớn hơn (ví dụ EAX(32bit))
ví dụ: +EAX=12345678 ; DX=F000
MOVSX EAX,DX-->F8-->EAX(FFFFF000) ---->copy giá trị của thanh ghi DX sang AX của thanh ghi EAX, phần còn lại sẽ tự động có giá trị là FFFF, vì DX=F000
là một số âm
+EAX=12345678 ; DX=7F00
MOVSX EAX,DX-->F8-->EAX(00007F00) ---->copy giá trị của thanh ghi DX sang AX của thanh ghi EAX, phần còn lại sẽ tự động có giá trị là 0000, vì DX=7F00
là một số dương
===>dương thì bít còn lại sẽ là 0000, còn âm thì FFFF

*Lệnh MOVZX cũng tương tự như MOVSX, nhưng các bit bên trái sẽ tự động điền lại thành các bit 0, nó không phụ thuộc vào bit dấu
*Lệnh LEA giống với lệnh MOV, chỉ khác ...
ví dụ: Ban đầu
EAX=0018FD1C
EBX=7FFDA111 ; EBX+4=7FFDA115

LEA EAX,DWORD PTR DS:[EBX+4]------->đầu tên lấy EBX hiện tại cộng cho 4, sau đó lấy kết quả cộng cho EAX
Kết quả
EAX=7FFDA115
EBX=7FFDA111
*Lệnh XCHG là lệnh để hoán đổi nội dung của hai thanh ghi, nó sẽ không thực hiện được nếu như không có quyền ghi

*Lệnh INC dùng để cộng thêm 1 vào nội dung của thanh ghi hay ô nhớ, lệnh DEC là ngược lại.
ví dụ Ban đầu
EAX=0018FD00
Chạy lệnh
INC EAX
Kết quả
EAX=0018FD01----->tăng lên 1 đơn vị ngay tại bit sau cùng(bit thấp)(ví dụ 1 tăng 2,...9 tăng A, A tăng B,...)
(chỗ này giống như cộng một số cho 1 hoặc trừ 1, hoặc dùng calc tính dùm)
*Lệnh ADD dùng để cộng hai giá trị của thanh ghi, hoặc ô nhớ,
ví dụ: Ban đầu
EAX=00000000
EBX=12345678
Chạy lệnh
ADD EAX,EBX
Kết quả
EAX=12345678----->giống như cộng hai số 0000000+12345678 trong hệ 16

*Lệnh ADC dùng để cộng hai giá trị của thanh ghi hoặc ô nhớ, nhưng nó phụ thuộc vào cờ CF, nếu cờ C=1 thì kết quả của phép cộng đó phải được cộng thêm 1, ngược lại C=0
thì kết quả chỉ là tông của hai giá trị...

ví dụ: Ban đầu
EAX=00000ABC
EBX=12345678

Chạy lệnh
ADC EAX,EBX
Kết quả
EAX=12346134 nếu C=0 và EAX=12346135 nếu C=1

*Lệnh SUB dùng để trừ, ngược lại với lệnh ADD
ví dụ: Ban đầu
EAX=00000000
Chạy lệnh
SUB EAX,2
Kết quả
EAX=FFFFFFFE
trừ hai thanh ghi, thanh ghi với ô nhớ,..

*Lệnh SBB là lệnh trừ có nhớ, nếu cờ C=0 thì thực hiện trừ bình thường, còn nếu C=1 thì kết quả của phép trừ sẽ được trừ thêm cho 1 nữa
ví dụ Ban đầu
EAX=12333338
Chạy lệnh
SBB EAX,3
Kết quả
EAX=12333335 (nếu C=0)
EAX=12333334 (nếu C=1)

*Lệnh MUL là lệnh nhân số không dấu, dùng để nhân thanh ghi, ô nhớ, nhưng có điểm đặc biệt sau:
+Trường hợp nhân thanh ghi có chiều dài 8 bit:
+phép tính sẽ thực hiện nhân giá trị đó với thanh ghi AL
+kết quả sẽ được lưu vào thanh ghi AL
ví dụ: Ban đầu
ECX=00000501 có CH=05, CL=01
EAX=12345678 có AH=56, AL=78
Chạy lệnh
MUL CH----->sẽ lấy giá trị thanh ghi CH=05 nhân với thanh ghi AL=78
kết quả
EAX=12340258------>kết quả là 0258, nhưng theo lý thuyết kết quả sẽ lưu trong thanh ghi AL,nên kết quả thật sự không phải là 0258
  mà là 58(AL=58)
thanh ghi CH trong thanh ghi EAX vẫn giữ nguyên(ECX=00000501)
(Nếu kết quả của phép cộng có vượt quá 8 bit đi nữa thì chỉ lấy 8 bit mà thôi)
+Trường hợp nhân thanh ghi có chiều dài 16 bit:
+phép tính sẽ thực hiện nhân giá trị đó với thanh ghi AX
+kết quả sẽ được lưu vào thanh ghi AX, nếu còn dư(vượt giới hạn 16 bit) thì sẽ lưu qua thanh ghi DX(lắp đầy từ phải qua)DX:AX
ví dụ: Ban đầu
ECX=00000501 có CX=0501
EAX=12345678 có AX=5678
Chạy lệnh
MUL CX----->sẽ lấy giá trị thanh ghi CX=0501 nhân với thanh ghi AX=5678
Kết quả
EAX=1234AE78------>ta lấy 0501 nhân với 5678 bằng 01B0AE78, nhưng để chứa kết quả vào thanh ghi AX thì kết quả của phép nhân
   CX nhân AX chỉ được giữ lại AE78, phần còn lại là 01B0 được lắp đầy vào thanh ghi DX chỗ thanh ghi EDX
EDX=000001B0
thanh ghi CX trong thanh ghi ECX vẫn giữ nguyên(ECX=00000501)
+Trường hợp nhân thanh ghi có chiều dài 32 bit:
+phép tính sẽ thực hiện nhân giá trị đó với thanh ghi EAX
+kết quả sẽ được lưu vào thanh ghi EAX, nếu còn dư(vượt giới hạn 32 bit) thì sẽ lưu qua thanh ghi EDX(lắp đầy từ phải qua)(EDX:EAX)
ví dụ: Ban đầu
ECX=00000501
EAX=12345678
Chạy lệnh
MUL ECX----->sẽ lấy giá trị thanh ghi ECX nhân với giá trị thanh ghi EAX
Kết quả
EAX=17E4AE78------>ECX nhân EAX bằng 5B17E4AE78
EDX=0000005B------>lấy phần thừa là 5B lắp qua cho EDX
ECX=00000501
*Lệnh IMUL giống như lệnh MUL, nhưng dùng để nhân hai toán hạng có dấu,
ví dụ + IMUL EBX------>lệnh này dùng để nhân giá trị của thanh ghi EBX với thanh ghi EAX, sau khi nhân, kết quả sẽ lưu vào thanh ghi EAX, phần còn lại lưu
trong thanh ghi EDX(EDX:EAX), nếu một trong hai thanh ghi đó mang dấu âm thì kết quả sẽ có phần khác so với khi nhân bằng máy tính
Ban đầu:
EAX=12345678
EBX=F0000000
EDX=01234567(sẽ bị clear khi có kết quả của phép tính lưu vào)
Chạy lệnh
IMUL EBX---->lấy F0000000 x 12345678 = 1111111080000000
Kết quả
EAX=80000000
EDX=11111110(lẻ ra là như vậy), nhưng
EDX=FEDCBA98(vì EBX mang giá trị âm)
ngược lại nếu cả hai toán hạng đều là số không dấu thì kết quả y như tính trong cal
+ IMUL EBP, DWORD PTR [ESI+89], 00FF8002--------->lấy thanh ghi ESI + 89, được kết quả, rồi lấy nội dung của kết quả đó nhân với 00FF8002, kết quả sau cùng sẽ được
lưu trong thanh ghi EBP

Ban đầu:
ESI=F0101010
EBP=01234567
Chạy lệnh
IMUL EBP, DWORD PTR [ESI+89], 00FF8002
Kết quả
EBP=không được, vì các giá trị ta điền đại, nên không có nội dung tương ứng
EBP=00200000(nếu ESI=7FFDE001,EBP=01234567,
[7FFDE001+89]=[77DE08A]=00100000
00100000 x 00FF8002=FF800200000)
các thanh ghi của toán hạng không thay đổi

*Lệnh XADD
ví dụ:
Ban đầu
EAX=00000009
EBX=00000001
chạy lệnh
XADD EAX,EBX---->EBX=EAX, EAX=EAX+EBX
kết quả
EAX=0000000A
EBX=00000009
*Lệnh NEG đảo bít và cộng 1
ví dụ
Ban đầu
EAX=00000032

chạy lệnh
NEG EAX---->đảo bít của thanh ghi EAX sau đó cộng 1
kết quả
EAX=FFFFFFCE


*Lệnh AND (phép nhân)
1 AND 1 = 1
1 AND 0 = 0
0 AND 1 = 0
0 AND 0 = 0
----------->thường dùng để xóa bít, bit 0 là xóa bit, bit 1 là giữ bit,
ví dụ:
Ban đầu
EAX=00003500<-->11010100000000
ECX=00002400<-->10010000000000
Chạy lệnh
AND EAX,ECX---->10010000000000<--->00002400
kết quả sẽ lưu trong thanh ghi EAX

*Lệnh OR (hoặc)
1 OR 1 = 1
1 OR 0 = 1
0 OR 1 = 1
0 OR 0 = 0
---------->thường dùng để thay đổi các bit
*Lệnh XOR những bít nào giống nhau thì cho kết quả là 0, những bit nào khác nhau thì cho kết quả là 1, ví dụ như 0 XOR 1 hoặc 1 XOR 0 đều =1, còn 0 với 0 hoặc 1 với 1
đều =0
---------->thường dùng để đảo bit

*Lệnh NOT lệnh đảo bit, NOT 0 = 1....

*Lệnh CMP là lệnh so sánh, bằng cách thực hiện phép trừ giống như lệnh SUB, nhưng kết quả không được lưu lại như lệnh SUB, nó vẫn giữ nguyên các toán hạng, chỉ tác động
lên các cờ CF, ZF, SF
+ CF--->là cờ đếm, cờ nhận biết trong phép toán, có vay mượn hay không?? ví dụ như 2-3 vì 2 < 3 nên phải "mượn" mới trừ được, khi đó cờ CF=1, ngược lại
CF=0
+ ZF--->là cờ zero, ví dụ như phép trừ mà bằng không thì cờ ZF=1
+ SF--->là cờ dấu, nếu kết quả là số âm thì SF=1
ví dụ:
CMP EAX,ECX---->lấy EAX-ECX
+Nếu EAX=ECX
+cờ Z=1 ; C=0 ; S=0
+Nếu EAX>ECX
+cờ Z=0 ; C=0 ; S=0
+Nếu EAX<ECX
+cờ Z=0 ; C=1 ; S=1
(cờ P có thể = 0 hoặc = 1, lẻ<--->P=0; chẵn<-->P=1, chẵn lẻ phụ thuộc vào số bít 1 trong kết quả là chẵn hay lẻ)



*Lệnh TEST giống với lệnh CMP, nhưng khác là nó thực hiện phép cộng giống lệnh ADD, và kết quả của phép tính không được lưu lại, công dụng của nó là tác dụng lên các
cờ(P, Z, S)

ví dụ, TEST EAX,ECX
lấy EAX+ECX, nếu có kết quả bằng không, thì cờ Z=1, và nếu kết quả có số bít 1 là chẵn thì cờ P=1(kết quả =0 thì cờ P vẫn bằng 1)

*Lệnh nhảy, xem bảng tổng hợp các lệnh nhảy trong tut 6
*JMP----->lệnh nhảy không điều kiện, ví dụ như JMP 123FFF00 thì sau khi thực hiện lệnh hiện tại thì nó sẽ nhảy đến địa chỉ 123FFF00 (EIP=123FFF00)
*JE/JZ------>Lệnh nhảy có điều kiện, nếu cờ Z=1 thì nó sẽ nhảy(tức là nó nhảy hay không là phụ thuộc vào trạng thái của cờ Z), cờ Z ta có thể tự thiết lập được
*JNE/JNZ---->Lệnh nhảy có điều kiện, nhưng ngược lại với lệnh JE/JZ, tức là nếu kết quả phép tính trước đó(kết quả là giá trị khác không) làm cho cờ Z=0, khi đó lệnh nhảy này sẽ thực thi
*JS--------->Lệnh nhảy có điều kiện, nhảy nếu cờ S=1, tức là sau khi trace qua 1 lệnh nào đó nếu cho kết quả là một số âm.
*JP/JPE----->lệnh nhảy có điều kiện, nhảy nếu cờ P=1, tức là kết quả phép tính trước đó có số bít 1 là chẵn,
*JNP/JNPE--->Lệnh này ngược lại với lệnh JP/JPE, tức là sẽ thực hiện nhảy nếu cờ P=0
*JO--------->lệnh nhảy nếu cờ O=1, tức là xảy ra tràn khi thực thi phép tính
*JNO-------->ngược lại với lệnh JO, tức là sẽ thực hiện nhảy nếu cờ O=0
*JB--------->lệnh nhảy nếu cờ C=1, tức là có xảy ra mượn do toán tử đầu nhỏ hơn toán tử cuối,...ví dụ như CMP EAX,ECX mà EAX=1, ECX=2, lấy EAX-ECX,kết quả C=1
*JNB-------->ngược lại với lệnh JB tức là nếu cờ C=0 thì mới thực hiện nhảy
*JBE-------->lệnh nhảy nếu như cờ C=1 hoặc cờ Z=1, tức là toán hạng đích nhỏ hơn hoặc bằng toán hạng nguồn thì khi ấy cờ C=1 hoặc Z=1
*JL--------->nhảy nếu cở S khác cờ O, tức là khi cờ S=1, O=0 và ngược lại thì lệnh JL sẽ thực thi, ví dụ như EAX>ECX, nếu ta chạy lệnh CMP EAX,ECX thì cờ S và cờ O không bị tác động, nhưng nếu ngược lại EAX<ECX thì cờ S bị tác động và có thể ảnh hưởng đến cờ O

F7 là để trace qua lệnh đồng thời hiện quá trình hay hiện thông tin của lệnh, F8 trace qua lệnh mà không cần biết bên trong có gì...

*Lệnh RET/RETN------->thường đặt cuối chương trình con, để bộ vi xử lý lấy địa chỉ trở về, lệnh này tự động cất vào stack mỗi khi có lời gọi đến chương trình con
*Lệnh CALL----------->chạy một tập các câu lệnh tại một địa chỉ khác địa chỉ hiện thời, tức là nó giống như lời gọi hàm, sau mỗi hàm()














2 nhận xét:

  1. Bài hay lắm anh :))))) . E học được nhiều điều từ bài viết này!! :))) thanks anh đã chia sẽ!

    Trả lờiXóa
  2. Em rất thích bài viết của anh, rất hay, lời lẻ súc tích, ngắn gọn, đơn giản lại dễ hiểu. Mặc dù đã tham khảo nhiều kiến thúc về nội dung trên nhưng vân chưa được mở mang sự hiểu biết. Cám ơn rất nhiều về bài viết của anh. Mong rằng anh sẽ tiếp tục viết những bài viết hay và bổ ích như thế này. Chúc anh được nhiều sức khỏe và thành công trong công việc! THANKS...!!! ;-)

    Trả lờiXóa