如何将数据段共享到程序组件8086?

时间:2015-01-04 15:27:01

标签: 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变量中得到这个: hei,你好吗Michael? 我可以使用一个程序集文件,使用长度循环并创建rez字符串。

我的问题是我正在尝试使用一个程序。首先,我尝试将变量的偏移量复制到寄存器(ax,bx,cx,dx,si,di)中,但是......一旦我完成程序,对其进行编码,我意识到我的所有寄存器使用,我无法对寄存器做任何事情。

正如您所看到的那样,数据段是公开的,我想它也应该被程序看到,但它不是......

File1中:

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

任何建议都将受到赞赏。

3 个答案:

答案 0 :(得分:1)

我尝试将变量的偏移量复制到寄存器

为什么不将偏移量和长度放在堆栈上?这将使您的程序可以使用所有寄存器。

正如您所看到的那样,数据段是公开的,我想它也应该通过程序看到,但它不是......

如果没有其他程序,这有点难以理解。

答案 1 :(得分:1)

您尚未明确说明您希望自己的手术做什么。

一种可能性是你可以实现类似于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的内存中,直到它到达终止$,其地址应在{{1}中返回}}

答案 2 :(得分:0)

将参数传递给far函数的一种方法当然是寄存器,但最有效和最常用的方法是使用堆栈。 (并且不要忘记有两个文件并且您正在使用静态数据(数据段),因此您也必须传递数据段地址。

所以在主方法中会是这样的:

push ds
mov ax, offset a
push ax
mov ax, offset b
push ax
mov ax, offset c
push ax
call cat

在cat proc中,以相反的顺序弹出值。并且不要忘记弹出ds。