Forums before death by AOL, social media and spammers... "We can't have nice things"
|    comp.lang.asm.x86    |    Ahh, the lost art of x86 assembly    |    4,675 messages    |
[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]
|    Message 4,598 of 4,675    |
|    Paul Edwards to All    |
|    ss and lea on 8086    |
|    24 Jun 23 00:35:07    |
   
   From: mutazilah@nospicedham.gmail.com   
      
   I have the following code:   
      
   void dumplong(unsigned long x)   
   {   
    static int y;   
    char *z = "0123456789abcdef";   
    char buf[9];   
      
    y = 0;   
    buf[0] = 'P';   
    buf[1] = 'P';   
    buf[2] = 'P';   
    buf[3] = 'P';   
    buf[3-y] = 'R';   
    buf[4] = 'P';   
    buf[4+y] = 'S';   
    buf[5] = 'P';   
    buf[6] = 'P';   
    buf[7] = 'P';   
      
   And Visual C++ 1.52 is generating this assembler:   
      
   x = 0006   
   buf = fff4   
   z = fff0   
   Line 5836   
   _dumplong:   
    push bp   
    mov bp,sp   
    sub sp,OFFSET L04604   
   Line 5837   
   Line 5838   
    mov ax,OFFSET L03767   
    mov dx,ds   
    mov WORD PTR -16[bp],ax   
    mov WORD PTR -14[bp],dx   
   Line 5839   
   Line 5841   
    mov WORD PTR ?y@?1??dumplong@@9@9,OFFSET 0   
   Line 5842   
    mov BYTE PTR -12[bp],OFFSET 80   
   Line 5843   
    mov BYTE PTR -11[bp],OFFSET 80   
   Line 5844   
    mov BYTE PTR -10[bp],OFFSET 80   
   Line 5845   
    mov BYTE PTR -9[bp],OFFSET 80   
   Line 5846   
    mov ax,OFFSET 3   
    sub ax,WORD PTR ?y@?1??dumplong@@9@9   
    lea bx,WORD PTR -12[bp]   
    add bx,ax   
    mov BYTE PTR ss:[bx],OFFSET 82   
   Line 5847   
    mov BYTE PTR -8[bp],OFFSET 80   
   Line 5848   
    mov ax,WORD PTR ?y@?1??dumplong@@9@9   
    add ax,OFFSET 4   
    lea bx,WORD PTR -12[bp]   
    add bx,ax   
    mov BYTE PTR ss:[bx],OFFSET 83   
   Line 5849   
    mov BYTE PTR -7[bp],OFFSET 80   
   Line 5850   
    mov BYTE PTR -6[bp],OFFSET 80   
   Line 5851   
    mov BYTE PTR -5[bp],OFFSET 80   
      
      
   I've been looking at this for hours.   
      
   Unless I've somehow stuffed up the test, this data is   
   all being set to 'P'.   
      
   Regardless of whether I do a subtraction or an addition   
   (of 0), the data is not changed.   
      
   I do have one unusual thing happening - my "ss" is set   
   to something a long way away from "ds" because this   
   is the PDOS/86 kernel and I didn't create a separate   
   stack for the kernel, I just reused the one from the   
   bootloader.   
      
   But I don't see any reason for that effect. The lea shouldn't   
   care, and the ss is explicitly used.   
      
   It is not easy to debug this because this IS what I use   
   to debug!   
      
   Original code, before I started debugging, is here:   
      
   https://sourceforge.net/p/pdos/gitcode/ci/master/tree/src/pdos.c   
      
      
   Any ideas?   
      
   Thanks. Paul.   
      
   --- SoupGate-Win32 v1.05   
    * Origin: you cannot sedate... all the things you hate (1:229/2)   
|
[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]
(c) 1994, bbs@darkrealms.ca