Lds 导致无限循环,而 les 工作正常

问题描述 投票:0回答:1

这是我唯一的代码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
assembly x86 x86-16 masm calling-convention
1个回答
0
投票

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
被正确保存并且代码有效。

© www.soinside.com 2019 - 2024. All rights reserved.