2016-11-17 19 views
5

Do là chương trình lắp ráp của Intel 8086 Processor có thêm những con số trong mảng:Whats sự khác biệt cơ bản giữa địa chỉ của mảng [di] và [mảng + di] trong lắp ráp là gì?

.model small 
.stack 100h 

.data 
    array dw 1,2,3,1,2 
    sum dw ?,", is the sum!$" 

.code 
main proc 
    mov ax,@data 
    mov ds,ax 

    mov di,0 

    repeat: 
    mov ax,[array+di] 
    add sum,ax 
    add di,2   ; Increment di with 2 since array is of 2 bytes 

    cmp di,9 
    jbe repeat   ; jump if di<=9 

    add sum,30h  ; Convert to ASCII 
    mov ah,09h 
    mov dx,offset sum ; Printing sum 
    int 21h 

    mov ax,4c00h 
    int 21h 
main endp 
end main 

Trên chương trình cho biết thêm số lượng mảng sử dụng "cơ sở + index" chế độ giải quyết.

Các hoạt động tương tự có thể bằng cách thực hiện bởi một cái gì đó như:

câu hỏi
mov ax, array[di] 

Bây giờ tôi đã sau đây:

  1. sự khác biệt giữa array[di][array+di]
  2. nào nhớ mode địa chỉ là array[di] là gì ?
  3. Cách nào tốt hơn để sử dụng và tại sao?
+6

Không có sự khác biệt, nhưng cú pháp giữa các ý kiến ​​'[mảng + di]'. Một số nhà lắp ráp cũng chấp nhận phiên bản khác. – Jester

+0

"3." dựa trên nhiều ý kiến, như assembly của bạn quyết định những gì bạn có thể sử dụng ... Tôi sẽ đi với '[array + di]' vì A) IIRC đó là cách chính thức cách mà cú pháp Intel được định nghĩa bởi Intel B) nó tương thích với NASM - có vẻ là một trong những trình biên tập cuối cùng cho x86, tức là. duy trì, đa nền tảng, đa mục tiêu và nguồn mở. Và thậm chí miễn phí. Khó để đánh bại combo đó. C) có ý nghĩa hơn với tôi, tôi đã quen với suy nghĩ thay vì trong con trỏ hơn là trong "biến", khái niệm về các biến được hiển thị cho tôi sau khi tôi đã biết Z80 assembler. – Ped7g

Trả lời

6

Theo cuốn sách The Art of Assembly Language, array[di][array + di] đều "chế độ addresing indexed", do đó, không ai là tốt hơn so với người kia, là cú pháp chỉ khác nhau cho cùng một điều. Phần 4.6.2.3 Indexed Addressing Modes của cuốn sách giải thích rằng điều quan trọng là sự hiện diện của một giá trị không đổi và một chỉ số (hoặc cơ sở) đăng ký:

Các chế độ địa chỉ lập chỉ mục sử dụng cú pháp sau:

  mov  al, disp[bx] 
      mov  al, disp[bp] 
      mov  al, disp[si] 
      mov  al, disp[di] 

Các khoảng bù được tạo bởi các chế độ địa chỉ này là tổng số của hằng số và thanh ghi được chỉ định.

enter image description here

Bạn có thể thay thế si hoặc di trong hình trên để có được những [si + disp] và [di + disp] giải quyết chế độ.

Chúng tôi đang kêu gọi "giá trị không đổi" để biến array vì biến là offsets trong phân đoạn dữ liệu (vì vậy họ là những giá trị không đổi), như được giải thích here:

Biến là một vị trí bộ nhớ. Đối với một lập trình viên dễ dàng hơn nhiều để có một số giá trị được giữ trong một biến có tên là "var1" so với địa chỉ 5A73: 235B.

Điều quan trọng cần lưu ý là các trình kết nối khác nhau có thể sử dụng cú pháp khác nhau cho cùng một chế độ địa chỉ, ví dụ: MASM vs NASM hoặc NASM vs GAS.

Có các chế độ địa chỉ khác thay đổi kích thước (tính bằng byte) và hiệu suất (trong chu kỳ đồng hồ) của các hướng dẫn có liên quan, như có thể đọc here.Tiếp theo là hướng dẫn MOV và các phương thức giải quyết:

enter image description here enter image description here

+0

Đó là một verbose đều như câu trả lời xuất sắc. – zx485

+1

Số chu kỳ đó có phải là 8086 không? Tôi nghi ngờ đó là có liên quan, trừ khi emu8086 thực sự là một mô phỏng chu kỳ chính xác (mà tôi rất nghi ngờ). –

+3

Dù sao, nó không chỉ là cả hai "chế độ địa chỉ được lập chỉ mục", chúng thực sự là cùng một chế độ địa chỉ. Nó chỉ là một cú pháp asm khác nhau cho cùng một mã máy. Ồ, tôi đã bỏ lỡ phần 2 của câu hỏi, vâng tôi đoán tất cả những điều này giải thích rằng chế độ giải quyết là có liên quan. –

Các vấn đề liên quan