Quote:
|
Originariamente inviato da repne scasb
Nel caso di *(s+i) si tratta di un test zero/non_zero, se il compilatore ha l'indirizzo di 's' e la quantita' i posso aiutarlo con *(s+i) perche fara':
cmp [esi+eax],0
Se avessi scritto s[i], il compilatore avrebbe potuto ragionare nel seguente modo:
mov bl,[esi+eax]
or bl,bl
|
1) un giorno va a finire che senza volerlo di capita il compilatore anomalo che genera il doppio del codice che intendevi tu
2) su questo forum penso che siamo tutti d'accordo che il tuo codice è per almeno metà (spesso di più) difficilmente leggibile, e quindi difficilmente manutenibile (anche facendoci l'occhio).
Quote:
|
Nel caso s[i] sulla printf, il compilatore "deve" effettuare il push della quantita' s[i], che purtroppo e' un byte e per una limitazione dell'assembly 80x86 non si possono "pushare" byte sullo stack
|
non vorrei sbagliare, ma secondo me stai continuando a dimostrare di non sapere cosa significhi l'allineamento dello stack... tanto che prima lo confondevi col mantenimento!
il fatto che l'istruzione PUSH non possa decrementare ESP di 1 non è una limitazione, è una caratteristica ben motivata, a parte il fatto che se proprio vuoi spingere un solo byte nello stack puoi anche farlo: basta che fai DEC ESP e poi scrivi il byte in memoria, ma così per l'appunto disallinei lo stack

non che non si possa fare, solo che devi farci attenzione perché può essere pericoloso. a volte lo si fa anche apposta (esistono alcune tecniche di questo tipo per disorientare i debuggers, ma funzionano solo in user mode).