C Code
#includevoid main() { int c; while ((c = getchar()) != EOF) { if (c == '\n') { putchar('\r'); } putchar(c); } }
Assembly Language
TITLE while.c .386P include listing.inc if @Version gt 510 .model FLAT else _TEXT SEGMENT PARA USE32 PUBLIC 'CODE' _TEXT ENDS _DATA SEGMENT DWORD USE32 PUBLIC 'DATA' _DATA ENDS CONST SEGMENT DWORD USE32 PUBLIC 'CONST' CONST ENDS _BSS SEGMENT DWORD USE32 PUBLIC 'BSS' _BSS ENDS _TLS SEGMENT DWORD USE32 PUBLIC 'TLS' _TLS ENDS FLAT GROUP _DATA, CONST, _BSS ASSUME CS: FLAT, DS: FLAT, SS: FLAT endif PUBLIC _main EXTRN __iob:BYTE EXTRN __filbuf:NEAR EXTRN __flsbuf:NEAR _TEXT SEGMENT _c$ = -4 _main PROC NEAR ; 2 : void main() { push ebp mov ebp, esp sub esp, 16 ; 00000010H $L338: ; 3 : int c; ; 4 : while ((c = getchar()) != EOF) { mov eax, DWORD PTR __iob+4 sub eax, 1 mov DWORD PTR __iob+4, eax cmp DWORD PTR __iob+4, 0 jl SHORT $L346 mov ecx, DWORD PTR __iob movsx edx, BYTE PTR [ecx] and edx, 255 ; 000000ffH mov DWORD PTR -8+[ebp], edx mov eax, DWORD PTR __iob add eax, 1 mov DWORD PTR __iob, eax jmp SHORT $L347 $L346: push OFFSET FLAT:__iob call __filbuf add esp, 4 mov DWORD PTR -8+[ebp], eax $L347: mov ecx, DWORD PTR -8+[ebp] mov DWORD PTR _c$[ebp], ecx cmp DWORD PTR _c$[ebp], -1 je $L339 ; 5 : if (c == '\n') { cmp DWORD PTR _c$[ebp], 10 ; 0000000aH jne SHORT $L349 ; 6 : putchar('\r'); mov edx, DWORD PTR __iob+36 sub edx, 1 mov DWORD PTR __iob+36, edx cmp DWORD PTR __iob+36, 0 jl SHORT $L348 mov eax, DWORD PTR __iob+32 mov BYTE PTR [eax], 13 ; 0000000dH mov ecx, 13 ; 0000000dH and ecx, 255 ; 000000ffH mov DWORD PTR -12+[ebp], ecx mov edx, DWORD PTR __iob+32 add edx, 1 mov DWORD PTR __iob+32, edx jmp SHORT $L349 $L348: push OFFSET FLAT:__iob+32 push 13 ; 0000000dH call __flsbuf add esp, 8 mov DWORD PTR -12+[ebp], eax $L349: ; 8 : putchar(c); mov eax, DWORD PTR __iob+36 sub eax, 1 mov DWORD PTR __iob+36, eax cmp DWORD PTR __iob+36, 0 jl SHORT $L350 mov ecx, DWORD PTR __iob+32 mov dl, BYTE PTR _c$[ebp] mov BYTE PTR [ecx], dl movsx eax, BYTE PTR _c$[ebp] and eax, 255 ; 000000ffH mov DWORD PTR -16+[ebp], eax mov ecx, DWORD PTR __iob+32 add ecx, 1 mov DWORD PTR __iob+32, ecx jmp SHORT $L351 $L350: push OFFSET FLAT:__iob+32 mov edx, DWORD PTR _c$[ebp] push edx call __flsbuf add esp, 8 mov DWORD PTR -16+[ebp], eax $L351: ; 9 : } jmp $L338 $L339: ; 10 : } mov esp, ebp pop ebp ret 0 _main ENDP _TEXT ENDS END