从 65 到 69('A' 到 'E')的随机整数,并将其存储到 AL 寄存器

A random integer from 65 to 69 ('A' to 'E') and store it to AL register

您好,我是汇编语言的新手,我尝试生成一个从 65 到 69('A' 到 'E')的随机整数并将其存储到 AL 寄存器。这是我的代码。

;------------------------------------------------------------
GetChFromABCDE PROC USES eax
;
; Generates a char randomly from 'A','B','C','D','E'
; Receives: Nothing
; Returns: The char ASCII code in AL
;------------------------------------------------------------

mov eax, 5          ; get random 0 to 4
call RandomRange    ;
mov eax, 41h        ; make range 65 to 69
mov value1, eax
mov al, BYTE PTR value1

GetChFromABCDE ENDP

END main

每当我试图找出这段代码中的问题所在时,调试器就会提示 'Source not available' 和 'Source information is missing from the debug information for this module'。我想问题是这个。

mov value1, eax
mov al, BYTE PTR value1

我的教授说尽量使用寄存器而不是内存,但是这次我不知道如何解决这个问题..

mov eax, 41h        ; make range 65 to 69

啊,...,不,不是 :-)

eax设置为0x41/A。我想你的意思是:

add eax, 41h        ; make range 65 to 69

此外,我不确定为什么你 将随机值存储到 value1 然后检索它的代码(你认为问题可能出在哪里) ):

mov eax, 41h        ; make range 65 to 69 (should be add)

; I mean this code below:
mov value1, eax
mov al, BYTE PTR value1

al 寄存器 已经 具有随机值,因为它是 eax 的最低有效八位字节。由于您从不在其他任何地方使用 value1,因此这似乎是多余的。


您可能还想检查子例程完成后应该做什么。某个 调用了 它,因此它应该 return 给那个调用者。也就是说,需要一个ret


最后一点,我相信 procuses 子句会自动创建 push/pop 指令来保存和恢复这些寄存器中的值。所以你想要一个uses列出你想要return一个值的寄存器之一,因为pop在[=19之前=] 将覆盖该值。


我发现我忘了在 GetChFromABCDE PROC 中输入 ret! 这是最终答案。

GetChFromABCDE PROC 

    mov eax, 5        ; get random 0 to 4 
    call RandomRange  ; 
    add eax, 41h      ; make range 65 to 69
    ret

GetChFromABCDE ENDP