.method private hidebysig static void Main() cil managed
{
.entrypoint
// Code size 22 (0x16)
.maxstack 2
.locals init ([0] string str1,
[1] string str2,
[2] string result)
IL_0000: nop
IL_0001: ldstr "Hello "
IL_0006: stloc.0
IL_0007: ldstr "world!"
IL_000c: stloc.1
IL_000d: ldloc.0
IL_000e: ldloc.1
IL_000f: call string [mscorlib]System.String::Concat(string,
string)
IL_0014: stloc.2
IL_0015: ret
} // end of method Program::Main
Модульное программирование
Вобщем задача состоит в конкатенации двух строк, одна в главном модуле, другая соответственно во вспомогательном.
Насколько я вижу задачу - в гл. проге в сегменте данных определена строка предположим s1 db 'Hello ',0, а также буфер file_buf db 256 dup(0) (куда мы обе строки будем соединять). Ну и еще пару переменных по вкусу.
В модуле в сегменте данных тоже строка, например s2 db 'world!',0
Как мне передать строку из модуля в гл. прогу и записать в буфер? Чтото в инете порыскал-порыскал насчет этого, ничего не нашел
DOS или Windows?
TAsm
[Offtop]
Rifler Используйте волшебное слово public:
public <название переменной или функции>
в том модуле, где она определена, а в модуле, для которого она внешняя, слово extrn:
extrn <название переменной или функции> : <размер>
где размер - byte, word, dword и т. д.
Цитата: Vov4ick
Rifler Используйте волшебное слово public:
public <название переменной или функции>
в том модуле, где она определена, а в модуле, для которого она внешняя, слово extrn:
extrn <название переменной или функции> : <размер>
где размер - byte, word, dword и т. д.
public <название переменной или функции>
в том модуле, где она определена, а в модуле, для которого она внешняя, слово extrn:
extrn <название переменной или функции> : <размер>
где размер - byte, word, dword и т. д.
За это спасибо, но загвоздка не в том - как из модуля в модуль передать данные? Через стек?
у меня сейчас такая структура
Модуль:
Код:
public proc1
dts segment
soob2 db "world","$"; вторая часть строки
dts ends
cods segment
assume cs:cods
proc1 proc far
;пока пустая
ret
proc1 endp
cods ends
end
dts segment
soob2 db "world","$"; вторая часть строки
dts ends
cods segment
assume cs:cods
proc1 proc far
;пока пустая
ret
proc1 endp
cods ends
end
Главная
Код:
extrn proc1: far
sst segment stack "stack"
dw 10 dup (?)
sst ends
dats segment
soob1 db "Hello ","$"; первая часть строки
file_buf db 256 dup(0); эт буфер чтобы конка.. кароче соединить две
;строки
sizes dw 0; эт тоже понадобится :)
dats ends
cods segment
assume ss:sst, ds:dats, cs:cods
nn: mov ax, dats
mov ds, ax
; загоняем первую строку в буфер
mov cx,256
mov si,0
lea dx,soob1
l1: mov dl, soob1[si]
cmp dl,"$"
je l2
mov file_buf[si], dl
loop l1
l2: mov sizes, si; сохраним размер первой строки, чтобы знать куда
;дописывать вторую
call proc1
mov ah, 4ch
int 21h
cods ends
end nn
sst segment stack "stack"
dw 10 dup (?)
sst ends
dats segment
soob1 db "Hello ","$"; первая часть строки
file_buf db 256 dup(0); эт буфер чтобы конка.. кароче соединить две
;строки
sizes dw 0; эт тоже понадобится :)
dats ends
cods segment
assume ss:sst, ds:dats, cs:cods
nn: mov ax, dats
mov ds, ax
; загоняем первую строку в буфер
mov cx,256
mov si,0
lea dx,soob1
l1: mov dl, soob1[si]
cmp dl,"$"
je l2
mov file_buf[si], dl
loop l1
l2: mov sizes, si; сохраним размер первой строки, чтобы знать куда
;дописывать вторую
call proc1
mov ah, 4ch
int 21h
cods ends
end nn
Как теперь строку из модуля загнать в этот буфер?
Используй один сегмент данных на оба модуля, ни к чему их много. Просто называй одним названием. Нужные переменные объявляй как общие, как я выше написал, вот и всё.
Не подскажешь как скомпилировать модуль вмсете с главной программой?
Что там писать tasm ??? и tlink ???
Я помню что их нужно как то вместе компилить, а не по отдельности. А вот синтаксис забыл
tasm ключи модуль2.asm
tlink ключи модуль1.obj модуль2.obj
Запускай без параметров и читай, что пишут. Назначение всех параметров хорошо описано.