我想连接三个字符串:
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
任何建议都将受到赞赏。
答案 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。