LDS 导致无限循环,而 LES 工作正常

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

这是我唯一的代码code.asm。我正在从 .c 文件执行此函数。但通过这个简单的代码,使用

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 it causes an infinite loop
    pop  bp
    ret
_func ENDP

_COD ENDS 

END
assembly x86 x86-16 masm calling-convention
1个回答
3
投票

x86 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.