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,000 of 4,675    |
|    bilsch01 to s_dubrovich@nospicedham.yahoo.com    |
|    Re: Isn't this anomalous behavior? What     |
|    27 Dec 19 01:08:59    |
   
   From: king621@nospicedham.comcast.net   
      
   On 12/26/19 8:29 AM, s_dubrovich@nospicedham.yahoo.com wrote:   
   > On Thursday, December 26, 2019 at 3:53:21 AM UTC-6, bilsch01 wrote:   
   >> The code below writes 5 words to memory at 0x37000. I verified the words   
   >> are there using code not shown (for simplicity), but it's easy to see   
   >> that the words should be there. After that the 2 lines:   
   >>   
   >>   
   >> mov si,3   
   >> mov ax,word[fs:si]   
   >>   
   >> should put dd66 in ax register but instead it puts a byte from each of 2   
   >> other words in ax, specifically 77bb. The routine at the end prints the   
   >> result 77BB when it should print DD66.   
   >>   
   >> I have a situation where I really need something like this to work. How   
   >> can I do it? TIA. Bill S.   
   >>   
   >> bits 16   
   >> org 0x0000   
   >>   
   >> SECTION .data   
   >>   
   >> fat5 dw 0xaa99,0xbb88,0xcc77,0xdd66,0xee55,0xff44   
   >>   
   >> SECTION .text   
   >>   
   >> push 0   
   >> pop ss   
   >> mov sp,0x7aff   
   >> push 0x1000   
   >> pop ds   
   >> push 0xb800   
   >> pop es   
   >>    
   >> ; write 5 words to mem at 0x37000   
   >>   
   >> push 0x3700    
   >> pop fs   
   >> mov di,0   
   >> mov si,fat5   
   >> mov cx,5   
   >> fatlu: mov ax,word[ds:si]   
   >> mov word[fs:di],ax   
   >> add si,2   
   >> add di,2   
   >> loop fatlu   
   >>   
   >> ; here's the test   
   >>   
   >> mov si,3   
   >> mov ax,word[fs:si]   
   >>   
   >> push ax   
   >> jmp vuhex ;prints 77BB   
   >> ;should be DD66   
   >>   
   >> ; prints 4 hex digits from stack   
   >>   
   >> vuhex: pop ax ;4 hex digits   
   >> mov di,3832 ;l.r. corner   
   >> mov cx,4 ;;# of hex digits   
   >> vh01: rol ax,4 ;hi digit on right   
   >> push ax ;push rol'd ax   
   >> and al,0x0f ;;masks right digit   
   >> add al,'0' ;0 thru 9   
   >> cmp al,'9'   
   >> jbe vh02   
   >> add al,0x7 ;A thru F   
   >> vh02: mov byte[es:di],al   
   >> inc di   
   >> mov byte[es:di],0x0f ;blk/wht   
   >> inc di   
   >> pop ax ;pop rol'd ax   
   >> loop vh01   
   >>   
   >> jmp $   
   >   
   > SECTION .data   
   >   
   > fat5 dw 0xaa99,0xbb88,0xcc77,0xdd66,0xee55,0xff44   
   >   
   > ;; prints 77BB, should be DD66   
   >   
   > ;; fat5: db 99h, 0AAh, 88h, [0BBh, 77h], 0CCh, {66h, 0DDh}, 55h, 0EEh, 44h,   
   0FFh   
   >   
   > ;; SI = 3 points to [nnnnh], as db 99h is at index (offset) 0   
   >   
   > '[]' brackets the actual result   
   > '{}' brackets the desired result   
   >   
   > SECTION .text   
   >   
   > ; mov si, 3   
   > ; mov ax, word[fs:si]   
   >   
   > ;; SI needs to be a word index (offset), 3*2, to point to {nnnnh}   
   > ;; SI = 0000h points to byte 99h, plus 6 then points to the low order byte   
   66h,   
   > ;; the high ordered byte is DDh.   
   > ;; The correction is:   
   > ;;   
   > ;; mov si, 3*2   
   >   
   > Steve   
   >   
      
   Thanks for your explanation, I realized my mistaken thinking as soon as   
   I saw it.   
      
   --- 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