While Statement Example

C Code

#include 
void 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