【汇编语言】两个文件的链接

宏汇编

使用宏输出一个字符串

assume cs:code,ds:data,ss:stack
stack segment
s db 1024 dup(?)
stack ends
data segment
string db 'Hello,World!',0dh,0ah,'$'
data ends
code segment
printstr macro str
push ax
push dx
lea dx,str
mov ah,09h
int 21h
pop dx
pop ax
endm
start:
	mov ax,data
	mov ds,ax
	mov ax,stack
	mov ss,ax
	printstr string
	mov ax,4c00h
	int 21h


code ends
end start

注意:宏定义在代码start开始之前

源程序文件的包含

首先,我自己写了两个文件iostream.asm和main.asm。

iostream.asm文件内容

input proc	;从键盘输入一个数,0~65535
push bp
mov bp,sp
push ax
push bx
push cx
mov bx,10
mov word ptr[bp+4],0
again:mov ah,01h
int 21h
cmp al,0dh
je next
xor cx,cx
add cl,al
sub cl,30h
mov ax,word ptr [bp+4]
mul bx
add ax,cx
mov word ptr[bp+4],ax
jmp again
next:pop cx
pop bx
pop ax
pop bp
ret
input endp

output proc	;将刚才输入的数输出到屏幕
push bp
mov bp,sp
push ax
push bx
push dx
mov bx,-1
push bx
mov bx,10
mov ax,word ptr [bp+4]
l1: cmp ax,0
jz l2
xor dx,dx
div bx
add dl,30h
push dx
jmp l1
l2:pop dx
cmp dx,-1
jz done
mov ah,02h
int 21h
jmp l2
done:pop dx
pop bx
pop ax
pop bp
ret 2
output endp

main.asm文件内容

assume cs:code,ds:data,ss:stack
stack segment
s db 1024 dup(?)
stack ends
data segment
n dw ?
result dw ?
data ends
code segment
start:
	mov ax,data
	mov ds,ax
	mov ax,stack
	mov ss,ax
	sub sp,2
	call input
	pop word ptr n
	push word ptr n
	call output
	mov ax,4c00h
	int 21h
include iostream.asm
code ends
end start

在这里插入图片描述
编译、链接、运行。
.asm .obj .exe 这些后缀名可加可不加。
在这里插入图片描述
在这里插入图片描述
main.exe功能是:从键盘输入一个数,并且将这个数输出到屏幕
在这里插入图片描述

目标文件的链接

伪指令——public和extrn

首先,我自己写了两个文件data.asm和main.asm。

data.asm文件的内容

assume cs:code,ds:data
public n
data segment
n dw 245
data ends
code segment
	
code ends
end

main.asm文件的内容

assume cs:code
code segment
extrn n:word
start:
	
	push word ptr n
	call output
	mov ax,4c00h
	int 21h
output proc	;将刚才输入的数输出到屏幕
push bp
mov bp,sp
push ax
push bx
push dx
mov bx,-1
push bx
mov bx,10
mov ax,word ptr [bp+4]
l1: cmp ax,0
jz l2
xor dx,dx
div bx
add dl,30h
push dx
jmp l1
l2:pop dx
cmp dx,-1
jz done
mov ah,02h
int 21h
jmp l2
done:pop dx
pop bx
pop ax
pop bp
ret 2
output endp
code ends
end start

在这里插入图片描述
在data.asm文件中有一个变量n,在main.asm这个文件中使用外文件的数据
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

首先,我自己写了两个文件print.asm和main.asm。

print.asm文件内容

assume cs:code
public output
code segment
output proc	;将刚才输入的数输出到屏幕
push bp
mov bp,sp
push ax
push bx
push dx
mov bx,-1
push bx
mov bx,10
mov ax,word ptr [bp+4]
l1: cmp ax,0
jz l2
xor dx,dx
div bx
add dl,30h
push dx
jmp l1
l2:pop dx
cmp dx,-1
jz done
mov ah,02h
int 21h
jmp l2
done:pop dx
pop bx
pop ax
pop bp
ret 2
output endp
code ends
end

main.asm文件内容

assume cs:code,ds:data
extrn output:near
data segment
n dw 289
data ends
code segment
start:
	mov ax,data
	mov ds,ax
	push word ptr n
	call output
	mov ax,4c00h
	int 21h

code ends
end start

在print.asm文件中有一个子程序output,在main.asm这个文件中使用外文件的子程序
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值