Консультация № 116256
28.12.2007, 21:45
0.00 руб.
0 1 1
Товарищи, очень прошу помочь разобраться в чём причина неработы данной программы
в формате exe.

Проблема заключается в том, что при проверке содержимиого регистра aex у нас,
в случае, когда eax=1, то идёт выход с написанием сообщения. Но у меня это не так,т.е. проверка вроде бы идёт, проверили, что буффер у нас маленький, поместили в eax 1, возвращаемся в program.asm, обрабатываем ситуацию и никакое сообщение в .exe не выводится... Подскажите, пожалуйста, что не так.



Приложение:
Сам текст задачи и требования к ней:Программа должна быть написана на TASM для процессора 80386 в реальном режиме, компилироваться транслятором и собираться компоновщиком в Microsoft Macro Assembler 6.0 без предупреждений и файл формата EXE в WindowsПрограмма должна состоять минимум из двух модулей, один из которых содержит пример вызова данной функции с выводом результата на экран и ещё один содержит интерфейс, который сооветствует поставленному заданиюПри входе в процедуру должны сохраняться, а при выходе восстанавливаться значения всех регистров, которые не описаны в выходных параметрах.Задача: Осуществить преобразование шестнадцатиричного числа в строку; func.inc; Набор ф-ций: - HexToStr (преобразование числа к строке); - Power (возведение в степень); - HexToChar (преобразование цифры к символу);____________________________________________________________; Процедура переводящая 16-тиричное 8 значное число в строку символов ; Вход: eax - число; ecx - размер буфера; es:edi - буфер; Выход: если eax = 0 - успешно; [es:edi] - адрес след-го символа; если eax = 1 - неуспешноHexToStr proc push ebx push ecx push edx cmp ecx, 8 ; Если размер буффера < 8 JB @@BufferTooSmall ; то выходим с ошибкой mov ecx, 7@@Loop: ; Цикл работы с цифрами 16-ичного ; числа начиная со старшей mov ebx, 16 CALL Power ; Возводим число 16 в степень ; соотв номеру разряда mov edx, 0 div ebx ; Делим на него число ; В остатке получили 16-ичную цифру CALL HexToChar ; Переводим 16-ти цифры к символу mov es:[edi], al ; Помещаем символ в буфер inc edi ; и переходим к следующему cmp ecx, 0 JZ @@EndLoop mov eax, edx dec ecx JMP @@Loop@@EndLoop: mov eax, 0 JMP @@EndProc@@BufferTooSmall: mov eax, 1@@EndProc: pop edx pop ecx pop ebx RETHexToStr endp;____________________________________________________________;Возведение числа в степень; Вход: ebx - число; ecx - степень; Выход: ebx - результатPower proc push eax push ecx push edx mov eax, 1@@Loop1: ; Цикл умнож-я на входное число cmp ecx, 0 ; выполняющ-ся число раз, равное вх. степени JZ @@EndLoop1 mul ebx dec ecx JMP @@Loop1@@EndLoop1: mov ebx, eax pop edx pop ecx pop eax RETPower endp;____________________________________________________________; Преобразование 16-ичной цифры к символу; Вход: al - 16-ричная цифра; Выход: al - соотв-й символHexToChar proc cmp al, 10 JAE @@IsLetter add al, ‘0‘ JMP @@EndProc1 @@IsLetter: add al, ‘A‘-10 @@EndProc1: RETHexToChar endpЗдесь привожу пример программы, вызывающую func.inc:.386TEXT SEGMENT use16 ASSUME cs:TEXT,ds:DATA,ss:STK _start: mov ax,Data ;DATA mov ds,ax lea esi,buffer push 08765432Ah call hex2str cmp eax,1 ;proverim na neuspeh JZ @@1 mov Byte ptr es:[esi], ‘$‘ mov ah,9 mov dx,offset buffer loop @@no @@1:;assume ds:data1 ;mov ax,Data1 mov ah,9 mov ds,ax lea dx,msg int 21h mov ax,4c00h int 21h @@no: int 21h mov ax,4c00h int 21h include 1.incTEXT ENDSDATA SEGMENT use16 buffer db 9 dup (‘$‘) msg db "Hello $"DATA ENDS STK SEGMENT STACK use16 db 4096 dup (?)STK ENDS END _start

Обсуждение

давно
Посетитель
7438
7205
29.12.2007, 10:21
общий
это ответ
Здравствуйте, AlariKwerlast!
Некорректности в вызывающей программе, смотри в приложении.
Func.inc не проверял. Если что, пиши в мини-форум


Приложение:
_start: mov ax,Data ;DATA mov ds,ax mov es,ax ; буфер-то es:si ... mov ecx,8 ; в подпрограмме ждем длину буфера... lea esi,buffer push 08765432Ah call hex2str cmp eax,1 ;proverim na neuspeh JZ @@1 mov Byte ptr es:[esi], \‘$\‘ mov ah,9 mov dx,offset buffer jmp @@no ; зачем здесь loop? (хотя loop работает тоже) ; loop @@no @@1: ;assume ds:data1 ;mov ax,Data1 mov ah,9 ; mov ds,ax ; вот из-за этого и не было строки! ; команда не нужна вовсе. Регистры проинициализированы заранее lea dx,msg @@no: ; можно перенести сюда, хотя, конечно, ошибки в этом нет int 21h mov ax,4c00h int 21h ; @@no: ; int 21h ; mov ax,4c00h ; int 21h
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа