2013-07-25 41 views
5

Trước hết, tôi rất mới với 8086 Hội và nó đã được khá khó khăn cho tôi lấy các kiến ​​thức. Tuy nhiên, tôi sẽ cố hết sức.Tạo một số ngẫu nhiên trong phạm vi 0-9 trong x86 8086 Hội

Tôi đã cố gắng viết mã để tạo số ngẫu nhiên trong phạm vi từ 0-9. Sau khi xem xét một số ví dụ và gợi ý, đây là những gì tôi đã kết thúc. Tôi đã không áp dụng bất kỳ chức năng toán học nào về số lượng đồng hồ đã lấy, để đơn giản và tôi cũng nghĩ nó không cần thiết. Tôi đã kết thúc với, vì một số lý do, tạo ra một số nhất định như 6,7 ít hơn so với con số như 1,3 và 9. Tôi tin rằng đó là bởi vì tôi đang dùng thứ tự thấp hơn của đồng hồ ve, nơi mà các giá trị thay đổi nhanh chóng.

Mục đích của tôi là mô phỏng cuộn xúc xắc mà sau này bị thay đổi phạm vi các mã bên dưới thành 1-6. Câu hỏi của tôi là, Điều này có đủ cho mục đích của tôi không? hoặc có cách nào tốt hơn để làm điều này?

mã:

RANDGEN:  ; generate a rand no using the system time 
RANDSTART: 
    MOV AH, 00h ; interrupts to get system time   
    INT 1AH  ; CX:DX now hold number of clock ticks since midnight  
       ; lets just take the lower bits of DL for a start.. 
    MOV BH, 57 ; set limit to 57 (ASCII for 9) 
    MOV AH, DL 
    CMP AH, BH ; compare with value in DL,  
    JA RANDSTART ; if more, regenerate. if not, continue... 

    MOV BH, 49 ; set limit to 48 (ASCII FOR 0) 
    MOV AH, DL 
    CMP AH, BH ; compare with value in DL 
    JB RANDSTART ; if less, regenerate. 


    ; if not, this is what we need 
    mov ah, 2h ; call interrupt to display a value in DL 
    int 21h  
RET 

trả lời, bởi @johnfound:

tôi tìm thấy con đường của mình là đơn giản hơn, và tốn ít thời gian để tạo ra các số ngẫu nhiên. Ông nói rằng điều này chỉ hoạt động nếu bạn cần một số ngẫu nhiên duy nhất, hoặc khoảng thời gian giữa các số ngẫu nhiên bao gồm tạm dừng cho đầu vào của con người. Nếu không, các con số sẽ không ngẫu nhiên chút nào (tôi tin là do hạt giống thời gian mà ban đầu chúng tôi thực hiện không thay đổi). Nó là tốt cho trường hợp của tôi, kể từ khi tôi mô phỏng một con xúc xắc cuộn, và tôi cần sự can thiệp của người dùng (cuộn khác) trước khi tôi sẽ chạy lại mã.

RANDGEN:   ; generate a rand no using the system time 
RANDSTART: 
    MOV AH, 00h ; interrupts to get system time   
    INT 1AH  ; CX:DX now hold number of clock ticks since midnight  

    mov ax, dx 
    xor dx, dx 
    mov cx, 10  
    div cx  ; here dx contains the remainder of the division - from 0 to 9 

    add dl, '0' ; to ascii from '0' to '9' 
    mov ah, 2h ; call interrupt to display a value in DL 
    int 21h  
RET  

Những gì ông đã làm: 1.We chuyển giá trị trong DX để AX 2.We xóa DX. 3.Chúng tôi đã chuyển 10 tháng 12 sang CX. 4. Chúng tôi chia AX bởi CX vì vậy chúng tôi nhận được phần còn lại trong ngày 0-9 tháng 12 được lưu trữ trong DX 5. Cuối cùng, chúng tôi đã thêm ASCII '0' (dec 48) vào DX để đưa chúng vào ASCII '0' đến '9 '.

+0

Bạn có muốn đầu ra để được trong khoảng 1-10 (như tiêu đề của bạn gợi ý) hoặc 0-255 (như câu hỏi của bạn cho thấy: * ... tạo ra một số ngẫu nhiên của một byte *)? Và mã có vẻ như nó đang cố gắng thực hiện một phạm vi '0' đến' 9' trong ASCII. – lurker

+0

vâng, như trong tiêu đề, 0-9 là chính xác. – Raf

Trả lời

6

Thủ thuật này chỉ hoạt động nếu bạn cần một số ngẫu nhiên duy nhất hoặc khoảng thời gian giữa các số ngẫu nhiên bao gồm tạm dừng cho đầu vào của con người. Trong tất cả các trường hợp khác, các con số sẽ không ngẫu nhiên chút nào.

Nếu bạn cần nhiều số ngẫu nhiên, thì có sẵn các thuật toán số giả ngẫu nhiên khác nhau.

lưu ý nữa là có cách dễ dàng hơn để có được số lượng trong khoảng thời gian cần thiết:

mov ax, dx 
    xor dx, dx 
    mov cx, 10  
    div cx  ; here dx contains the remainder of the division - from 0 to 9 

    add dl, '0' ; to ascii from '0' to '9' 

Bạn có thể sử dụng phương pháp này cho mỗi bộ tạo số ngẫu nhiên của các khóa học.

+0

Tôi đã thử mã của bạn và nó hoạt động hoàn hảo. Mất ít thời gian hơn để tạo ra so sánh với tôi.Nhưng tôi không hoàn toàn hiểu một vài điều. 1. xor dx, dx - mục đích của việc này là gì? 2. thêm dl, '0' - Cách thêm '0' vào DL, chúng tôi thực sự đạt được giá trị ASCII từ 0-9? – Raf

+0

Chúng tôi không thêm 0 (0) vào dl, nhưng mã ascii của ký tự "0" = 30h = 48. Bằng cách này, số trong DL (từ 0 đến 9) sẽ được chuyển sang 30h đến 39h. ký tự từ "0" đến "9". một cái gì đó xor something = 0 luôn. – johnfound

+0

tôi thấy, vì vậy những gì chúng tôi đã làm: 1.Chúng tôi đã chuyển giá trị trong DX sang AX 2.Chúng tôi đã xóa DX. 3. Chúng tôi đã chuyển 10 tháng 12 sang CX. 4. Chúng tôi chia AX bởi CX vì vậy chúng tôi nhận được phần còn lại trong vòng 0-9 tháng 12 được lưu trữ trong DX 5. Cuối cùng, chúng tôi đã thêm ASCII '0' (dec 48) vào DX để đưa chúng vào ASCII '0' đến '9' . Được rồi, cảm ơn – Raf

0

Tôi tìm thấy một mã số nhỏ hơn, AAM - Ascii Adjust for Multiplication, cho công việc này. Làm thế nào công việc opcode này:

AH := AL/10 
AL := AL mod 10 

Vì vậy, nó sẽ là thế này:

mov al, dl 
aam 
add al, '0' 
mov dl, al 
Các vấn đề liên quan