how can i write a program, which accepts the starting address (in BX) of a text (terminated by a “%”) stored in data segment and replace all lower-case letters by their upper-case counterparts. Non-alphetic characters will remain as is.(8086)
Show us what you can do and we'll help you where you get stuck.
You will need a loop and two conditional checks to see if the letter needs to be converted to uppercase.
I assume ASCII?
string db '123 test TEsting$'
start: lea bx, string
; check if it's a lower case letter:
cmp byte ptr [bx], 'a'
cmp byte ptr [bx], 'z'
; convert to uppercase:
; upper case letter do not have
; third bit set, for example:
; 'a' : 01100001b
; 'a' : 01000001b
; upper case mask : 11011111b
; clear third bit:
and byte ptr [bx], 11011111b
inc bx ; next char.
; int 21h / ah=09h - output of a string at ds:dx.
; string must be terminated by '$' sign.
lea dx, string
mov ah, 09h
; wait for any key press....
mov ah, 0
Good start. I'm using MASM, so I don't know if some of my remarks are accounted for or not.
You need to load DS with the proper value. Generally data and code are separated into different segments, but they need not be. You'll need to start with some directives about the memory model also...
.model small .stack 64 .data string db '123 test TEsting$' .code start: mov ax, @data mov ds, ax ... end start
The loop opcode relies on CX. You have used loop but you have not initialized CX. Therefore, your loop will execute some random number of times.
To test your code, I just added
lea bx, string
mov cx, 16
uppercase: since your string is 16 characters long (not counting the '$').
However, this is not a good solution. Instead of using loop, why not test to see if
byte ptr [bx] is the '$' character, and jump to the beginning of the loop if it is not? That way your string can be any length...
Always halt your program with:
; terminate with return code 0 mov ax, 4C00h int 21h
You can of course change the return code as required. Zero indicates normal termination.
Hope this helps.
.model small .data string db '123 test TEsting$' .code start: mov ax, @data mov ds, ax upper_case: cmp [bx], '$' je done ; check if it's a lower case letter: cmp byte ptr [bx], 'a' jb ok cmp byte ptr [bx], 'z' ja ok and byte ptr [bx], 11011111b ok: inc bx ; next char. jmp upper_case done: lea dx, string mov ah, 09h int 21h ; wait for any key press.... mov ah, 0 int 16h mov ax, 4C00h int 21h end start
Very nice! Good job!
1. Line 11: You forgot to initialize BX with the address of "string".
2. Line 13: You forgot to give a size:
cmp [B]byte ptr[/B] [BX], '$' Personally, I would remove lines 36..38 since it serves no purpose. If you are going to ask the user to press a key, first print a message telling him to do it.
Also, I'd add just a few more comments: what are lines 13..15 doing? what is line 23 doing? and 32..34? and 40..42? Just a one-line synopsis (like in my example under "three" above) will do.
I'd give this an A (once 1 and 2 are fixed, that is).
what do I do if I need to convert uppercase to lowercase and lowercase to uppercase
i assume i need to add something like jmp lowercase
add stuffs in there then cmp, je ok
but how exactly can i do that..
i have very little understanding asm language.. so i need to ask what is what..
don't worry, im capable of understanding it..though i need a little bit of explanation..