![]() |
| ||
| copy string and convert to upper case This is what I have and think it is correct but the result shows up as all spaces... Im lost... Any help would be great. Thanks 0:000> ******************** process_strings.dbg 0:000> da message *** WARNING: Unable to verify checksum for process_strings.exe 00404000 "You can't always get what you wa" 00404020 "nt" 0:000> da result 00404023 " " 00404043 " " 0:000> q quit: Code I have TITLE process_strings .586 .MODEL flat,stdcall ExitProcess PROTO, ExitCode:DWORD .data message BYTE "you cant always get what you want",0 result BYTE SIZEOF message DUP("?"),0 .code public fini loop4 PROC ;----------Copy the string message to result mov ebx,0 mov ecx,LENGTHOF message next_char: mov al,message[ebx] mov result[ebx],al add al,32h inc ebx loop next_char fini:: push 0 call ExitProcess loop4 ENDP END loop4 |
| ||
| Re: copy string and convert to upper case next_char: mov al,message[ebx]Watch your order of operations. You save the character to al, then copy al to the result string, *then* modify al. Also, if you're converting an ASCII letter to upper case, you need to subtract because the upper case letters are less in value than the lower case letters. Also, it's 32 decimal, not 32 hexadecimal. ;) mov al,message[ebx]A cooler way to convert ASCII is to clear the 5th bit, which is what the subtraction does, but you can more directly show your intentions with AND: mov al,message[ebx]But that's also not quite right because not all of the characters in your string are in the valid range of 'a' to 'z'. If you apply any unconditional transformation on those characters, you'll get weird results. Most notably, a space becomes a null character because 32 is 00100000b, and you're effectively clearing the only set bit. :) You need to add some sanity checks: next_char: |
| All times are GMT -4. The time now is 7:23 pm. |
Forum system based on vBulletin Copyright ©2000 - 2009, Jelsoft Enterprises Ltd.
©2003 - 2009 DaniWeb® LLC