У вас есть опечатка ...
Используйте clc вместо cld , cld , чтобы очистить флаг направления, а clc очистить флаг переноса.
Правильный асм код ...
asm
mov cx, k //ecx for 32bit cpu mode
@1:
clc
sal n, 1
loop @1
end;
или
asm
mov cx, k //ecx for 32bit cpu mode
@1:
shl n, 1
loop @1
end;
или
asm
mov cl, k
shl n, cl
end;
Этот код работает в режиме 16-битного процессора!
EDIT:
Для предотвращения смещения нуля сначала проверьте, если k = 0
asm
mov cx, k //ecx for 32bit cpu mode
and cl, cl //zero test
jz @Done
@1:
clc
sal n, 1
loop @1
@Done:
end;