2010-02-13 21 views
8

Tôi đang cố gắng chia hai số thành cụm. Tôi đang làm việc trong hội đồng Irvine cho cuốn sách máy tính intel và tôi không thể phân chia công việc cho cuộc sống của tôi.tràn bộ phận masm

Dưới đây là mã của tôi

.code 
main PROC 
    call division 
    exit 
main ENDP 

division PROC 
    mov eax, 4 
    mov ebx, 2 
    div ebx 
    call WriteDec 
    ret 
divison ENDP 

END main 

đâu WriteDec nên viết bất cứ điều gì số là vào sổ đăng ký eax (nên được thiết lập để các thương sau khi cuộc gọi bộ phận). Thay vào đó mỗi lần tôi chạy nó sụp đổ phòng thu trực quan (chương trình không biên dịch tuy nhiên).

+1

Bạn có thể bước qua nó trong debugger Visual Studio? Làm thế nào đến nay bạn nhận được nếu bạn bước vào mỗi hướng dẫn? –

+0

Ngoại lệ chưa xử lý tại 0x00401075 trong Project.exe: 0xC0000095: Số nguyên tràn. Xảy ra ngay sau khi cuộc gọi đến div. –

+0

Nếu bạn đang chia cho 2 và bạn quan tâm đến hiệu suất bạn có thể muốn xem xét sử dụng SHR. –

Trả lời

13

Bạn cần số không kéo dài EDX của bạn đăng ký trước khi thực hiện việc phân chia:

mov eax, 4 
mov ebx, 2 
xor edx, edx   ;set edx to zero 
div ebx 
call WriteDec 

các ;set edx to zero là một lời nhận xét trong MASM. Tôi không biết nếu nó sẽ làm việc nếu bạn đang sử dụng lắp ráp nội tuyến trong C, do đó, không sao chép nó nếu bạn là :)

+0

Có! Cảm ơn bạn rất nhiều vì đã giúp tôi với điều này. –

+1

Thay vì zeroing EDX explicity, người ta thường sử dụng lệnh CDQ để ký mở rộng EAX vào EDX. Nếu EAX không âm, EDX được điền bằng số không; nếu EAX là số âm, EDX được lấp đầy bằng một bit. –

+0

Vâng, bạn có quyền trong sự tôn trọng đó, nhưng OP đang làm * un * đã ký bộ phận, vì vậy tôi giữ câu trả lời của tôi đơn giản. – slugster

0

tôi nghĩ rằng lý do nêu trên là chính xác bởi vì khi u chia eax bởi ebx cả là số bit 32 bit nhưng cổ tức cần phải là số bit 64 bit là 32 bit và vì vậy nó xem edx là msb ... u có thể tạo edx 0 hoặc thay vì sử dụng 3bx chỉ sử dụng bx..in theo cách đó u sẽ chia 32 bit theo số 16 bit

3

Có, bạn cần đặt edx thành 0.

Cách dễ nhất để làm điều này là:

xor edx, edx