🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.asm
3 messages
3 total messages Started by robert Thu, 30 Nov 2006 15:50
newbie
#852
Author: robert
Date: Thu, 30 Nov 2006 15:50
68 lines
2106 bytes
Witam. Napisałem poniższy kod, który się kompiluje, ale już nie likuje.
1)    komunikat błędu: _show_txt unresolved external. Wydaje mi się, że nie
może odszukać procedury show_txt znajdującej się w kod_2 sgement;
2)    po usunięciu lini .model small argument napis procedury show_txt musi
być zadeklarowany jako dword, inaczej progr. się nie skompiluje. Oznacza to,
że addr
        zwraca 32bitowy adres [seg+offset], dlaczego ?

Bardzo prosze o pomoc i pozdrawiam.

.model small
.386

show_txt proto far C count:byte, napis:word, data_sem:word

show_mac macro ile:req, napis:req, data:req
 push ax
 push cx
 push dx

 mov ax,data
 mov ds,ax

 mov cx,ile
LOCAL petla:
 mov ah,9h
 mov ax,data
 lea dx,napis
 int 21h
 loop petla

 pop dx
 pop cx
 pop ax
endm

Moj_stos segment stack
 db 256 dup (?)
Moj_stos ends

Dane segment
 napis db "Komuunikat", 0dh,0ah,"$"
 licznik db ?
Dane ends

kod_1 segment 'code'
 assume cs:kod_1,ds:Dane
start:
 mov ax,seg Dane
 mov ds,ax

 invoke show_txt, licznik, addr napis, seg napis

kod_1 ends
end start

kod_2 segment 'code'
 assume cs:kod_2,ds:nothing

 show_txt proc far C uses ax ds, count:byte, nap:word, data_sem:word

  show_mac

  ret

 show_txt endp

kod_2 ends
Re: newbie
#853
Author: Matuzalem
Date: Thu, 30 Nov 2006 21:33
81 lines
2873 bytes
robert napisał(a):
> Witam. Napisałem poniższy kod, który się kompiluje, ale już nie likuje.
> 1)    komunikat błędu: _show_txt unresolved external. Wydaje mi się, że nie
> może odszukać procedury show_txt znajdującej się w kod_2 sgement;
> 2)    po usunięciu lini .model small argument napis procedury show_txt musi
> być zadeklarowany jako dword, inaczej progr. się nie skompiluje. Oznacza to,
> że addr
>         zwraca 32bitowy adres [seg+offset], dlaczego ?
>
> Bardzo prosze o pomoc i pozdrawiam.
>
> .model small
> .386
>
> show_txt proto far C count:byte, napis:word, data_sem:word
>
> show_mac macro ile:req, napis:req, data:req
>  push ax
>  push cx
>  push dx
>
>  mov ax,data
>  mov ds,ax
>
>  mov cx,ile
> LOCAL petla:
>  mov ah,9h
>  mov ax,data
>  lea dx,napis
>  int 21h
>  loop petla
>
>  pop dx
>  pop cx
>  pop ax
> endm
>
> Moj_stos segment stack
>  db 256 dup (?)
> Moj_stos ends
>
> Dane segment
>  napis db "Komuunikat", 0dh,0ah,"$"
>  licznik db ?
> Dane ends
>
> kod_1 segment 'code'
>  assume cs:kod_1,ds:Dane
> start:
>  mov ax,seg Dane
>  mov ds,ax
>
>  invoke show_txt, licznik, addr napis, seg napis
>
> kod_1 ends
> end start
>
> kod_2 segment 'code'
>  assume cs:kod_2,ds:nothing
>
>  show_txt proc far C uses ax ds, count:byte, nap:word, data_sem:word
>
>   show_mac
>
>   ret
>
>  show_txt endp
>
> kod_2 ends

Witam

O ile dobrze pamiętam w konwencji wywołań dla języka C (show_txt
proto far C ...) domyślnie występuje znak podkreślenia "_" przed
nazwą funkcji, a ponieważ show_txt nie posiada owego podkreślenia -
czego spodziewa się linker - więc wywala błąd:

_show_txt unresolved external

Pozdrawiam
Re: newbie
#854
Author: Bernard
Date: Thu, 30 Nov 2006 22:12
57 lines
2205 bytes
robert wrote:
> Witam. Napisałem poniższy kod, który się kompiluje, ale już nie likuje.
> 1)    komunikat błędu: _show_txt unresolved external. Wydaje mi się, że nie
> może odszukać procedury show_txt znajdującej się w kod_2 sgement;
> 2)    po usunięciu lini .model small argument napis procedury show_txt musi
> być zadeklarowany jako dword, inaczej progr. się nie skompiluje. Oznacza to,
> że addr
>         zwraca 32bitowy adres [seg+offset], dlaczego ?
> 
> Bardzo prosze o pomoc i pozdrawiam.
> 
> .model small
> .386
> 
> show_txt proto far C count:byte, napis:word, data_sem:word

A dlaczego "far", skoro był "model small"?


Skoro używasz "nowych" dyrektyw, to dlaczego jednocześnie otwierasz 
segmenty "po staremu"?

> Moj_stos segment stack
>  db 256 dup (?)
> Moj_stos ends
> 
> Dane segment
>  napis db "Komuunikat", 0dh,0ah,"$"
>  licznik db ?
> Dane ends
> 
> kod_1 segment 'code'
>  assume cs:kod_1,ds:Dane
> start:
>  mov ax,seg Dane
>  mov ds,ax
> 
>  invoke show_txt, licznik, addr napis, seg napis
> 
> kod_1 ends
> end start
> 
> kod_2 segment 'code'
>  assume cs:kod_2,ds:nothing

Dwa segmenty kodu w modelu SMALL?! Też bym zgłupiał na miejscu 
konsolidatora...

>  show_txt proc far C uses ax ds, count:byte, nap:word, data_sem:word
> 
>   show_mac
> 
>   ret
> 
>  show_txt endp
> 
> kod_2 ends
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads