MASM5汇编中多asm文件怎么正确连接?
我编写的主文件是a.asm,以end start结束。子文件是b.asm,以end结束。为什么用masm b.asm无法生成obj文件,应该怎么正确生成b.obj? 多文件连接是用link a.obj+b.obj命令吧?
主文件a.asm ,调用子文件b.asm的子程序BinHexN,以16进制数输出bx寄存器中的值。
----------------------------------------
extrn BinHexN:far
;* * * * * * * * * * * * * * * * * * * *
parm_seg segment ;define data segment
sum dw 175H
parm_seg ends
;* * * * * * * * * * * * * * * * * * * *
stack_seg segment
dw 100 dup(?)
tos label word
stack_seg ends
;* * * * * * * * * * * * * * * * * * * *
code1 segment ;define code segment
main proc far ;main part of program
assume cs:code1,ds:parm_seg,ss:stack_seg
start:
mov ax,stack_seg
mov ss,ax
mov sp,offset tos
push ds
sub ax,ax
push ax
mov ax,parm_seg ;data segment addr
mov ds,ax ; into DS register
;将变量sum值给bx,调用另一文件子程序BinHexn
mov bx,sum
call far ptr BinHexN
mov dl,0ah
mov ah,2
int 21h
ret
main endp
;---------------------------------------
code1 ends
;* * * * * * * * * * * * * * * * * * * *
end start ;end assembly
子文件b.asm ,用bx作为参数在主程序和子程序间传递,将bx中二进制数用子程序BinHexN显示为16进制数。
----------------------------------------
public binihexn
prognam segment
assume cs:prognam
BinHexN proc far
push ax
push cx
push dx
mov ch,0
mov cl,4
rotate_n:
rol bx,cl ;left digit to right 将BX的内容从左向右移动
mov al,bl ;move to al 将BX的内容从左向右移动到bl后,将bl赋给al,对al进行处理
and al,0fh ;mask off left digit 屏蔽al的高4位
add al,30h ;convert hex to ASCII 转BX的高4位(即1位16进制数)为ASCII码值,以便用DOS功能调用输出。
cmp al,3ah ;is it>9? 该ASCII码大于数字9的ASCII码吗?
jl printit_n ;jump if digit = 0 to 9 不是则跳转到printit直接输出
add al,7h ;digit is A to F 16进制数的ASCII是大于9的A-F数,则转为字母对应的ASCII码。 此例是将计算机中存储的二进制数
转为大写字母输出,也可以输出小写字母。
printit_n:
mov dl,al ;put ASCII char in DL 调用DOS系统功能调用,显示输出dl中的字符
mov ah,2 ;display output funct
int 21h ;call DOS
inc ch ;done 4 digits? 移动BX的内容从左到右所有位分的4组了吗?
cmp ch,4
jne rotate_n ;not yet 没有移动完BX的内容中所有位,继续移动
pop dx
pop cx
pop ax
ret ;return to DOS 返回到DOS
BinHexN endp ;end of main part of prog. 结束main程序
prognam ends ;end of segment 结束代码段
end