Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

поиск конца строки

22K
18 декабря 2009 года
FloyDos
81 / / 14.08.2009
gh - переменная типа dd, содержащая адрес выделенной динамически памяти, в которую загружается содержимое текстового файла.
необходимо вывести файл построчно с помощью функции TextOut
в цикле:
Код:
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


xt, yt- координаты вывода.
в результате выводит в одну строку все,и символы перевода строки тоже выводит=(((((((
не подскажете, в чем проблема?
7
19 декабря 2009 года
@pixo $oft
3.4K / / 20.09.2006
Во-первых,ваш код выведет только 1 символ.Где цикл,напрашивается вопрос!?
Далее:сравнивая с 0ah,вы чего добиваетесь?Код конца строки в Windows(а это Windows,я не сомневаюсь!)–0dh,0ah.Соответственно,надо сравнивать с 0dh(1),а после сравнения увеличивать gh на 2,а не на 1
В-третьих,зачем такой изврат с
 
Код:
mov al, byte ptr [gh]
cmp al, 0ah
?Проще написать Cmp Byte Ptr[gh],0Dh(дааа,так можно писать!) и не мучать мозг
И да,для увеличения на 1 лучше использовать Inc
И самое последнее(и,наверное,самое главное):допустим,я вам верю,что любой символ у вас занимает квадрат 10x10,НО…Вычитая из xt 10,вы смещаете позицию на 10 пикселей влево,только и всего.А надо сделать начало новой строки,поэтому Mov xt,0.Так-то!
P.S.Нигде не написано,что в ESI хранится hDC!;)

Так вот,пофиксите код с вышеуказанными замечаниями,и,если уж не будет работать,подумаем посильнее:)
22K
19 декабря 2009 года
FloyDos
81 / / 14.08.2009
Пробовала уже и 0dh, и сравнивать непосредственно без перемещения в al - хотя это то же самое, но чем черт не шутит)
Вот весь код:
Код:
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


Может тут в адресации дело? Впечатление что он в принципе не видит кодов символов - с чем только не сравнивала значение Byte ptr [gh], все что-то не то. на jne переходит на новую строку каждый раз, но мне - то нужно строки выводить, а не символы в столбик.
Да, buff -имя файла
260
19 декабря 2009 года
Ramon
1.1K / / 16.08.2003
Выделять младший байт из лежащего в памяти указателя не хорошо. Да и прироста производительности не будет.
22K
20 декабря 2009 года
FloyDos
81 / / 14.08.2009
Почему из указателя?
По идее, я же к области памяти обращаюсь, а не к указателю.
260
20 декабря 2009 года
Ramon
1.1K / / 16.08.2003
Код:
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
22K
22 декабря 2009 года
FloyDos
81 / / 14.08.2009
оу

Нам препод именно так объяснял, вроде того что это обращение именно к буферу. А вы утверждаете иное.

а как же тогда обратиться к буферу через указатель?
260
22 декабря 2009 года
Ramon
1.1K / / 16.08.2003
Сначала загрузив его в регистр:

 
Код:
mov esi,gh
cmp byte ptr [esi], 0Dh


PS: Переменная по сути это ее адрес, а двух разыменований в одной инструкции как правило не бывает.
PS2: Запись mov esi,gh эквивалентна mov esi,dword ptr [gh]
PS3: Все вышеперечисленное из расчета на MASM'овский синтаксис
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог