这是我唯一的代码code.asm。我正在从 .c 文件执行这个函数。但是用这个简单的代码,uding lds 而不是 les 会导致无限循环......
_COD SEGMENT BYTE PUBLIC 'CODE'
ASSUME CS:_COD
PUBLIC _cadena
_func PROC FAR
push bp
mov bp, sp
les bx, [bp+10]
;using les it works perfectly but using lds is causing an infinite loop
pop bp
ret
_func ENDP
_COD ENDS
END
16 位代码中的 C 调用约定 (CDECL) 定义了易失性寄存器(可以被函数破坏的寄存器)和非易失性寄存器(需要保留的寄存器)。非易失性寄存器需要具有与退出时进入函数时相同的值。
不需要保存的易失性寄存器有:
AX
、BX
、CX
、DX
、ES
和ST(0)
-ST(7)
。需要保留的非易失性寄存器有:SI
、DI
、BP
和DS
。
您没有显示您的 C 代码,但可能在
DS
中破坏 func
导致返回时调用者出现错误。当您使用 LES
来使用 ES
寄存器时,没有问题,因为不需要 func
必须保留 ES
中的原始值,因为它被视为易失性寄存器。当您使用 LDS
并在开始时执行 push DS
并在结束时执行 pop DS
时,DS
被正确保存并且代码有效。