Home > Back-end >  Pushing registers to memory stack
Pushing registers to memory stack

Time:12-03

When we are pushing a register to the memory stack, what does it enable us to do?Does it just simply help us perform operations which dont fit in the AL,AH registers?

I had to write a program for a computer which has the x8086 processor and I had to find the equivalent time in hours of 35600 seconds so the AL,AH registers were to small to perform the division 35600/3600

CodePudding user response:

There's quite a few things you can do with push:

  • Storing a value so that you can use it later.

On the 8086, you can only bit shift or rotate by either 1 or the value in the CL register. This can become a problem if you're using CX as a loop counter but you're trying to bit-shift during your loop. So you can fix it with this:

foo:
push cx
   mov al,[si]
   mov cl,2
   shl al,cl
   mov [di],al
pop cx
loop foo
  • Reverse the order of letters in a string.
.data
myString db "Hello",0
.code

mov si,offset myString
mov ax,0
mov cx,0
cld

stringReverse:
lodsb          ;read the letter (and inc si to the next letter)
cmp al,0       ;is it zero
jz nowReverse  ;if so, reverse the string
push ax        ;push the letter onto the stack
inc cx         ;increment our counter
jmp stringReverse

nowReverse:
mov si,offset myString  ;reload the pointer to the first letter in myString

loop_nowReverse:
jcxz done               ;once we've written all the letters, stop.
pop ax                  ;get the letters back in reverse order
stosb                   ;overwrite the old string
dec cx                  
jmp loop_nowReverse
done:
  • Related