Всем привет. Я просто не понимаю в чем дело? Подскажите плиз! Есть код, считает длину строки, ну до того пока 0 не появится. Код (Text): GetLen PROC lpStr:LPSTR xor eax,eax mov edx,lpStr .while TRUE mov bl,BYTE PTR[xxxxxxx] .break .if bl==0 inc eax inc edx inc lpStr .endw ret GetLen ENDP Если вместо xxxxxxx поставить edx, то все работает, а если поставить lpStr, то ничего не работает!!! Как так может быть?
Потому что [РЕГИСТР] обозначает обращения к памяти по адресу, записанному в регистре, а [ПЕРЕМЕННАЯ] - к переменной, т.к. ассемблер вместо имени подставит адрес. Эквивалентно [offset ПЕРЕМЕННАЯ]. Вообще синтаксис MASM не требует обязательной постановки скобок при обращении к переменной, иногда вводя путаницу.
Vov4ick Lex2029 Говоря проще, ПЕРЕМЕННАЯ и [ПЕРЕМЕННАЯ] -- это одно и то же, а вот РЕГИСТР и [РЕГИСТР] -- разные вещи. В случае с переменной в обоих случаях произойдёт обращение к области памяти, занимаемой этой переменной (в приведённом выше примере -- к указателю на строку), а вот с регистрами явная разница: без скобок обращение происходит к содержимому самого регистра, а со скобками -- к ячейке памяти, адрес которой содержит в этом регистре.
SII Только в масме. В "правильном" ассемблере var будет означать адрес переменной, а [var] - значение по этому адресу. Собственно, в reg также может лежать адрес чего-либо, тогда [reg] - значение по этому адресу, что эквивалентно операциям с переменными.
IceStudent Знаем, знаем про особенности NASM. В определённой степени это действительно удобнее: наблюдается единобезобразие в записи операндов. Но человек-то, как видно из примера, говорил про MASM.
Код (Text): GetLen PROC lpStr:LPSTR xor eax,eax mov edx,offset lpStr; вариант lea edx,lpStr .while TRUE mov bl,BYTE PTR[edx+eax] .break .if bl==0 inc eax .endw ret GetLen ENDP или так Код (Text): GetLen PROC lpStr:LPSTR xor eax,eax .while TRUE mov bl,BYTE PTR[eax+lpStr] .break .if bl==0 inc eax .endw ret GetLen ENDP а ещё вот так Код (Text): mov esi,offest lpStr s_check: lodsb test al, al jne s_check sub esi,offset lpStr+1 и так Код (Text): mov edi, offest lpStr xor al, al s_check: scasb jne s_check sub edi,offest lpStr+1 или совсем незатейливо Код (Text): mov edi, offest lpStr xor al, al or ecx,-1 repne scasb not ecx