Tải bản đầy đủ - 0 (trang)
Tổng quan về các lệnh chỉ dẫn của JVM

Tổng quan về các lệnh chỉ dẫn của JVM

Tải bản đầy đủ - 0trang

Tsub



isub



lsub fsub dsub



Tmul



imul



lmul fmul dmul



Tdiv



idiv



ldiv



Trem



irem



lrem frem drem



Tneg



ineg



lneg fneg dneg



Tshl



ishl



lshl



Tshr



ishr



lshr



Tushr



iushr



lushr



Tand



iand



land



Tor



ior



lor



Txor



ixor



lxor



i2T



i2b



i2s



i2l



l2T



l2i



f2T



f2i



f2l



d2T



d2i



d2l



Tcmp



fdiv



ddiv



i2f



i2d



l2f



l2d

f2d



d2f



lcmp



Tcmpl



fcmp dcmp

l

l



Tcmpg



fcmp dcmp

g

g



if_Tcmp

OP



if_icmp

OP



Treturn



ireturn



if_acmp

OP

lretu fretu dretu

rn

rn

rn



areturn



Kiểu dữ liệu trong tập lệnh máy ảo Java

Bảng trên tóm tắt các kiểu dữ liệu hỗ trợ trong tập lệnh của Java Virtual

machine. Đối với một lệnh cụ thể, thông tin kiểu dữ liệu được xây dựng bằng việc

thay thế T trong cột opcode bằng ký tự trong cột kiểu dữ liệu, nếu kiêu dữ liệu ở cột

nào trống thì có nghĩa khơng tồn tại lệnh hỗ trợ kiểu dữ liệu đó.

1.2. Lệnh load và store

Lệnh load và store được sử dụng để chuyển giá trị giữa local variables và

operand stack trong JVM frame (frame được sử dụng để lưu trữ dữ liệu)

 Lệnh load chuyển giá trị local variables vào operand stack: iload, iload_,

lload, lload_, fload, fload_, dload, dload_, aload, aload_



 Lệnh store chuyển giá trị từ operand stack vào local variables: istore,

istore_, lstore, lstore_, fstore, fstore_, dstore, dstore_, astore,

astore_.

 Lệnh load 1 hằng số vào trong operand stack: bipush, sipush, ldc, ldc_w,

ldc2_w, aconst_null, iconst_m1, iconst_, lconst_, fconst_,

dconst_.

Các lệnh truy cập tới các trường của đối tượng hoặc các phần tử của mảng cũng

được sử dụng để chuyển giá trị từ đối tượng hoặc phần tử đó vào trong operand stack

1.3. Lệnh số học

Lệnh số học được sử dụng để tính tốn 2 giá trị trên được lưu trữ trong operand

stack. Có 2 loại chính trong lệnh số học đó là việc tính tốn trên các giá trị integer và

float-point. Các lệnh số học được liệt kê ở dưới đây:

 Cộng: iadd, ladd, fadd, dadd.

 Trừ: isub, lsub, fsub, dsub.

 Nhân: imul, lmul, fmul, dmul.

 Chia: idiv, ldiv, fdiv, ddiv.

 Chia lấy dư: irem, lrem, frem, drem.

 Phủ định: ineg, lneg, fneg, dneg.

 Dịch bit: ishl, ishr, iushr, lshl, lshr, lushr.

 OR các bit: ior, lor.

 AND các bit: iand, land.

 XOR các bit: ixor, lxor.

 So sánh: dcmpg, dcmpl, fcmpg, fcmpl, lcmp

1.4. Lệnh chuyển đổi kiểu dữ liệu

Lệnh chuyển đổi kiểu dữ liệu cho phép chuyển đổi các kiểu dữ liệu số học

trong Java Virtual Machine. JVM hỗ trợ trực tiếp việc chuyển đồi từ kiểu dữ liệu nhỏ

hơn sang kiểu dữ liệu lớn hơn:

 int chuyển đổi thành long, float, hoặc double

 long chuyển đổi thành float or double

 float chuyển đổi thành double

Lệnh chuyển đổi sang kiểu dữ liệu lớn hơn có dạng i2l, i2f, i2d, l2f, l2d, và f2d.

Việc chuyển đổi từ kiểu int sang kiểu long hoặc kiểu int sang kiểu double sẽ không

làm mất mát thông tin của giá trị ứng với kiểu dữ liệu trước đó. Tuy nhiên việc chuyển

đổi từ kiểu float sang kiểu double thì có thể gây mất mát thơng tin của giá trị.

Ngồi ra JVM cũng hỗ trợ việc chuyển đổi kiểu dữ liệu về kiểu dữ liệu nhỏ hơn:

 int chuyển đổi về byte, short, hoặc char

 long chuyển đổi về int

 float chuyển đổi về int hoặc long



 double chuyển đổi về int, long, hoặc float

Lệnh chuyển đổi về kiểu dữ liệu nhỏ hơn có dạng i2b, i2c, i2s, l2i, f2i, f2l, d2i,

d2l, and d2f. Việc chuyển đối sang kiểu dữ liệu nhỏ hơn này sẽ làm mất đi độ chính

xác.

1.5. Tạo và thao tác với đối tượng

Mặc dù thể hiện của lớp và mảng là những đối tượng, tuy nhiên trong JVM

việc tạo và sử dụng chúng không giống nhau:

 Tạo mới thể hiện của 1 lớp ta sử dụng: new

 Tạo mới một mảng ta sử dụng: newarray, anewarray, multianewarray

 Truy cập tới các thuộc tính của đối tượng ta sử dụng: getfield, putfield,

getstatic, putstatic.

 Nạp các phần tử của mảng vào trong operand stack sử dụng: baload, caload,

saload, iaload, laload, faload, daload, aaload

 Lưu mỗi giá trị của operand stack vào mỗi phần tử của mảng sử dụng: bastore,

castore, sastore, iastore, lastore, fastore, dastore, aastore

 Tính độ dài của mảng thông qua: arraylength

1.6. Lệnh quản lý trong operand stack

Số lượng tập lệnh sử dụng trực tiếp trong operand stack bao gồm: pop, pop2,

dup, dup2, dup_x1, dup2_x1, dup_x2, dup2_x2, swap.

1.7. Lệnh điều khiển

Các lệnh điều khiển có điều kiện hoặc khơng có điều kiện xảy ra để tiếp tục

thực thi một câu lệnh khác, chúng được liệt kê dưới đây:

 Một số lệnh điều khiển có điều kiện: ifeq, ifne, iflt, ifle, ifgt, ifge, ifnull,

ifnonnull, if_icmpeq, if_icmpne, if_icmplt, if_icmple, if_icmpgt if_icmpge,

if_acmpeq, if_acmpne.

 Một số lệnh điều khiển không điều kiện: goto, goto_w, jsr, jsr_w, ret.

 Lệnh điều kiện kết hợp: tableswitch, lookupswitch

1.8. Lệnh gọi và trả về của phương thức

Có 5 loại lệnh để gọi phương thức:

 invokevirtual: gọi phương thức của một đối tượng.

 invokeinterface: gọi phương thức của 1 interface, tìm kiếm phương thức được

cài đặt bởi 1 đối tượng thời gian chạy (run-time object).

 invokespecial: gọi phương thức cần có xử lý đặc biệt: phương thức khởi tạo

của một đối tượng, phương thức dạng private, hoặc phương thức của lớp cha.

 invokestatic: gọi phương thức static của lớp.

 invokedynamic:gọi phương thức là mục tiêu của đối tượng gọi gắn với chỉ dẫn

invokedynamic.



Lệnh trả về của phương thức có các kiểu: ireturn (sử dụng để trả về giá trị kiểu

boolean, byte, char, short, hoặc int), lreturn, freturn, dreturn, và areturn.

1.9. Xử lý ngoại lệ

Ngoại lệ trong JVM được xử lý thơng qua lệnh athrow. Các ngoại lệ cũng có

thể được phát ra bởi các chỉ dẫn của JVM nếu có xảy ra các điều kiện bất thường.

2. Cấu trúc dạng file class

Như đã trình bày ở trên, file class là kết quả biên dịch từ file java. Mỗi file sẽ

chứa định nghĩa của 1 lớp hoặc 1 interface. Một file class là một chuỗi các byte 8 bit,

tất cả các thành phần 16 bit, 32 bit và 64 bit đều được dựng lại bằng việc đọc 2, 4 và 8

byte liên tiếp. Tất cả các thành phần dữ liệu là đa byte (multibyte) đều sẽ được lưu trữ

theo thứ tự big endian, tức là byte cao xếp trước.

Cấu trúc của 1 file class có thể được mơ tả như sau:

ClassFile {

u4

u2

u2

u2

cp_info

u2

u2

u2

u2

u2

u2

field_info

u2

method_info

u2

attribute_info



magic;

minor_version;

major_version;

constant_pool_count;

constant_pool[constant_pool_count-1];

access_flags;

this_class;

super_class;

interfaces_count;

interfaces[interfaces_count];

fields_count;

fields[fields_count];

methods_count;

methods[methods_count];

attributes_count;

attributes[attributes_count];



}



Các thành phần trong file class:

 magic: số đặc trưng cho định dạng file class với giá trị 0xCAFEBABE.

 minor_version, major_version: số hiệu phiên bản (số nhỏ, số lớn) của

định dạng. Định dạng file class cho Java version 7 là 0x0000, 0x0033 (51.00).

 constant_pool_count: có giá trị bằng số lượng phần tử trong bảng

constant_pool cộng với 1. Chỉ số của 1 phần tử trong constant_pool là

hợp lệ nếu lớn hơn 0 và nhỏ hơn constant_pool_count.

 constant_pool[]: là một bảng cấu trúc đại diện cho các hằng số xuất hiện

trong cấu trúc của file class bao gồm chuỗi, tên lớp, tên interface, tên trường…



 access_flags: có giá trị bằng hợp của các cờ đánh dấu quyền truy cập cũng

như đặc tính của lớp hay interface của file class. Các cờ này bao gồm:

Tên cờ

ACC_PUBLIC



Giá trị

0x0001



ACC_FINAL

ACC_SUPER

ACC_INTERFACE

ACC_ABSTRACT



0x0010

0x0020

0x0200

0x0400



ACC_SYNTHETIC



0x1000



ACC_ANNOTATION



0x2000



ACC_ENUM



0x4000



Ý nghĩa

Khai báo public: có thể truy nhập từ

ngồi package

Khai báo final: khơng cho kế thừa

Đánh dấu là interface, không phải lớp

Khai báo abstract: không được khởi

tạo

Khai báo synthetic: khơng có mã

nguồn

Khai báo là dạng chú thích

(annotation)

Khai báo là dạng liệt kê

(enumeration)



 this_class: có giá trị là một chỉ số hợp lệ trong bảng constant_pool.

Phần tử tại chỉ số này phải có cấu trúc CONSTANT_Class_info đại diện cho

lớp hoặc interface được định nghĩa bởi file class.

 super_class:

o Với lớp, giá trị của phần tử này hoặc bằng 0 hoặc là một chỉ số hợp lệ

trong bảng constant_pool. Phần tử tại chỉ số này phải có cấu trúc

CONSTANT_Class_info đại diện cho lớp cha trực tiếp của lớp được

định nghĩa bởi file class. Nếu giá trị này bằng 0, file class này sẽ đại

diện cho lớp Object, lớp duy nhất khơng có lớp cha trực tiếp.

o Với interface, giá trị của phần tử này là chỉ số trỏ tới phần tử có cấu trúc

CONSTANT_Class_info đại diện cho lớp Object.

 interfaces_count: giá trị bằng số lượng interface mà lớp/interface này kế

thừa.

 interfaces[]: một mảng các giá trị là chỉ số trỏ tới bảng constant_pool

mà phần tử tại đó có cấu trúc CONSTANT_Class_info đại diện cho interface

được lớp/interface này kế thừa trực tiếp.

 fields_count: có giá trị bằng số phần tử trong bảng fields.

 fields[]: mỗi phần tử trong bảng fields phải có cấu trúc field_info

đưa ra mơ tả đầy đủ cho một trường được khai báo trong lớp/interface này.

Bảng fields không bao gồm các trường kế thừa từ lớp cha hoặc interface cha.

 methods_count: có giá trị bằng số phần tử trong bảng methods.

 methos[]: mỗi phần tử trong bảng methods phải có cấu trúc method_info

đưa ra mơ tả đầy đủ về một phương thức trong lớp/interface này. Nếu các cờ

ACC_NATIVE hoặc ACC_ABSTRACT không được thiết lập, các chỉ dẫn JVM cài



Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tổng quan về các lệnh chỉ dẫn của JVM

Tải bản đầy đủ ngay(0 tr)

×