Assembly x86汇编-多模块编程(MASM/TASM)

Assembly x86汇编-多模块编程(MASM/TASM),assembly,x86,x86-16,Assembly,X86,X86 16,好的,下面是代码: assume cs:code, ds:data data segment sname db 'Some Name','$' len equ $-sname ascii db 'a'-'A' data ends code segment start: mov ax,data mov ds,ax cld lea si,sname do_this: lodsb cmp al,61h jae lowercase

好的,下面是代码:

assume cs:code, ds:data
data segment
  sname db 'Some Name','$'
  len equ $-sname
  ascii db 'a'-'A'

data ends
code segment
start:
  mov ax,data
  mov ds,ax

  cld
  lea si,sname

  do_this:
    lodsb

    cmp al,61h
    jae lowercase

    uppercase:
      cmp si,len
      je the_end
      jmp continue

    lowercase:
      mov bl,ascii
      sub ax,bx

      mov ds:[si-1],al
      cmp si,len
      je the_end

  continue:
  loop do_this

  the_end:
  mov ax,0000
  lea dx,sname
  mov ah,09h
  int 21h

  mov ax,4c00h
  int 21h

code ends
end start
基本上,它只是将字符串“sname”的所有小写字母转换为大写字母。 我的问题是,如何将代码拆分为两个模块,其中一个模块将处理字符串打印部分。具体来说,我需要一个.asm模块来处理字符串到大写的转换,以及一个处理以下内容的模块:

  lea dx,sname
  mov ah,09h
  int 21h

我似乎找不到任何关于这方面的好教程,因此如果您能为我指出一些,我将不胜感激,如果没有,一个简单的示例,说明如何将2.asm模块组合在一起(需要什么指令等)将非常好。

下的顶部。MODEL
您将提供:

EXTRN     RANDOM:FAR
然后:

在Random.asm中:

;
          .CODE   
          ASSUME    DS:RAND_DATA
;
RANDOM    PROC      FAR PUBLIC USES CX DX DS,
                    LOWER:WORD, UPPER:WORD
                                        ;FUNCTION RANDOM(LOWER,UPPER)
                                        ;SAVE REGISTERS (USES LIST)
          PUSHF                         ;SAVE FLAGS
          MOV       AX,SEG RAND_DATA    ;SET DS-REGISTER TO POINT
          MOV       DS,AX               ;TO LOCAL DATA SEGMENT
;
;
          POPF                         ;RESTORE FLAGS

          RET                          ;RETURN (RANDOM)
RANDOM    ENDP                         ;END RANDOM

首先,我不是ASM的高手。所以试一下,让我知道。这是一个正在运行的程序,但我必须进行一些剪切和粘贴,并且有多个过程,因此请让我知道它是如何工作的,我将尽我最大的努力解决它。

在顶部下方
。MODEL
您将提供:

EXTRN     RANDOM:FAR
然后:

在Random.asm中:

;
          .CODE   
          ASSUME    DS:RAND_DATA
;
RANDOM    PROC      FAR PUBLIC USES CX DX DS,
                    LOWER:WORD, UPPER:WORD
                                        ;FUNCTION RANDOM(LOWER,UPPER)
                                        ;SAVE REGISTERS (USES LIST)
          PUSHF                         ;SAVE FLAGS
          MOV       AX,SEG RAND_DATA    ;SET DS-REGISTER TO POINT
          MOV       DS,AX               ;TO LOCAL DATA SEGMENT
;
;
          POPF                         ;RESTORE FLAGS

          RET                          ;RETURN (RANDOM)
RANDOM    ENDP                         ;END RANDOM

首先,我不是ASM的高手。所以试一下,让我知道。这是一个正在运行的程序,但我必须进行一些剪切和粘贴,并且有多个过程,所以请让我知道它是如何工作的,我将尽我最大的努力解决它。

好的,您只需将任何代码和数据移动到不同的程序集文件中,并保留所有的段定义。然后用
extrn
public
添加几个声明:

file1.asm:

code segment

public convert
convert:
  ; code for the convert routine
  ret

code ends
end
file2.asm:

code segment

extrn convert:near
start:
  ; some code
  call convert
  ; some more code

code ends
end start
您可能需要正式定义子例程:

convert proc
  ; code for the convert routine
  ret
convert endp

好的,您只需将想要移动的任何代码和数据移动到不同的程序集文件中,并保留所有的段定义。然后用
extrn
public
添加几个声明:

file1.asm:

code segment

public convert
convert:
  ; code for the convert routine
  ret

code ends
end
file2.asm:

code segment

extrn convert:near
start:
  ; some code
  call convert
  ; some more code

code ends
end start
您可能需要正式定义子例程:

convert proc
  ; code for the convert routine
  ret
convert endp


您希望它是外部的吗?是的。我想要两个不同的.asm文件。你想要它是外部的吗?是的。我希望有两个不同的.asm文件OK,但是我需要在file2.asm中使用什么代码来告诉它使用file1.asm的数据段中定义的字符串?因为在file1.asm中,我正在将字符串转换为大写,我想在file2.asm中使用相同的字符串(或其副本),并将其打印到屏幕上。如果要执行相同的操作,请添加
extrn sname:byte near
public sname
。或者你可以在一个寄存器中传递变量的地址。@AlexeyFrunze:这就是我的代码所显示的内容,我没有在main中显示push,但是。。。在main.asm中,您可以推送cx和dx,然后如my random.asm
中所示,FAR PUBLIC使用cx dx
。下一行-下…-这些是random.asm中的变量。为什么在
file2.asm
中调用start??你不应该调用convert吗?@frank17现在修复了!好的,但是在file2.asm中需要什么代码来告诉它使用file1.asm的数据段中定义的字符串?因为在file1.asm中,我正在将字符串转换为大写,我想在file2.asm中使用相同的字符串(或其副本),并将其打印到屏幕上。如果要执行相同的操作,请添加
extrn sname:byte near
public sname
。或者你可以在一个寄存器中传递变量的地址。@AlexeyFrunze:这就是我的代码所显示的内容,我没有在main中显示push,但是。。。在main.asm中,您可以推送cx和dx,然后如my random.asm
中所示,FAR PUBLIC使用cx dx
。下一行-下…-这些是random.asm中的变量。为什么在
file2.asm
中调用start??你不应该调用convert吗?@frank17现在修复了!我对这两个答案都投了较高的票,因为它们都帮助我理解了事情是如何运作的,但是我选择了@AlexeyFrunze的答案,因为它似乎更容易理解。谢谢你们两位抽出时间!我再给你一个。:)我对这两个答案都投了较高的票,因为它们都帮助我理解了事情是如何运作的,但是我选择了@AlexeyFrunze的答案,因为它似乎更容易理解。谢谢你们两位抽出时间!我再给你一个。:)