⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 httpc.asm

📁 Application sources:A084.ZIP
💻 ASM
📖 第 1 页 / 共 3 页
字号:
    inc     edi
    inc     edx
    jmp     td0021
    
td004:
    mov     esi, edi
    inc     edi
    inc     edx
    jmp     td002
    
    
    
    ; write label len + label text

td001:
    mov     [edi], byte 0
    inc     ecx
    inc     edi
    mov     [edi], dword 0x01000100
    add     ecx, 4

    mov     [dnsMsgLen], ecx
        
    ret
   
   
   
  
   
;***************************************************************************
;   Function
;      resolveDomain
;
;   Description
;       Sends a question to the dns server
;       works out the IP address from the response from the DNS server
;
;***************************************************************************
resolveDomain:
    ; Get a free port number    
	mov	    ecx, 1000		; local port starting at 1000	
getlp:
	inc	    ecx             
	push	ecx
	mov	    eax, 53
	mov	    ebx, 9
	int     0x40
	pop	    ecx
	cmp	    eax, 0			; is this local port in use?
	jz		getlp		    ; yes - so try next
   
    ; First, open socket
    mov     eax, 53
    mov     ebx, 0
    mov     edx, 53    ; remote port - dns
    mov     esi, dword [dns_ip]
    int     0x40
   
    mov     [socketNum], eax
   
    ; write to socket ( request DNS lookup )
    mov     eax, 53
    mov     ebx, 4
    mov     ecx, [socketNum]
    mov     edx, [dnsMsgLen]
    mov     esi, dnsMsg
    int     0x40
    
    ; Setup the DNS response buffer
    
    mov     eax, dnsMsg
    mov     [dnsMsgLen], eax
   
    ; now, we wait for
    ; UI redraw
    ; UI close
    ; or data from remote
   
ctr001:
    mov     eax,10                 ; wait here for event
    int     0x40
       
    cmp     eax,1                  ; redraw request ?
    je      ctr003
    cmp     eax,2                  ; key in buffer ?
    je      ctr004
    cmp     eax,3                  ; button in buffer ?
    je      ctr005
   
   
    ; Any data in the UDP receive buffer?
    mov     eax, 53
    mov     ebx, 2
    mov     ecx, [socketNum]
    int     0x40
   
    cmp     eax, 0
    je      ctr001
        
    ; we have data - this will be the response
ctr002:
    mov     eax, 53
    mov     ebx, 3
    mov     ecx, [socketNum]
    int     0x40                ; read byte - block (high byte)

    ; Store the data in the response buffer   
    mov     eax, [dnsMsgLen]
    mov     [eax], bl
    inc     dword [dnsMsgLen]

    mov     eax, 53
    mov     ebx, 2
    mov     ecx, [socketNum]
    int     0x40                ; any more data?
    
    cmp     eax, 0
    jne     ctr002              ; yes, so get it

    ; close socket
    mov     eax, 53
    mov     ebx, 1
    mov     ecx, [socketNum]
    int     0x40
   
    mov     [socketNum], dword 0xFFFF

    ; Now parse the message to get the host IP
    ; Man, this is complicated. It's described in
    ; RFC 1035

if DEBUGGING_STATE = DEBUGGING_ENABLED
    mov     esi, str4
    call    debug_print_string
end if    
   
    ; 1) Validate that we have an answer with > 0 responses
    ; 2) Find the answer record with TYPE 0001 ( host IP )
    ; 3) Finally, copy the IP address to the display
    ; Note: The response is in dnsMsg
    ;       The end of the buffer is pointed to by [dnsMsgLen]
    
    ; Clear the IP address text
    mov     [server_ip], dword 0
    
    mov     esi, dnsMsg
    
    ; Is this a response to my question?
    mov     al, [esi+2]
    and     al, 0x80
    cmp     al, 0x80
    jne     ctr002a
    
    ; Were there any errors?
    mov     al, [esi+3]
    and     al, 0x0F
    cmp     al, 0x00
    jne     ctr002a
    
    ; Is there ( at least 1 ) answer?
    mov     ax, [esi+6]
    cmp     ax, 0x00
    je      ctr002a
        
    ; Header validated. Scan through and get my answer

if DEBUGGING_STATE = DEBUGGING_ENABLED
    pusha
    mov     esi, str4
    call    debug_print_string
    popa
end if  
 
    add     esi, 12             ; Skip to the question field
    
    ; Skip through the question field
    call    skipName
    add     esi, 4              ; skip past the questions qtype, qclass
    
ctr002z:
    ; Now at the answer. There may be several answers, 
    ; find the right one ( TYPE = 0x0001 )
    call    skipName
    mov     ax, [esi]
    cmp     ax, 0x0100          ; Is this the IP address answer?
    jne     ctr002c
    
    ; Yes! Point esi to the first byte of the IP address
    add     esi, 10
    
    mov     eax, [esi]
    mov     [server_ip], eax
    ret
    
    
ctr002c:                        ; Skip through the answer, move to the next
    add     esi, 8              
    movzx   eax, byte [esi+1]
    mov     ah, [esi]
    add     esi, eax
    add     esi, 2
    
    ; Have we reached the end of the msg?
    ; This is an error condition, should not happen
    cmp     esi, [dnsMsgLen]
    jl      ctr002z             ; Check next answer
    jmp     ctr002a             ; abort
    
ctr002a:
    jmp     ctr001
   
ctr003:                         ; redraw
    jmp     ctr001
   
ctr004:                         ; key
    mov     eax,2               ; just read it and ignore
    int     0x40
    jmp     ctr001
   
ctr005:                         ; button
    mov     eax,17              ; get id
    int     0x40
   
    ; close socket
    mov     eax, 53
    mov     ebx, 1
    mov     ecx, [socketNum]
    int     0x40
    
    mov     [socketNum], dword 0xFFFF
    mov     [server_ip], dword 0
                
    ret   
    
    
    
;***************************************************************************
;   Function
;      skipName
;
;   Description
;       Increment esi to the first byte past the name field  
;       Names may use compressed labels. Normally do.
;       RFC 1035 page 30 gives details
;
;***************************************************************************
skipName:
    mov     al, [esi]
    cmp     al, 0
    je      sn_exit
    and     al, 0xc0
    cmp     al, 0xc0
    je      sn001
    
    movzx   eax, byte [esi]
    inc     eax
    add     esi, eax
    jmp     skipName
    
sn001:
    add     esi, 2                          ; A pointer is always at the end
    ret

sn_exit:
    inc     esi
    ret

    

if DEBUGGING_STATE = DEBUGGING_ENABLED

;****************************************************************************
;    Function   
;       debug_print_string
;
;   Description
;       prints a string to the debug board, in quotes       
;          
;       esi holds ptr to msg to display, which is space or 0 terminated
;
;       Nothing preserved; I'm assuming a pusha/popa is done before calling
;
;****************************************************************************
debug_print_string:
    push    esi
    mov     cl, '"'
    mov     eax,63
    mov     ebx, 1
    int     0x40
    pop     esi

dps_000:
    mov     cl, [esi]
    cmp     cl, 0
    je      dps_exit
    cmp     cl, ' '
    je      dps_exit
    jmp     dps_001
    
dps_exit:
    mov     cl, '"'
    mov     eax,63
    mov     ebx, 1
    int     0x40
    mov     cl, 13
    mov     eax,63
    mov     ebx, 1
    int     0x40
    mov     cl, 10
    mov     eax,63
    mov     ebx, 1
    int     0x40
    ret
	
dps_001:
    mov     eax,63
    mov     ebx, 1
    push    esi
    int     0x40

    pop     esi
    inc     esi
    jmp     dps_000
end if    
    
   
;****************************************************************************
;    Function   
;       print_text
;
;   Description
;       display the url (full path) text
;
;****************************************************************************
print_text:  
    ; Draw a bar to blank out previous text
    mov     eax,13
    mov     ebx,30*65536+URLMAXLEN*6  ; 50 should really be [len], and 103 [xa]
    mov     ecx,[ya]
    shl     ecx,16
    mov     cx,9
    mov     edx,0xFFFFFF
    int     0x40
   
    ; write text
    mov     eax,4
    mov     ebx,30*65536
    add     ebx,[ya]
    mov     ecx,0x000000
    mov     edx,[addr]
    mov     esi,URLMAXLEN
    int     0x40
   
    ret       
   
;   *********************************************
;   *******  WINDOW DEFINITIONS AND DRAW ********
;   *********************************************
      
draw_window:
    mov     eax,12                    ; function 12:tell os about windowdraw
    mov     ebx,1                     ; 1, start of draw
    int     0x40
   
                                   ; DRAW WINDOW
    mov     eax,0                     ; function 0 : define and draw window
    mov     ebx,50*65536+550          ; [x start] *65536 + [x size]
    mov     ecx,50*65536+400          ; [y start] *65536 + [y size]
    mov     edx,0x03ffffff            ; color of work area RRGGBB,8->color gl
    mov     esi,0x805080d0            ; color of grab bar  RRGGBB,8->color gl
    mov     edi,0x005080d0            ; color of frames    RRGGBB
    int     0x40
   
                                   ; WINDOW LABEL
    mov     eax,4                     ; function 4 : write text to window
    mov     ebx,8*65536+8             ; [x start] *65536 + [y start]
    mov     ecx,0x00ddeeff            ; color of text RRGGBB
    mov     edx,labelt                ; pointer to text beginning
    mov     esi,labellen-labelt       ; text length
    int     0x40
      
                                   
    mov     esi, URLMAXLEN            ; URL
    mov     eax,4                     ; function 4 : write text to window
    mov     ebx,30*65536+38           ; [x start] *65536 + [y start]
    mov     ecx,0x000000              ; color of text RRGGBB
    mov     edx,document_user         ; pointer to text beginning
    int     0x40
   
    mov     eax,38
    mov     ebx,5*65536+545
    mov     ecx,60*65536+60
    mov     edx,0x000000
    int     0x40
   
    mov     eax,38
    mov     ebx,5*65536+545
    mov     ecx,[winys]
    shl     ecx,16
    add     ecx,[winys]
    sub     ecx,26*65536+26
    mov     edx,0x000000
    int     0x40
                                   ; RELOAD
    mov     eax,8                     ; function 8 : define and draw button
    mov     ebx,388*65536+50          ; [x start] *65536 + [x size]
    mov     ecx,34*65536+14           ; [y start] *65536 + [y size]
    mov     edx,22                    ; button id
    mov     esi,0x5588dd              ; button color RRGGBB
    int     0x40

                                   ; URL
    mov     eax,8                     ; function 8 : define and draw button
    mov     ebx,10*65536+12          ; [x start] *65536 + [x size]
    mov     ecx,34*65536+12           ; [y start] *65536 + [y size]
    mov     edx,10                    ; button id
    mov     esi,0x5588dd              ; button color RRGGBB
    int     0x40
   
                                   ; STOP
    mov     eax,8                     ; function 8 : define and draw button
    mov     ebx,443*65536+50          ; [x start] *65536 + [x size]
    mov     ecx,34*65536+14           ; [y start] *65536 + [y size]
    mov     edx,24                    ; button id
    mov     esi,0x5588dd              ; button color RRGGBB
    int     0x40
   
                                   ; BUTTON TEXT
    mov     eax,4                     ; function 4 : write text to window
    mov     ebx,390*65536+38          ; [x start] *65536 + [y start]
    mov     ecx,0xffffff              ; color of text RRGGBB
    mov     edx,button_text           ; pointer to text beginning
    mov     esi,20                    ; text length
    int     0x40
   
    call    display_page
   
    mov     eax,12                    ; function 12:tell os about windowdraw
    mov     ebx,2                     ; 2, end of draw
    int     0x40
   
    ret


if DEBUGGING_STATE = DEBUGGING_ENABLED
str1:       db  "Resolving...",0
str3:       db  "Resolved",0
str2:       db  "GotIP",0
str4:       db  "GotResponse",0
end if
     
button_text     db      ' RELOAD    STOP       '
dpx             dd      25  ; x - start of html page in pixels in window
dpy             dd      65  ; for y
lastletter      db      0
pageyinc        dd      0
display_from    dd      20
pos             dd      0x0
pagex           dd      0x0
pagey           dd      0x0
pagexs          dd      80
command_on_off  dd      0x0
text_type       db      1
com2            dd      0x0
script          dd      0x0  
socket          dd      0x0

addr            dd  0x0
ya              dd  0x0
len             dd  0x00

labelt:         db      'HTTPC - PgUp/PgDown'
labellen:

server_ip:      db      207,44,212,20
dns_ip:         db      194,145,128,1   
webAddr:        times 128 db ' '
document_user:  db      'Click on the button to the left to enter a URL',0
times  100      db      0x0                                             
document:       db      '/'
times  100      db      ' '                                             
   
string0:        db      'GET '
   
stringh:        db      ' HTTP/1.0',13,10,13,10
stringh_end:
     
status          dd      0x0
prev_status     dd      0x0
   
onoff           dd      0x0

nextupdate:     dd      0
winys:          dd      400
      
dnsMsgLen:      dd 0
socketNum:      dd 0xFFFF
dnsMsg:
I_END:
   

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -