Ich hab dein Programm ein wenig modifiziert und im Simulator getestet.
Code:
.include "m8def.inc"
main:   
   ldi   r16,low(RAMEND)
   out   SPL,r16
   ldi   r16,high(RAMEND)
   out   SPH,r16






   ldi   r16,0xFF
   out   DDRB,r16


   ldi   r17,0x00
   out   DDRC,r17




loop:

   ldi   r16,0x01
   out   PORTB,r16
   
   in   r17,PINC


   cp   r16,r17

   breq   mainloop

   rjmp   loop


;------------------------------------------------------------------------
mainloop:   wdr
   ldi   r16,0b11101111
   out   PORTB,r16

   rjmp   mainloop
Zuerst wird auf Port B der Wert 0x01 ausgegeben.
Und zwar so lange bis der Pin C.0 High wird.
Dann verzweigt das Programm in den Mainloop, aus dem es nie wieder zurückkommt.
Ist noch zusätzlich ein anderer PIN des Port C aktiv bleibt das Programm in der Schleife loop:
Was soll denn nun das Progrämmchen machen ?

Nichts desto trotz solltest Du die beschriebenen Verbesserungen deines Programmcodes machen.
Du möchtest ja auch mal schwierigere Sachen in Assembler basteln.
Es sein denn es handelt sich hierbei um inline Code für einen Compiler.
Da musst Du dann aber das Handbuch deines Compilers befragen, welche Register für Assembler nutzbar sind.
Die Infromationen, die Du uns hier gibst sind leider etwas mager.