Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 如何将数据段共享到程序集8086?_Assembly_Masm_X86 16_Masm32 - Fatal编程技术网

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中删除
数据段…数据结尾。