Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.11.2017, 22:40   #1
slyscrat
Новичок
Джуниор
 
Регистрация: 04.11.2017
Сообщений: 1
По умолчанию Почему при прогоне через дебаггер получаю другой результат

Есть программа в двух модулях, обрабатывающая far функция находится во втором модуле. При прогоне через CV в DosBox возвращается обработанная строка (A7654321), если же просто запустить .exe то получаю строку с нулями. Что нужно исправить, дабы без дебаггера получать ожидаемый результат? Модули и листинг прилагаются. Заранее спасибо за помощь
Изображения
Тип файла: jpg question.jpg (78.6 Кб, 128 просмотров)
Вложения
Тип файла: txt try.txt (743 байт, 132 просмотров)
Тип файла: txt try1.txt (554 байт, 139 просмотров)
slyscrat вне форума Ответить с цитированием
Старый 05.11.2017, 14:25   #2
FPaul
Форумчанин
 
Регистрация: 25.01.2015
Сообщений: 472
По умолчанию

Если работаете в DOS - то у вас будут 16-разрядные адреса.
Т.е. нет и не будет
Код:
lea eax, result
возможно ТОЛЬКО
Код:
lea ax, result
Нет pushad, есть pusha. Нет 32-разрядных регистров, есть только 16-разрядные. И так далее.
Т.е. всё нужно переписать.
FPaul вне форума Ответить с цитированием
Старый 05.11.2017, 17:17   #3
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Цитата:
Сообщение от FPaul Посмотреть сообщение
Нет 32-разрядных регистров, есть только 16-разрядные.
Вы, простите Turbo Debugger под DOS давно открывали?
Изображения
Тип файла: png td.PNG (14.2 Кб, 48 просмотров)
Black Fregat вне форума Ответить с цитированием
Старый 05.11.2017, 20:57   #4
FPaul
Форумчанин
 
Регистрация: 25.01.2015
Сообщений: 472
По умолчанию

Black Fregat, хорошо - вы меня уели...

Дальше что? Вы помогли этим топикстартеру? Или, всё же, помощь ему состоит в объяснении, что в коде смешался 16 и 32 разрядный код и всё нужно переписать?

Если я не прав - подскажите ТС'у строку с ошибкой, как её исправить. А я вместе с ТС поучусь у вас.
FPaul вне форума Ответить с цитированием
Старый 05.11.2017, 23:26   #5
FPaul
Форумчанин
 
Регистрация: 25.01.2015
Сообщений: 472
По умолчанию

После исправления смешения разрядности кода получается
Код:
.MODEL	small
extrn dwordToStr:far

_STACK SEGMENT PARA STACK 'stack'
 	DB 100h DUP(?)
_STACK ENDS

mPrintString macro string:REQ
	mov 	ah, 09h
	mov 	dx,OFFSET string
	int 	21h
endm

DATA SEGMENT PARA PUBLIC 'data'
	source 	dd 0A7654321h
	result 	db 9 dup ('$')
	template db '0123456789ABCDEF'
DATA ENDS

CODE SEGMENT PARA PUBLIC 'code'
	ASSUME CS: CODE, DS: DATA, SS: _STACK

.386
START:
		MOV	AX, DATA
		MOV	DS, AX
		MOV	ES, AX

		mov	ax, seg [template]
		push	ax
		lea	ax, [template]
		push 	ax
		mov	ax, seg [result]
		push	ax
		lea 	ax, [result]
		push	ax
		mov	ax, seg [source]
		push	ax
		lea	ax, [source]
		push	ax

		call 	dwordToStr
		add	sp,	12

		mPrintString result

		MOV		AX, 4C00h				; the exit fuction  [4C+no error (00)]
		INT		21h						; call DOS interrupt 21h
		CODE ENDS
END START
Код:
PUBLIC dwordToStr

CODE1 SEGMENT
	  ASSUME CS:CODE1
.386

dwordToStr proc far
	;кадр стека
	push	bp		;+18
	mov 	bp, sp
	;сохранение используемых регистров
	pusha			;+16=+34
	push	ds
	push	es		;+38

	lds	si, [bp+6]	; ptr source
	les 	di, [bp+10]	; ptr result
	add	di,	2*4-1	; запись в строку с конца
	mov	cx,	4
ForEachByte:
	; считываем очередной байт
	mov	al, [si]
	inc	si
	; загружаем адрес таблицы преобразований
	mov	dx, ds		;сохраняем ds
        lds     bx, [bp+14]
	;преобразования нибблов
        mov     ah, al
        and     al, 0fh
        xlat
        mov     es:[di], al
	dec	di

        mov     al, ah
	shr	al, 4
        and     al, 0fh
        xlat
        mov     es:[di], al
	dec	di

	mov	ds, dx		; восстанавливаем ds
loop	ForEachByte

	pop	es
	pop	ds
	popa
	pop	bp
ret
dwordToStr endp

CODE1 ENDS

END
Передача параметров в процедуру через дальние указатели (сегмент и смещение). Можно обойтись и смещением, но тогда слегка изменить вызов и взятие адресов в процедуре.
FPaul вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C# Почему при поиске моды числа выдает неверный результат? Вероника99 Помощь студентам 1 18.05.2016 06:31
Почему при указании пути через имя компа сканирование не проходит, а через IP - проходит? Oxidous Операционные системы общие вопросы 2 16.03.2016 11:00
через API получаю полный путь и название процесса, а получаю только название процесса Den7656 Win Api 5 12.09.2011 09:03
почему вылетает ошибка при передачи файлов через цокет leonw Работа с сетью в Delphi 6 19.01.2010 22:16