[英]x86 assembly - multimodule programming (MASM/TASM)
好的,这是代码:
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模块放在一起(需要哪些指令等)。 ) , 会很好。
好了,您只需将要移动的所有代码和数据移动到另一个程序集文件中,并保留所有段定义。 然后添加一些带有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
在.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的高手。 因此,试一试,让我知道。 这是来自一个正在运行的程序,但是我必须进行一些剪切和粘贴,并且有多个步骤,所以请让我知道它是如何工作的,我将尽力而为。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.