Assembly 如何将数据段共享到程序集8086?
我正在尝试连接三个字符串:Assembly 如何将数据段共享到程序集8086?,assembly,masm,x86-16,masm32,Assembly,Masm,X86 16,Masm32,我正在尝试连接三个字符串: data segment public a db 'hei, $' alen equ $-a-1 b db 'how are you $' blen equ $-b-1 c db 'Michael ?$' clen equ $-c-1 rez db alen+blen+clen+1 dup(?) ; adding one, for the $ data ends 这是我的数据段。我试图在rez变量中得到这个:
data segment public
a db 'hei, $'
alen equ $-a-1
b db 'how are you $'
blen equ $-b-1
c db 'Michael ?$'
clen equ $-c-1
rez db alen+blen+clen+1 dup(?) ; adding one, for the $
data ends
这是我的数据段。我试图在rez变量中得到这个:嘿,迈克尔,你好吗?
我可以使用单个程序集文件来实现这一点,使用lenghts循环并创建rez字符串
我的问题是,我正试图用一个程序来做这件事。首先,我尝试将变量的偏移量复制到寄存器中(ax、bx、cx、dx、si、di),但是。。。一旦我进入程序,对它进行编码,我意识到我所有的寄存器都被使用了,我不能对寄存器做任何事情
正如您所看到的,数据段是公共的,我想它也应该被过程看到,但它不是
文件1:
assume cs:code, ds:data
data segment public
a db 'hei, $'
alen equ $-a-1
b db 'how are $'
blen equ $-b-1
c db 'Michael ?$'
clen equ $-c-1
rez db alen+blen+clen+1 dup(?) ; adding one, for the $
data ends
extrn add_to_result:proc
code segment
start:
mov ax, data
mov ds, ax
; save the offsets
; do the math, get the rez
call add_to_result
; show result
mov ax, 0
mov ah, 09h
lea dx, rez
mov ax, 4C00h
int 21h
code ends
end start
文件2-程序
assume cs:code, ds:data
data segment
data ends
code segment public
public add_to_result
add_to_result:
; do the math
code ends
end
任何建议都将不胜感激。我已尝试将变量的偏移量复制到寄存器中 为什么不把偏移量和长度放在堆栈上?这将使所有寄存器对您的过程可用 正如您所看到的,数据段是公共的,我想程序也应该看到它,但它不是…
如果没有程序的其余部分,这有点难以理解。您还没有明确指定您希望程序执行的操作 一种可能性是您可以实现类似于C
strcat
函数的功能。为此,您将传入2个参数,并调用您的过程3次以将这3个部分粘合在一起。为了提高效率,函数可以返回指向字符串结尾的指针。您可以这样做:cat(cat(cat(rez,a),b),c)
要传入参数,可以使用自己的约定,例如第一个参数为ax
,第二个参数为dx
。对于返回值,您可以再次重用ax
,这将使嵌套变得容易:
mov ax, offset rez
mov dx, offset a
call cat
mov dx, offset b
call cat
mov dx, offset c
call cat
您的
cat
函数应该将字符从dx
的内存复制到ax
的内存中,直到它到达终止的$
,然后它应该在ax
中将参数传递到远端函数的一种方法当然是寄存器,但最有效和最常用的方法是使用堆栈。(不要忘记有两个文件,并且您使用的是静态数据(数据段),因此您也必须传递数据段地址。
所以在主要方法中是这样的:
push ds
mov ax, offset a
push ax
mov ax, offset b
push ax
mov ax, offset c
push ax
call cat
在cat程序中,按相反的顺序弹出值。别忘了也弹出ds。添加了源代码。我没有使用堆栈编写任何程序,我是初学者。但是,我认为这是我正在寻找的解决方案,谢谢。你不需要将
mov ax,data
更改为mov ax,@data
?不要这样认为。如果你解释为什么…?许多汇编程序在编址程序段时需要这种语法。也可以尝试从文件2中删除数据段…数据结尾。