Здравствуйте, задание вводится с клавиатуры строка и позиция в строке, с которой надо отрезать строку : Код (Text): INCLUDE Irvine32.inc BUFMAX = 128 ; максимальный размер буфера .data buffer BYTE BUFMAX DUP(0) number BYTE ? .code main PROC call ClrScr ;очистить экран mov edx,OFFSET buffer ;загрузим адрес буфера mov ecx,SIZEOF buffer - 1 ;загрузим максимальное количество символов call ReadString ;введем строку А mov edx,OFFSET buffer ;отобразим введенную строку А call CrLf call WriteString call ReadChar ;получим позицию, с которой присоединим второю строку mov number,al mov eax,number mov ecx,SIZEOF buffer - 1 mov esi,0 L1: mov al,buffer[esi] inc esi cmp eax,ecx jl L1 mov edx, OFFSET buffer ;отобразим полученную строку A call WriteString call CrLf call WaitMsg exit main ENDP END main Ругается на строчку Код (Text): cmp eax,ecx и выдает ошибку assembler.asm(60) : error A2070: invalid instruction operands. Ведь cmp позволяет операцию register, register..Помогите пожалуйста)
надо, Вася, надо(с). объяви в нач через Begin, не надо юзать main несколько раз .code fn1_a proc ddfff:dword xor eax,eax ret fn1_a endp fn2_a proc ddfff:dword xor eax,eax dec eax ret fn2_a endp Begin: Main proc push dword ptr 0 call fn1_a push dword ptr 2 call fn2_a ret Main endp end Begin
kernel16 не путайте человека, всё он правильно написал Но я бы не стал всё же точку входа ставить на процедуру. Пусть лучше указывает на глобальную метку, за которой стоит вызов основной процедуры, либо просто избавиться от proc/endp.
Serjuk говорит о том, что ошибка в шестидесятой строке, а у Вас в исходнике их 34. В чём подвох? И прокомментируйте, пожалуйста, что вы хотите добиться в цикле, ибо там какой-то, простите, бред.
И напрасно. Если кто забыл, имя процедуры в MASM также является и меткой, так что вставлять ещё одну нет никакой необходимости. Другое дело, что функция main() подразумевает наличие аргументов argc,argv. В C++ она вызывается из стартапа, но сама не является стартовой. Поэтому лучше использовать имя Start, а не main: Start proc ................. бла-бла-бла ................. exit Start endp end Start Так где 60-я строка? ))) Вообще-то, movzx eax,number! А в цикле - полный бред, проц сломается.
я просто код неполностю выложил ) так как программу еще не дописал В цикле хочу обрезать строку элементов с заданного номера в этой строке. Т.е. если задать позицию 4 и строку aabbcc то на выходе должны получить aabb вот полный Код (Text): TITLE laba_assembler (laba_assembler.asm) INCLUDE Irvine32.inc LF = 0Ah ; перевод строки CR = 0Dh ;возврат каретки BUFMAX = 128 ; максимальный размер буфера .data str1 BYTE "vvedite dannyy ctroky A:",CR,LF,0 str3 BYTE "vvedite dannyy podctroky B:",CR,LF,0 str2 BYTE "vvedite cimvol c kotorogo prouzoudet podcoedinenie ctroki B k ctroke A:", CR,LF,0 ; str3 BYTE "Polychennaya ctroka:",CR,LF,0 buffer BYTE BUFMAX DUP(0) buffer1 BYTE BUFMAX DUP(0) ;ArrayString BYTE 50 DUP(0) ;String BYTE ? ;myString BYTE ? number BYTE ? .code main PROC call ClrScr ;очистить экран mov edx, OFFSET str1 ;выведем на экран строку str1 call WriteString mov edx,OFFSET buffer ;загрузим адрес буфера mov ecx,SIZEOF buffer - 1 ;загрузим максимальное количество символов call ReadString ;введем строку А mov edx,OFFSET buffer ;отобразим введенную строку А call CrLf call WriteString ;-------------------------- mov edx,OFFSET str2 ;выведем на экран строку str2 call WriteString call ReadChar ;получим позицию, с которой присоединим второю строку mov number,al ;call WriteChar ;---------------------- ;mov edx, OFFSET str3 ;выведем на экран строку str2 ;call WriteString ;mov edx,OFFSET buffer1 ;загрузим адрес буфера ;mov ecx,SIZEOF buffer1 - 1 ;загрузим максимальное количество символов ;call ReadString ;введем строку А ;mov edx,OFFSET buffer1 ;отобразим введенную строку B ;call WriteString ;---------------цикл копирования----- mov eax,number mov ecx,SIZEOF buffer - 1 mov esi,0 L1: mov al,buffer[esi] inc esi cmp eax,ecx jl L1 mov edx, OFFSET buffer call WriteString call CrLf call WaitMsg exit main ENDP END main
Так в чём проблема? Я так понял, что строка загружается в массив buffer с длиной BUFMAX. Допустим искомая позиция в переменной Position типа DWORD, тогда: Код (Text): mov ecx,BUFMAX mov edx,ecx mov edi,offset buffer xor eax,eax repne scasb ;ищем конец строки jne OutOfBuf ;защита от выхода за пределы буфера sub edx,ecx dec edx ;в EDX - длина строки mov ecx,Position cmp ecx,edx ja OutOfStr ;позиция больше длины строки mov buffer[ecx],al ;собственно обрезаем строку jmp Next OutOfBuf: бла-бла-бла jmp Next OutOfStr: бла-бла-бла Next: ....................
Попробовал: Код (Text): TITLE laba_assembler (laba_assembler.asm) INCLUDE Irvine32.inc LF = 0Ah ; перевод строки CR = 0Dh ;возврат каретки BUFMAX = 128 ; максимальный размер буфера .data str1 BYTE "vvedite dannyy ctroky A:",CR,LF,0 str3 BYTE "vvedite dannyy podctroky B:",CR,LF,0 str2 BYTE "vvedite cimvol c kotorogo prouzoudet podcoedinenie ctroki B k ctroke A:", CR,LF,0 ; str3 BYTE "Polychennaya ctroka:",CR,LF,0 buffer BYTE BUFMAX DUP(0) buffer1 BYTE BUFMAX DUP(0) Position DWORD ? .code main PROC call ClrScr ;очистить экран mov edx, OFFSET str1 ;выведем на экран строку str1 call WriteString mov edx,OFFSET buffer ;загрузим адрес буфера mov ecx,SIZEOF buffer - 1 ;загрузим максимальное количество символов call ReadString ;введем строку А mov edx,OFFSET buffer ;отобразим введенную строку А call CrLf call WriteString ;-------------------------- mov edx,OFFSET str2 ;выведем на экран строку str2 call WriteString call ReadChar ;получим позицию, с которой присоединим второю строку mov Position,al ;call WriteChar ;---------------------- ;mov edx, OFFSET str3 ;выведем на экран строку str2 ;call WriteString ;mov edx,OFFSET buffer1 ;загрузим адрес буфера ;mov ecx,SIZEOF buffer1 - 1 ;загрузим максимальное количество символов ;call ReadString ;введем строку А ;mov edx,OFFSET buffer1 ;отобразим введенную строку B ;call WriteString ;---------------цикл копирования----- mov ecx,BUFMAX mov edx,ecx mov edi,offset buffer xor eax,eax repne scasb ;ищем конец строки jne OutOfBuf ;защита от выхода за пределы буфера sub edx,ecx dec edx ;в EDX - длина строки mov ecx,Position cmp ecx,edx ja OutOfStr ;позиция больше длины строки mov buffer[ecx],al ;собственно обрезаем строку jmp Next OutOfBuf: ; бла-бла-бла jmp Next OutOfStr: ; бла-бла-бла Next: mov edx, OFFSET buffer call WriteString call CrLf call WaitMsg exit main ENDP END main выдает ошибку : ругается на строчку mov Position,al
Serjuk Код (Text): mov Position, al Position - DWORD al - BYTE Код (Text): and eax, 0x000000FF mov Position, eax
заменил строчку Код (Text): mov Position,al на Код (Text): and eax, 0x000000FF mov Position, eax и теперь ругается на: Код (Text): and eax, 0x000000FF говорит: assembler.asm(38) : error A2206: missing operator in expression