Member 13940202 Ответов: 1

Мой код не возвращает результат из оператора and & or в HLA


Мой код соответствует и работает так, как задумано, за исключением того факта, что он не возвращает новое значение в AL reg, которое было создано после оператора "and" или "or".

Что я уже пробовал:

program charConverter;
#include( "stdlib.hhf" );
static
iValue : byte;

	//This Procedure converts UPPERCASE letters to lowercase and vice versa.
	procedure converter( myCharacter : byte ); @nodisplay; @noframe;
	
	static
    returnChar : byte;
    iTemp : int16;
    iReturnAddress : dword;
    iRegisterValue : dword;
    cBigA : byte := $41; 		// A = hex 41
	cBigZ : byte := $5A;		// Z = hex 5A
	cLittlea : byte := $61; 	// a = hex 61
	cLittlez : byte := $7A;		// z = hex 7A
	cNumZero : byte := $30;		// 0 = hex 30
	cNumNine : byte := $39;		// 9 = hex 39

	begin converter;				//Begin converter
	// entry sequence
	// preserve registers --- EBX place on stack after pops
	mov( EBX, iRegisterValue );
	// acquire parameters on the stack
	pop( iReturnAddress );
	pop( iTemp ); // this is junk to align the stack
	pop( iTemp ); // this is myCharacter
	mov( iTemp, BX );
	mov( BL, myCharacter );
	// push back the return address
	push( iReturnAddress );
	// preserve registers --- EBX
	push( iRegisterValue );
	
	// perform subtask
	mov( cBigA, BL );
	mov( cBigZ, BH );
	mov( cLittlea, CL );
	mov( cLittlez, CH );
	mov( cNumZero, DL );
	mov( cNumNine, DH );				
	mov( AL, myCharacter );
	
	cmp( AL, DL );				//Compare myCharacter (AL) to "0" (DL)
	jg IsItANumber;
	jmp ItsSomethingElse;
	
	IsItANumber:
	cmp( AL, DH );
	jl ItsANum;
	jmp IsItUPPERCASE;
	
	IsItUPPERCASE:
	cmp( AL, BL );
	jg IsItStillUPPERCASE;
	jmp ItsSomethingElse;
	
	IsItStillUPPERCASE:
	cmp( AL, BH );
	jl ItsUPPERCASE;
	jmp IsItLowercase;
	
	IsItLowercase:
	cmp( AL, CL );
	jg IsItStillLowercase;
	jmp ItsSomethingElse;
	
	IsItStillLowercase:
	cmp( AL, CH );
	jl ItsLowercase;
	jmp ItsSomethingElse;
	
	ItsSomethingElse:
	mov( $5F, AL );
	jmp ExitSequence;
	
	ItsANum:
	mov( $21, AL );
	jmp ExitSequence;
	
	ItsUPPERCASE:
	and( %1101_1111, AL );
	jmp ExitSequence;
	
	ItsLowercase:
	or( %0010_0000, AL );
	jmp ExitSequence;
  	
  	ExitSequence:
	// exit sequence
	// pop all preserved registers --- BX
	pop( EBX );
	// send return value to AL
  	ret();
  	end converter;
  	
begin charConverter;
stdout.put( "Feed Me: " );
// always a good idea to flush buffer before reading
stdin.flushInput();
stdin.getc();
mov( 0, BX ); 	
mov( iValue, BL );
push( BX );
mov( 0, BX ); 	
push( BX );
call converter;
stdout.put( "converted that's " );
stdout.putc( AL );
stdout.put( nl );
end charConverter;

1 Ответов

Рейтинг:
2

Jochen Arndt

Функция возвращает результат в AL. Но EAX-это общий рабочий каталог, и поэтому он должен быть сохранен в другом месте, когда вы делаете что-то еще между ними; особенно при вызове функций.

Непроверенный (я не очень хорошо знаю HLA):

convChar : byte;
call converter;
// Save AL to a variable
mov( AL, convChar );
// This will modify EAX
stdout.put( "converted that's " );
stdout.putc( convChar );