mov al, byte ptr [gh]
cmp al, 0ah
je addy
push 1
push gh
push yt
push xt
push esi
call TextOutA@20
add xt,14
jmp feaa
addy:
add yt,10
sub xt,10
feaa:
add gh,1
поиск конца строки
необходимо вывести файл построчно с помощью функции TextOut
в цикле:
Код:
xt, yt- координаты вывода.
в результате выводит в одну строку все,и символы перевода строки тоже выводит=(((((((
не подскажете, в чем проблема?
Далее:сравнивая с 0ah,вы чего добиваетесь?Код конца строки в Windows(а это Windows,я не сомневаюсь!)–0dh,0ah.Соответственно,надо сравнивать с 0dh(1),а после сравнения увеличивать gh на 2,а не на 1
В-третьих,зачем такой изврат с
Код:
mov al, byte ptr [gh]
cmp al, 0ah
cmp al, 0ah
И да,для увеличения на 1 лучше использовать Inc
И самое последнее(и,наверное,самое главное):допустим,я вам верю,что любой символ у вас занимает квадрат 10x10,НО…Вычитая из xt 10,вы смещаете позицию на 10 пикселей влево,только и всего.А надо сделать начало новой строки,поэтому Mov xt,0.Так-то!
P.S.Нигде не написано,что в ESI хранится hDC!;)
Так вот,пофиксите код с вышеуказанными замечаниями,и,если уж не будет работать,подумаем посильнее:)
Вот весь код:
Код:
push 0
push 0
push OPEN_EXISTING
push 0
push 0
push GENERIC_READ
push offset buff
call CreateFileA@28
cmp eax, -1
je exit
mov HF, eax
push offset sizeh
push eax
call GetFileSize@8
mov sizel, eax
push eax
push 0
call GlobalAlloc@8
cmp eax,0
je close
mov gh,eax
push 0
push offset fread
push sizel
push gh
push hf
call ReadFile@20
cmp eax,0
je close
push offset pnt
push dword ptr [EBP+08h]
call BeginPaint
mov esi,eax
mov ecx, dword ptr sizel
po:
push ecx
cmp byte ptr [gh], 0Dh
je addy
push 1
push gh
push yt
push xt
push esi
call TextOutA@20
add xt,10
jmp feaa
addy:
add yt,10
mov xt,100
inc gh
feaa:
inc gh
pop ecx
loop po
push offset pnt
push dword ptr [ebp+08h]
call EndPaint
free:
push gh
call GlobalFree@4
close:
exit:
push hf
call CloseHandle@4
push 0
push OPEN_EXISTING
push 0
push 0
push GENERIC_READ
push offset buff
call CreateFileA@28
cmp eax, -1
je exit
mov HF, eax
push offset sizeh
push eax
call GetFileSize@8
mov sizel, eax
push eax
push 0
call GlobalAlloc@8
cmp eax,0
je close
mov gh,eax
push 0
push offset fread
push sizel
push gh
push hf
call ReadFile@20
cmp eax,0
je close
push offset pnt
push dword ptr [EBP+08h]
call BeginPaint
mov esi,eax
mov ecx, dword ptr sizel
po:
push ecx
cmp byte ptr [gh], 0Dh
je addy
push 1
push gh
push yt
push xt
push esi
call TextOutA@20
add xt,10
jmp feaa
addy:
add yt,10
mov xt,100
inc gh
feaa:
inc gh
pop ecx
loop po
push offset pnt
push dword ptr [ebp+08h]
call EndPaint
free:
push gh
call GlobalFree@4
close:
exit:
push hf
call CloseHandle@4
Может тут в адресации дело? Впечатление что он в принципе не видит кодов символов - с чем только не сравнивала значение Byte ptr [gh], все что-то не то. на jne переходит на новую строку каждый раз, но мне - то нужно строки выводить, а не символы в столбик.
Да, buff -имя файла
Выделять младший байт из лежащего в памяти указателя не хорошо. Да и прироста производительности не будет.
По идее, я же к области памяти обращаюсь, а не к указателю.
Код:
push 0
push 0
push OPEN_EXISTING
push 0
push 0
push GENERIC_READ
push offset buff
call CreateFileA@28
cmp eax, -1
je exit
mov HF, eax
push offset sizeh
push eax
call GetFileSize@8
mov sizel, eax
push eax
push 0
call GlobalAlloc@8
cmp eax,0
je close
[COLOR="Red"]mov gh,eax[/COLOR] ; переменная gh - указатель на буфер
push 0
push offset fread
push sizel
push gh
push hf
call ReadFile@20
cmp eax,0
je close
push offset pnt
push dword ptr [EBP+08h]
call BeginPaint
mov esi,eax
mov ecx, dword ptr sizel
po:
push ecx
[COLOR="Red"]cmp byte ptr [gh], 0Dh[/COLOR] ; сравнение младшего байта указателя на буфер
je addy
push 1
push gh
push yt
push xt
push esi
call TextOutA@20
add xt,10
jmp feaa
addy:
add yt,10
mov xt,100
inc gh
feaa:
inc gh
pop ecx
loop po
push offset pnt
push dword ptr [ebp+08h]
call EndPaint
free:
push gh
call GlobalFree@4
close:
exit:
push hf
call CloseHandle@4
push 0
push OPEN_EXISTING
push 0
push 0
push GENERIC_READ
push offset buff
call CreateFileA@28
cmp eax, -1
je exit
mov HF, eax
push offset sizeh
push eax
call GetFileSize@8
mov sizel, eax
push eax
push 0
call GlobalAlloc@8
cmp eax,0
je close
[COLOR="Red"]mov gh,eax[/COLOR] ; переменная gh - указатель на буфер
push 0
push offset fread
push sizel
push gh
push hf
call ReadFile@20
cmp eax,0
je close
push offset pnt
push dword ptr [EBP+08h]
call BeginPaint
mov esi,eax
mov ecx, dword ptr sizel
po:
push ecx
[COLOR="Red"]cmp byte ptr [gh], 0Dh[/COLOR] ; сравнение младшего байта указателя на буфер
je addy
push 1
push gh
push yt
push xt
push esi
call TextOutA@20
add xt,10
jmp feaa
addy:
add yt,10
mov xt,100
inc gh
feaa:
inc gh
pop ecx
loop po
push offset pnt
push dword ptr [ebp+08h]
call EndPaint
free:
push gh
call GlobalFree@4
close:
exit:
push hf
call CloseHandle@4
Нам препод именно так объяснял, вроде того что это обращение именно к буферу. А вы утверждаете иное.
а как же тогда обратиться к буферу через указатель?
Код:
mov esi,gh
cmp byte ptr [esi], 0Dh
cmp byte ptr [esi], 0Dh
PS: Переменная по сути это ее адрес, а двух разыменований в одной инструкции как правило не бывает.
PS2: Запись mov esi,gh эквивалентна mov esi,dword ptr [gh]
PS3: Все вышеперечисленное из расчета на MASM'овский синтаксис