home bbs files messages ]

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 3,997 of 4,675   
   s_dubrovich@nospicedham.yahoo.com to All   
   Re: Isn't this anomalous behavior? What    
   26 Dec 19 08:29:21   
   
   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   
      
   --- 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