Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm: Общие вопросы > Сравнение строк


Автор: ring0D 19.11.2005, 14:55
Здравствуйте, подскажите как можно сравнить две строки, и в случае если они одниковы перейти на метку NEXT. И вообще можете написать команды перехода, и их значения (je, jnz ....)

Автор: rsm 19.11.2005, 15:57
Код

; compile and link with:
;    nasmw -fobj cmpstr.asm
;    alink -oPE cmpstr win32.lib

[extern MessageBoxA]
[extern ExitProcess]

[segment data use32]
    
    str1 db "String1",0
    str2 db "String2",0
    
    msg_equals db "Equals!",0
    msg_not_equals db "Not equals!",0
    
[segment code use32]
..start:

    mov esi,str1        ; помещаем адрес строки str1 в esi
    mov edi,str2        ; помещаем адрес строки str2 в edi
compare:
    mov ah,byte [esi]    ; берем символ из строки str1
    mov al,byte [edi]    ; берем символ из строки str2
    cmp ah,al            ; сравниваем их
    jne not_equal        ; если не равны, прыгаем на метку not_equal
    test ah,al            ; мы дошли до конца строки (символ равен нулю)?
    jz equal            ; если дошли, значит строки одинаковы, прыгаем на метку equal
    inc esi                ; увеличиваем esi
    inc edi                ; увеличиваем edi
    jmp compare            ; прыгаем на метку compare

not_equal:                ; строки не равны
    mov eax,msg_not_equals
    jmp showmsg
    
equal:                    ; строки равны
    mov eax,msg_equals
    
showmsg:    
    push 0
    push 0
    push eax
    push 0
    call MessageBoxA    ; показываем результат сравнения

    push 0
    call ExitProcess


Про команды перехода см. Зубкова. Если не найдешь, напишу кратко.

Автор: ring0D 19.11.2005, 16:40
Не, почему то не прёт. Ошибку выдаёт. Пишу на MASM.

.data
Filez db "\ms.exe",0

.data?

SystemDir db 50 dup (?)
ProgzName db 512 dup (?)

.code

start:

push sizeof SystemDir
push offset SystemDir
call GetSystemDirectory

push sizeof ProgzName
push offset ProgzName
push NULL
call GetModuleFileName

push offset Filez
push offset SystemDir
call lstrcat

И после этого надо выполнить сранение : Запущена программа из системной папки или нет, в случае если нет продолжать дальше, если да перепрыгнуть на метку NEXT.

Автор: rsm 19.11.2005, 17:03
Цитата(ring0D @ 19.11.2005, 18:40)
И после этого надо выполнить сранение

Код

push offset SystemDir
push offset ProgzName
call lstrcmpi
test eax,eax
jz NEXT


Цитата(ring0D @ 19.11.2005, 18:40)
Пишу на MASM.

У меня код для NASM. Я думал тебе нужен сам алгоритм сравнения строк, а не готовое решение под конкретный компилятор.

Автор: ring0D 19.11.2005, 17:11
rsm огромное спасибо!!! Действительно работает. Ты был прав мне нужен алгоритм сравнения. Просто огромное количество книг по ассемблеру пишутся под ДОС. Но зачем ? если Дос "умер" десять лет назад ? Есть у меня книга Зубкова. Вот купил книгу Владислава Пирогова - хорошая книга, но для тех кто неплохо знает ассемблер, а как его выучить если всё под Дос.

Автор: Chingachguk 19.11.2005, 18:32
> Просто огромное количество книг по ассемблеру пишутся под ДОС.

В целом пока да, но дело немного меняется, тот же Пирогов (не фонтан имхо).

> Но зачем ?

Потому, что в досе гораздо легче понять компьютер, так как там несложно (с точки зрения компилляции и знания архитектуры OS) писать обработчики прерываний и т.п.

> если Дос "умер" десять лет назад ?

Ну до сих пор работает куча прог под дос, и нормально работает. Некоторые задачи вообще легче сделать в нем, чем в винде. Так что он не умер. С другой стороны, винда 3.11 вышла ранее 10 лет назад, так что умер еще раньше ;)

> Есть у меня книга Зубкова. Вот купил книгу Владислава Пирогова -
> хорошая книга, но для тех кто неплохо знает ассемблер, а как его
> выучить если всё под Дос.

Смотри сайт wasm.ru - который изначально ориентирован был на "Windows Assembly ...". Там ты поимеешь как работать с Win API, драйверами... Те будешь изучать "не ассмеблер вообще", а его приятное (для легкости кодинга) подмножество "кодирование на ассемблере в flat-модели Windows".

Также рекомендую изучать его на ассемблерных вставках в том же Делфи к примеру.

Автор: rsm 19.11.2005, 18:34
Цитата(ring0D @ 19.11.2005, 19:11)
огромное количество книг по ассемблеру пишутся под ДОС. Но зачем ? если Дос "умер" десять лет назад ?

Для меня это тоже большая загадка smile

Цитата(ring0D @ 19.11.2005, 19:11)
как его выучить если всё под Дос.

Ассемблер как таковой, сам по себе, язык достаточно простой - наиболее часто употребимых команд не так уж много, штук 50~60 (если не меньше). Но совершенно иной вопрос - применение Ассемблера. Вот тут все намного сложнее.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)