好的,所以这是代码:
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个模块,其中一个模块将处理字符串打印部分。具体来说,我想要一个处理字符串转换为大写的.asm模块,以及一个处理:
的模块 lea dx,sname
mov ah,09h
int 21h
我似乎无法在此找到任何好的教程,所以如果你能指出我的话,我会非常感激,如果不是,一个如何将2个.asm模块组合在一起的简单例子(指令是什么)需要等等,会很棒。
答案 0 :(得分: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
答案 1 :(得分: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的主人。所以试一试,让我知道。这是来自一个工作程序,但我不得不做一些切割和粘贴,并有多个程序,所以让我知道它是如何工作的,我会尽我所能来解决它。