tôi nghi ngờ bất cứ ai có thể giúp đỡ với câu hỏi này bởi vì những điều sau đây trong Erlang's compile documentation:Làm thế nào để sửa đổi lắp ráp Erlang? Có tài nguyên nào không?
Lưu ý rằng định dạng của file lắp ráp không được ghi nhận, và có thể thay đổi giữa các phiên bản - tùy chọn này chủ yếu là để sử dụng gỡ lỗi nội bộ.
... nhưng chỉ trong trường hợp, ở đây đi stack trace của câu chuyện:
- biên dịch: file/2 với [ 'S'] để tạo mã lắp ráp tập tin
- đọc .S và tạo một cấu trúc dữ liệu khóa-giá trị với khóa là các hàm 'hàm' trong tệp .S và giá trị là phần thân của hàm, nghĩa là các lệnh lắp ráp thực hiện hàm.
- Sửa đổi cấu trúc dữ liệu bằng cách thêm assembly để thực hiện cuộc gọi hàm bên ngoài trong một số chức năng nhất định.
- vụ tai nạn ...
Đáng tiếc là tôi chỉ nhanh chóng lướt các tập tin .S tạo ra khi biên soạn một module chứa các chức năng sau đây, có và không có biểu hiện đầu tiên trong chức năng chú thích:
spawn_worker(Which) ->
%syner:sync_pt(),
case Which of
?NAIVE -> spawn(err1, naive_worker_loop, [])
end.
Khi tôi làm điều đó, tôi nghĩ rằng điều duy nhất thay đổi là bộ đồ:
{call_ext, 0, {extfunc, syner, sync_pt, 0}}.
... vì vậy tôi giả định rằng điều duy nhất cần thiết để tiêm một cuộc gọi hàm trong hội đồng là thêm tuple ... nhưng bây giờ tôi đã thực sự tiêm tuple ... rằng lắp ráp tạo ra có một số hướng dẫn thêm:
Without SYNER: sync_pt():
{function, spawn_worker, 1, 4}.
{label,3}.
{func_info,{atom,err1},{atom,spawn_worker},1}.
{label,4}.
{test,is_eq_exact,{f,5},[{x,0},{atom,naive}]}.
{move,{atom,naive_worker_loop},{x,1}}.
{move,nil,{x,2}}.
{move,{atom,err1},{x,0}}.
{call_ext_only,3,{extfunc,erlang,spawn,3}}.
{label,5}.
{case_end,{x,0}}.
với SYNER: sync_pt():
{function, spawn_worker, 1, 4}.
{label,3}.
{func_info,{atom,err1},{atom,spawn_worker},1}.
{label,4}.
{allocate,1,1}.
{move,{x,0},{y,0}}.
{call_ext,0,{extfunc,syner,sync_pt,0}}.
{test,is_eq_exact,{f,5},[{y,0},{atom,naive}]}.
{move,{atom,naive_worker_loop},{x,1}}.
{move,nil,{x,2}}.
{move,{atom,err1},{x,0}}.
{call_ext_last,3,{extfunc,erlang,spawn,3},1}.
{label,5}.
{case_end,{y,0}}.
tôi có thể không chỉ kết luận rằng việc thêm một cái gì đó như:
{allocate,1,1}.
{move,{x,0},{y,0}}.
{call_ext,0,{extfunc,syner,sync_pt,0}}.
đến từng chức năng tôi muốn tiêm một chức năng cuộc gọi bên ngoài vào, sẽ làm các trick.
- vì tôi không chắc chắn nếu đó mã lắp ráp áp dụng cho tất cả các chức năng tôi muốn tiêm vào (ví dụ là {phân bổ, 1,1} luôn ok)
- bởi vì nếu bạn có một cái nhìn gần gũi hơn ở phần còn lại của hội đồng, nó thay đổi một chút (ví dụ: {call_ext_only, 3, {extfunc, erlang, spawn, 3}}. }).
Vì vậy, bây giờ câu hỏi là, có bất kỳ tài nguyên nào ở đó tôi có thể sử dụng để hiểu và thao tác lắp ráp được tạo bởi biên dịch của Erlang: tệp/2 không?
Tôi đang đặt câu hỏi này chỉ trong trường hợp. Tôi nghi ngờ có một nguồn lực cho điều này vì tài liệu rõ ràng nói rằng không có, nhưng tôi không có gì để mất tôi đoán. Ngay cả khi có, nó có vẻ như thao tác mã lắp ráp sẽ là phức tạp hơn tôi muốn nó được. Sử dụng parse_transform/2 chắc chắn là dễ dàng hơn, và tôi đã có được một cái gì đó tương tự để làm việc với nó ... chỉ cần thử các lựa chọn thay thế khác nhau.
Cảm ơn thời gian của bạn.
(Kể từ kiểm tra, không phải từ nguồn đọc.) '{allocate, 1,1}' phân bổ một vị trí trên ngăn xếp y. Các x stack là ngăn xếp "bình thường", các thanh ghi. Ngăn xếp y là một ngăn xếp phụ trợ. '{move, {x, 0}, {y, 0}}' di chuyển đỉnh trên cùng x đến mặt đáy y (ít nhất là chúng phát triển theo chiều ngược lại). Tệp thử nghiệm của tôi: http://pastebin.com/R21ZJ29Q. Kết quả của nó: http://pastebin.com/jULjMCV0. – kay
Cảm ơn bạn đã giúp đỡ kay. Có vẻ như việc tìm ra hội đồng sẽ mất quá nhiều thời gian, nên tôi không định giải mã nó. Chúc mừng. – justin