0

这是我的问题

Q) 编写一个函数“addtoset”,它获取函数的偏移量,并将该偏移量存储在一个最多可容纳 8 个偏移量的数组中。如果集合中已经有八个偏移量,它什么也不做。编写另一个函数“callset”,逐个调用集合中的所有函数。

我最初试图用三个函数来做,你可以在我的代码中看到(我使用的是 NASM 16 位架构)

这是我的代码,它组装但不显示任何输出,我该如何修复它?

org 100h
segment data
arr dw 0,0,0
count dw 0
section .text
        mov bx , arr; assigning address of arr to bx

        mov ax , fun1;moving offset of fun1 to ax
        call addtoast

        mov ax , fun2;moving offset of fun2 to ax
        call addtoast

        mov ax , fun3;moving offset of fun3 to ax
        call addtoast

        call callset

end:
MOV AH,4CH
INT 21H

callset:;this function will call other functions
        call arr
        call [arr+2]
        call [arr+4]
ret

addtoast:;this function puts offset into array
        mov [bx+count], ax
        add [count], word 2
ret

fun1:;prints 1
        mov dx , '1'
        mov ah , 2h
        int 21h
ret

fun2:;prints 2
        mov dx , '2'
        mov ah , 2h
        int 21h
ret

fun3:;prints 3
        mov dx , '3'
        mov ah , 2h
        int 21h
ret
4

1 回答 1

0

call arr不做你想做的事,它去标签arr而不是把它用作指针。你需要括号:call [arr]

mov [bx+count],ax也不做你想做的事。它在标签之后存储ax到内存bx字节中count,而不是将其用作变量。不幸的是,x86 无法一步完成,因此您必须编写如下内容:

mov si, [count]
mov [bx+si], ax

乍一看没有其他问题,但是如果仍然无法正常工作,请学习使用调试器来单步执行代码。

于 2013-10-22T22:46:39.763 回答