1

さて、ここにコードがあります:

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'のすべての小文字を大文字に変換するだけです。私の質問は、このコードを2つのモジュールに分割し、そのうちの1つが文字列印刷部分を処理する方法です。具体的には、大文字への文字列変換を処理する.asmモジュールと、以下を処理するモジュールが必要です。

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

これに関する良いチュートリアルが見つからないようですので、いくつかのチュートリアルを教えていただければ幸いです。そうでない場合は、2つの.asmモジュールを組み合わせる方法の簡単な例(必要なディレクティブなど) ) 、 素晴らしいことだ。

4

2 に答える 2

3

移動したいコードとデータを別のアセンブリファイルに移動し、すべてのセグメント定義を保持するだけです。次に、とを使用していくつかの宣言を追加し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
于 2013-02-15T12:01:05.057 に答える
2

下の上部に次の.MODELものを提供します。

EXTRN     RANDOM:FAR

それで:

;
          .CODE
MAIN:
          .STARTUP
;
;     
          CALL      RANDOM 
;
;

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のマスターではありません。だから、それを試してみて、私に知らせてください。これは作業中のプログラムによるものですが、切り取りと貼り付けを行う必要があり、複数の手順があったので、どのように機能するかを教えてください。最善を尽くして解決します。

于 2013-02-15T12:00:35.317 に答える