I am writing some code in X86 AT&T assembly for a class assignment. Individually I tested all of the functions and they work exactly as intended, but for some reason I get the warning in the title for literally every line in the code. Since the individual functions compiled when placed in their own files and there is nothing besides the functions, I don't really get what is wrong here. Please help.
I am writing it on 14.04 Ubuntu.
gcc -m32 -c pstring.s
pstring.s: Assembler messages:
pstring.s: Warning: end of file in string; '"' inserted
pstring.s:3: Warning: unterminated string; newline inserted
pstring.s:4: Warning: unterminated string; newline inserted
pstring.s:5: Warning: unterminated string; newline inserted
pstring.s:6: Warning: unterminated string; newline inserted
pstring.s:7: Warning: unterminated string; newline inserted
pstring.s:8: Warning: unterminated string; newline inserted
pstring.s:9: Warning: unterminated string; newline inserted
pstring.s:10: Warning: unterminated string; newline inserted
pstring.s:11: Warning: unterminated string; newline inserted
pstring.s:12: Warning: unterminated string; newline inserted
pstring.s:13: Warning: unterminated string; newline inserted
pstring.s:14: Warning: unterminated string; newline inserted
pstring.s:15: Warning: unterminated string; newline inserted
pstring.s:16: Warning: unterminated string; newline inserted
pstring.s:17: Warning: unterminated string; newline inserted
pstring.s:18: Warning: unterminated string; newline inserted
pstring.s:19: Warning: unterminated string; newline inserted
pstring.s:20: Warning: unterminated string; newline inserted
pstring.s:21: Warning: unterminated string; newline inserted
pstring.s:22: Warning: unterminated string; newline inserted
pstring.s:23: Warning: unterminated string; newline inserted
pstring.s:24: Warning: unterminated string; newline inserted
pstring.s:25: Warning: unterminated string; newline inserted
pstring.s:26: Warning: unterminated string; newline inserted
pstring.s:27: Warning: unterminated string; newline inserted
pstring.s:28: Warning: unterminated string; newline inserted
pstring.s:29: Warning: unterminated string; newline inserted
pstring.s:30: Warning: unterminated string; newline inserted
pstring.s:31: Warning: unterminated string; newline inserted
pstring.s:32: Warning: unterminated string; newline inserted
pstring.s:33: Warning: unterminated string; newline inserted
pstring.s:34: Warning: unterminated string; newline inserted
pstring.s:35: Warning: unterminated string; newline inserted
pstring.s:36: Warning: unterminated string; newline inserted
pstring.s:37: Warning: unterminated string; newline inserted
pstring.s:38: Warning: unterminated string; newline inserted
pstring.s:39: Warning: unterminated string; newline inserted
pstring.s:40: Warning: unterminated string; newline inserted
pstring.s:41: Warning: unterminated string; newline inserted
pstring.s:42: Warning: unterminated string; newline inserted
pstring.s:43: Warning: unterminated string; newline inserted
pstring.s:44: Warning: unterminated string; newline inserted
pstring.s:45: Warning: unterminated string; newline inserted
pstring.s:46: Warning: unterminated string; newline inserted
pstring.s:47: Warning: unterminated string; newline inserted
pstring.s:48: Warning: unterminated string; newline inserted
pstring.s:49: Warning: unterminated string; newline inserted
pstring.s:50: Warning: unterminated string; newline inserted
pstring.s:51: Warning: unterminated string; newline inserted
pstring.s:52: Warning: unterminated string; newline inserted
pstring.s:53: Warning: unterminated string; newline inserted
pstring.s:54: Warning: unterminated string; newline inserted
pstring.s:55: Warning: unterminated string; newline inserted
pstring.s:56: Warning: unterminated string; newline inserted
pstring.s:57: Warning: unterminated string; newline inserted
pstring.s:58: Warning: unterminated string; newline inserted
pstring.s:59: Warning: unterminated string; newline inserted
pstring.s:60: Warning: unterminated string; newline inserted
pstring.s:61: Warning: unterminated string; newline inserted
pstring.s:62: Warning: unterminated string; newline inserted
pstring.s:63: Warning: unterminated string; newline inserted
pstring.s:64: Warning: unterminated string; newline inserted
pstring.s:65: Warning: unterminated string; newline inserted
pstring.s:66: Warning: unterminated string; newline inserted
pstring.s:67: Warning: unterminated string; newline inserted
pstring.s:68: Warning: unterminated string; newline inserted
pstring.s:69: Warning: unterminated string; newline inserted
pstring.s:70: Warning: unterminated string; newline inserted
pstring.s:71: Warning: unterminated string; newline inserted
pstring.s:72: Warning: unterminated string; newline inserted
pstring.s:73: Warning: unterminated string; newline inserted
pstring.s:74: Warning: unterminated string; newline inserted
pstring.s:75: Warning: unterminated string; newline inserted
pstring.s:76: Warning: unterminated string; newline inserted
pstring.s:77: Warning: unterminated string; newline inserted
pstring.s:78: Warning: unterminated string; newline inserted
pstring.s:79: Warning: unterminated string; newline inserted
pstring.s:80: Warning: unterminated string; newline inserted
pstring.s:81: Warning: unterminated string; newline inserted
pstring.s:82: Warning: unterminated string; newline inserted
pstring.s:83: Warning: unterminated string; newline inserted
pstring.s:84: Warning: unterminated string; newline inserted
pstring.s:85: Warning: unterminated string; newline inserted
pstring.s:86: Warning: unterminated string; newline inserted
pstring.s:87: Warning: unterminated string; newline inserted
pstring.s:88: Warning: unterminated string; newline inserted
pstring.s:89: Warning: unterminated string; newline inserted
pstring.s:90: Warning: unterminated string; newline inserted
pstring.s:91: Warning: unterminated string; newline inserted
pstring.s:92: Warning: unterminated string; newline inserted
pstring.s:93: Warning: unterminated string; newline inserted
pstring.s:94: Warning: unterminated string; newline inserted
pstring.s:95: Warning: unterminated string; newline inserted
pstring.s:96: Warning: unterminated string; newline inserted
pstring.s:97: Warning: unterminated string; newline inserted
pstring.s:98: Warning: unterminated string; newline inserted
pstring.s:99: Warning: unterminated string; newline inserted
pstring.s:100: Warning: unterminated string; newline inserted
pstring.s:101: Warning: unterminated string; newline inserted
pstring.s:102: Warning: unterminated string; newline inserted
pstring.s:103: Warning: unterminated string; newline inserted
pstring.s:104: Warning: unterminated string; newline inserted
pstring.s:105: Warning: unterminated string; newline inserted
pstring.s:106: Warning: unterminated string; newline inserted
pstring.s:107: Warning: unterminated string; newline inserted
pstring.s:108: Warning: unterminated string; newline inserted
pstring.s:109: Warning: unterminated string; newline inserted
pstring.s:110: Warning: unterminated string; newline inserted
pstring.s:111: Warning: unterminated string; newline inserted
pstring.s:112: Warning: unterminated string; newline inserted
pstring.s:113: Warning: unterminated string; newline inserted
pstring.s:114: Warning: unterminated string; newline inserted
pstring.s:115: Warning: unterminated string; newline inserted
pstring.s:116: Warning: unterminated string; newline inserted
pstring.s:117: Warning: unterminated string; newline inserted
pstring.s:118: Warning: unterminated string; newline inserted
pstring.s:119: Warning: unterminated string; newline inserted
pstring.s:120: Warning: unterminated string; newline inserted
pstring.s:121: Warning: unterminated string; newline inserted
pstring.s:122: Warning: unterminated string; newline inserted
pstring.s:123: Warning: unterminated string; newline inserted
pstring.s:124: Warning: unterminated string; newline inserted
pstring.s:125: Warning: unterminated string; newline inserted
pstring.s:126: Warning: unterminated string; newline inserted
pstring.s:127: Warning: unterminated string; newline inserted
pstring.s:128: Warning: unterminated string; newline inserted
pstring.s:129: Warning: unterminated string; newline inserted
pstring.s:130: Warning: unterminated string; newline inserted
pstring.s:131: Warning: unterminated string; newline inserted
pstring.s:132: Warning: unterminated string; newline inserted
pstring.s:133: Warning: unterminated string; newline inserted
pstring.s:134: Warning: unterminated string; newline inserted
pstring.s:135: Warning: unterminated string; newline inserted
pstring.s:136: Warning: unterminated string; newline inserted
pstring.s:137: Warning: unterminated string; newline inserted
pstring.s:138: Warning: unterminated string; newline inserted
pstring.s:139: Warning: unterminated string; newline inserted
pstring.s:140: Warning: unterminated string; newline inserted
pstring.s:141: Warning: unterminated string; newline inserted
pstring.s:142: Warning: unterminated string; newline inserted
pstring.s:143: Warning: unterminated string; newline inserted
pstring.s:144: Warning: unterminated string; newline inserted
pstring.s:145: Warning: unterminated string; newline inserted
pstring.s:146: Warning: unterminated string; newline inserted
pstring.s:147: Warning: unterminated string; newline inserted
pstring.s:148: Warning: unterminated string; newline inserted
pstring.s:149: Warning: unterminated string; newline inserted
pstring.s:150: Warning: unterminated string; newline inserted
pstring.s:151: Warning: unterminated string; newline inserted
pstring.s:152: Warning: unterminated string; newline inserted
pstring.s:153: Warning: unterminated string; newline inserted
pstring.s:154: Warning: unterminated string; newline inserted
pstring.s:155: Warning: unterminated string; newline inserted
pstring.s:156: Warning: unterminated string; newline inserted
pstring.s:157: Warning: unterminated string; newline inserted
pstring.s:158: Warning: unterminated string; newline inserted
pstring.s:159: Warning: unterminated string; newline inserted
pstring.s:160: Warning: unterminated string; newline inserted
pstring.s:161: Warning: unterminated string; newline inserted
pstring.s:162: Warning: unterminated string; newline inserted
pstring.s:163: Warning: unterminated string; newline inserted
pstring.s:164: Warning: unterminated string; newline inserted
pstring.s:165: Warning: unterminated string; newline inserted
pstring.s:166: Warning: unterminated string; newline inserted
pstring.s:167: Warning: unterminated string; newline inserted
pstring.s:168: Warning: unterminated string; newline inserted
pstring.s:169: Warning: unterminated string; newline inserted
pstring.s:170: Warning: unterminated string; newline inserted
pstring.s:171: Warning: unterminated string; newline inserted
pstring.s:172: Warning: unterminated string; newline inserted
pstring.s:173: Warning: unterminated string; newline inserted
pstring.s:174: Warning: unterminated string; newline inserted
pstring.s:175: Warning: unterminated string; newline inserted
pstring.s:176: Warning: unterminated string; newline inserted
pstring.s:177: Warning: unterminated string; newline inserted
pstring.s:178: Warning: unterminated string; newline inserted
pstring.s:179: Warning: unterminated string; newline inserted
pstring.s:180: Warning: unterminated string; newline inserted
pstring.s:181: Warning: unterminated string; newline inserted
pstring.s:182: Warning: unterminated string; newline inserted
pstring.s:183: Warning: unterminated string; newline inserted
pstring.s:184: Warning: unterminated string; newline inserted
pstring.s:185: Warning: unterminated string; newline inserted
pstring.s:186: Warning: unterminated string; newline inserted
pstring.s:187: Warning: unterminated string; newline inserted
pstring.s:188: Warning: unterminated string; newline inserted
pstring.s:189: Warning: unterminated string; newline inserted
pstring.s:190: Warning: unterminated string; newline inserted
pstring.s:191: Warning: unterminated string; newline inserted
pstring.s:192: Warning: unterminated string; newline inserted
pstring.s:193: Warning: unterminated string; newline inserted
pstring.s:194: Warning: unterminated string; newline inserted
pstring.s:195: Warning: unterminated string; newline inserted
pstring.s:196: Warning: unterminated string; newline inserted
pstring.s:197: Warning: unterminated string; newline inserted
pstring.s:198: Warning: unterminated string; newline inserted
pstring.s:199: Warning: unterminated string; newline inserted
pstring.s:200: Warning: unterminated string; newline inserted
pstring.s:201: Warning: unterminated string; newline inserted
pstring.s:202: Warning: unterminated string; newline inserted
pstring.s:203: Warning: unterminated string; newline inserted
pstring.s:204: Warning: unterminated string; newline inserted
pstring.s:205: Warning: unterminated string; newline inserted
pstring.s:206: Warning: unterminated string; newline inserted
pstring.s:207: Warning: unterminated string; newline inserted
pstring.s:208: Warning: unterminated string; newline inserted
pstring.s:209: Warning: unterminated string; newline inserted
pstring.s:210: Warning: unterminated string; newline inserted
pstring.s:211: Warning: unterminated string; newline inserted
pstring.s:212: Warning: unterminated string; newline inserted
pstring.s:213: Warning: unterminated string; newline inserted
pstring.s:214: Warning: unterminated string; newline inserted
pstring.s:215: Warning: unterminated string; newline inserted
pstring.s:216: Warning: unterminated string; newline inserted
pstring.s:217: Warning: unterminated string; newline inserted
pstring.s:218: Warning: unterminated string; newline inserted
pstring.s:219: Warning: unterminated string; newline inserted
pstring.s:220: Warning: unterminated string; newline inserted
pstring.s:221: Warning: unterminated string; newline inserted
pstring.s:222: Warning: unterminated string; newline inserted
pstring.s:223: Warning: unterminated string; newline inserted
pstring.s:224: Warning: unterminated string; newline inserted
pstring.s:225: Warning: unterminated string; newline inserted
pstring.s:226: Warning: unterminated string; newline inserted
pstring.s:227: Warning: unterminated string; newline inserted
pstring.s:228: Warning: unterminated string; newline inserted
pstring.s:229: Warning: unterminated string; newline inserted
pstring.s:230: Warning: unterminated string; newline inserted
pstring.s:231: Warning: unterminated string; newline inserted
pstring.s:232: Warning: unterminated string; newline inserted
pstring.s:233: Warning: unterminated string; newline inserted
pstring.s:234: Warning: unterminated string; newline inserted
pstring.s:235: Warning: unterminated string; newline inserted
321123242 Nikolay Babkin
.section .rodata
error: .string "invalid input!\n' # error message.
.text
.global pstrlen #receives a pointer to a pstring as argument.
.type pstrlen, @function #returns the length as a byte.
pstrlen:
pushl %ebp #save old FP.
movl %esp, %ebp #set new FP.
movl 8(%ebp), %eax #retrieve pointer to pstring.
movb (%eax), %al #copy the first byte of the argument into %al
movzbl %al, %eax #Zero-fill the other 3 bytes of the register.
movl %ebp, %esp #restore the old stack pointer - release all used memory.
popl %ebp #restore old frame pointer (the caller function frame)
ret #return to caller function
.global replaceChar #receives a pointer to a pstring, a oldChar byte and a newChar byte as arguments.
.type replaceChar, @function #replaces all oldChars with newChars and returns the pointer to the pstring
replaceChar:
pushl %ebp #save old FP
movl %esp, %ebp #set new FP
pushl %ebx #save %ebx on stack
movl 8(%ebp), %eax #get the pstring pointer from the stack.
movb (%eax), %bh #retrieved the len of the pstring
addl $1, %eax #align the pointer to point to the string itself
movl 12(%ebp), %ecx #get the oldChar argument.
movb %cl, %dl #store oldChar in %dl
movl 16(%ebp), %ecx #get the newChar argument.
movb %cl, %dh #store newChar in %dh
movb $0, %bl #initialize count register to 1.
rcTEST:
cmpb %bh, %bl #Test
je rcDONE #if Test: goto done
rcLOOP: #loop label
cmpb %dl, (%eax) #compare the current byte to the oldChar byte
je rcCHANGE #jump to change the oldChar.
rcINCREMENT: #label for incrementing the current char and the count variable.
add $1, %bl #increment the count
add $1, %eax #increment the string pointer one byte.
jmp rcTEST #Don't want no infinite loops causing segmentation faults, do we?
rcCHANGE:
movb %dh, (%eax) #overwrite the oldChar with a newChar
jmp rcINCREMENT #move on with the loop mechanism
rcDONE:
mov 8(%ebp), %eax #set return value to be the pstring pointer.
popl %ebx #restore %ebx register.
movl %ebp, %esp #restore the old stack pointer - release all used memory.
popl %ebp #restore old frame pointer (the caller function frame)
ret #return to caller function
.global pstrijcpy
.type pstrijcpy, @function
pstrijcpy:
pushl %ebp #save old FP
movl %esp, %ebp #set new FP
#using eax, ebx, ech, edx,
pushl %ebx #back %ebx up.
movl 16(%ebp), %eax #the dword with i
movb %al, %bl #store i in %bl
movl 20(%ebp), %eax #the dword with j
movb %al, %bh #store j in %bh
movl 8(%ebp), %eax #initialize eax to dst ptr.
movb (%eax), %dh #%dh <- dst.len
addl $1, %eax #advance %eax by one byte to the string
movl 12(%ebp), %ecx #initialize ecx to src ptr.
mov (%ecx), %dl #%dl <- src.len
addl $1, %ecx #advance %ecx by one byte to the string
cmpb %dl, %bl #i-src.len
jg cpyERROR #if >: goto error
cmp %dl, %bh #j-src.len
jg cpyERROR #if >: goto error
cmpb %dh, %bl #i-dst.len
jg cpyERROR #if >: goto error
cmp %dh, %bh #j-dst.len
jg cpyERROR #if >: goto error
#now I will add i to the pointers that point to the strings.
push %edx #back edx up
movzbl %bl, %edx #apparently I can use 'movl %bl, %eax', so I did this.
addl %edx, %eax #advance dst to ith character
addl %edx, %ecx #advance src to ith character
popl %edx #restore edx
cpyTEST:
cmpb %bh, %bl #compare i with j
jg cpyDONE #once i is greater than j, we are done.
cpyLOOP:
movb (%ecx), %dl #Since I already checked that i and j <= the lengths, I can use them
movb %dl, (%eax) #Move byte from src to dst.
addl $1, %ecx #Increment src to next byte
addl $1, %eax #Increment dst to next byte
addl $1, %ebx #Increment i by 1.
jmp cpyTEST #goto test
cpyERROR: #don't need to back registers up.
pushl $error #push the message to be printed.
call printf #use printf to print error message
cpyDONE:
popl %ebx #restore %ebx
movl 8(%ebp), %eax #set return value to be dst pointer.
movl %ebp, %esp #restore the old stack pointer - release all used memory.
popl %ebp #restore old frame pointer (the caller function frame)
ret #return to caller function
.global swapCase #swaps the cases of the string.
.type swapCase, @function
swapCase:
pushl %ebp #save old FP
movl %esp, %ebp #set new FP
movl 8(%ebp), %eax #get pointer to pstring
movb (%eax), %cl #get length of pstring
addl $1, %eax #move pointer to string itself
scLTEST: #loop condition.
cmpb $0, %cl #compare length with 0
je scDONE #if length is zero, goto done
jmp scLOOP #else: goto loop
scLOOP:
cmpb $97, (%eax) #compares first byte of string with 'a'.
jge scTRYLOWER #byte is lowercase-possible.
cmpb $90, (%eax) #compares first byte of string with 'Z'.
jle scTRYUPPER #byte is uppercase-possible.
jmp scINC #byte is between 65 and 97, so not a letter.
scTRYUPPER: #checking if byte is really upper-case.
cmpb $65, (%eax) #compare byte with 'A'.
jge scCHANGETOLOWER #if byte is 'A' or after, it is upper-case, so change to lower-case.
jmp scINC #otherwise, it is below 'A' and is thus not a letter.
scTRYLOWER:
cmpb $122, (%eax) #compare byte with 'z'.
jle scCHANGETOUPPER #if it is before or at 'z', it is a lower-case letter.
jmp scINC #otherwise, it is over 'z' and not a letter.
scCHANGETOUPPER:
subb $32, (%eax) #reduce the byte from range [97,122] to [65,90]
jmp scINC
scCHANGETOLOWER:
addb $32, (%eax) #increase the byte to range [97,122] from [65,90]
#jmp scINC #for now, the jump is not necessary since the increment stage is already after it.
scINC:
addl $1, %eax #increment %eax to next byte
decb %cl #decrement counter
jmp scLTEST #end current loop iteration
scDONE:
movl 8(%ebp), %eax #set return value to pointer to pstring.
movl %ebp, %esp #restore old stack pointer
popl %ebp #restore old FP
ret #return to caller function
.global pstrijcmp #compares pstring1 and pstring 2 in range i to j.
.type pstrijcmp, @function #returns -1 if pstring1 < pstring2, 0 if equal and 1 if greater. -2 is error value.
pstrijcmp:
pushl %ebp #save old FP
movl %esp, %ebp #set new FP
pushl %ebx #back %ebx up.
movl 16(%ebp), %eax #retrieve the dword with i.
movb %al, %ch #set %ch to be i.
movl 20(%ebp), %eax #retrieve the dword with j.
movb %al, %cl #set %cl to be j.
movl 8(%ebp), %eax #set pstring1ptr into eax.
movl 12(%ebp), %edx #set pstring2ptr into edx.
cmpb (%eax), %ch #i-str1.len
jg cmpERROR #if i>len: goto error
cmp (%eax), %cl #j-str1.len
jg cmpERROR #if jlen>: goto error
cmpb (%edx), %ch #i-str2.len
jg cmpERROR #if i>len2: goto error
cmp (%edx), %cl #j-str2.len
jg cmpERROR #if j>len2: goto error
incl %eax #increment eax to get past the length byte
incl %edx #increment edx to get past the length byte
cmpTEST:
cmpb %cl, %ch #compare i with j
jg cmpPREDONE #goto done once i>j
#jmp cmpLOOP #else: goto loop
cmpLOOP:
movb (%eax), %bl #take current str1 byte into %bl
cmpb %bl, (%edx) #compare %bl with first %edx byte
je cmpINC #if same: increment phase.
jl cmpLESS #str1 is before str2 lexicographically.
movl $1, %eax #set return value to 1.
jmp cmpDONE #done.
cmpLESS:
movl $-1, %eax #set return value to -1
jmp cmpDONE #done
cmpINC:
incl %eax #increment str1 pointer.
incl %edx #increment str2 pointer.
incb %ch #i++
jmp cmpTEST #current loop iteration is over.
cmpERROR: #don't need to back registers up.
pushl $error #push the message to be printed.
call printf #use printf to print error message
movl $-2, %eax #set return value to -2
jmp cmpDONE
cmpPREDONE:
movl $0, %eax #set return value to 0.
cmpDONE:
popl %ebx #restore old %ebx
movl %ebp, %esp #restore old stack pointer
popl %ebp #restore old FP
ret #return to caller function
The error is on line 3, like the message says. You have "string'
instead of "string"
. (Note the closing quote).
Also, comments like "Test" on a cmpb
instruction are useless. You should be commenting why the code does what it does, or at least what data is involved. I know it's tempting to write comments that read like an insn ref manual, but don't.
movb $0, %bl #initialize count register to 1.
was particularly amusing.
Also, indent your code one more level than your labels, so they stand out.
The x86 wiki has lots of good links, btw.