【汇编语言】实验三

1、编写一个宏,求三个数的最小数,原型为:MIN3 x,y,z,min

assume cs:code,ds:data,ss:stack
stack segment stack
db 1024 dup(?)
stack ends
data segment
str1 db 'please input x: $'
str2 db 'please input y: $'
str3 db 'please input z: $'
str4 db 'min = $'
x dw ?
y dw ?
z dw ?
min dw ?
data ends
code segment
newline macro	;--用于输出回车换行
push ax
push dx
mov dl,0dh
mov ah,02h
int 21h
mov dl,0ah
mov ah,02h
int 21h
pop dx
pop ax
endm
printstr macro str	;--用于输出字符串
push ax
push dx
lea dx,str
mov ah,09h
int 21h
pop dx
pop ax
endm
min3 macro x,y,z,min	;计算x,y,z中最小的数
push ax
mov ax,x
cmp ax,y
jl q1
mov ax,y
q1:cmp ax,z
jl q2
mov ax,z
q2:mov min,ax
pop ax
endm
start:
	mov ax,data
	mov ds,ax
	mov ax,stack
	mov ss,ax

	;输入x,y,z
	printstr str1
	sub sp,2
	call input
	pop word ptr x
	printstr str2
	sub sp,2
	call input
	pop word ptr y
	printstr str3
	sub sp,2
	call input
	pop word ptr z
	
	;调用min3宏
	min3 x,y,z,min
	
	;输出min
	printstr str4
	push word ptr min
	call output 
	
	mov ax,4c00h
	int 21h


input proc	;从键盘输入一个数,(-32768~32767)
push bp
mov bp,sp
push ax
push bx
push cx
push si
mov bx,10
mov word ptr[bp+4],0
mov si,1
again:mov ah,01h
int 21h
cmp al,45
jnz f1
mov si,-1
jmp again
f1: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:mov ax,word ptr[bp+4]
imul si
mov word ptr[bp+4],ax
pop si
pop cx
pop bx
pop ax
pop bp
ret
input endp

output proc	;将数输出到屏幕(-32768~32767)
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]
add ax,0
jns l1
mov dl,45
mov ah,02h
int 21h
mov ax,word ptr [bp+4]
neg ax
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

在这里插入图片描述
2、挂接1CH中断,正计时60秒后退出。要求屏幕显示0-59的秒数。

assume cs:code,ds:data,ss:stack
stack segment stack
db 1024 dup(?)
stack ends
data segment
num dw ?
count dw 0
oldisr dw ?,?
timer db 100
isdone db 0
str db 'please input a num : $'
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 str
	sub sp,2
	call input
	pop num
	
	;获取原来中断向量的值,并保存
	mov ax,351ch
	int 21h
	mov oldisr[0],bx
	mov oldisr[2],es
	
	;将子程序的段地址:偏移地址赋值给原中断向量
	push ds
	mov dx,offset isr
	mov ax,seg isr
	mov ds,ax
	mov ax,251ch
	int 21h
	pop ds
	
	;调用新中断向量,int 1ch
	waithere:
	cmp isdone,1
	jnz waithere
	
	;现在中断向量的值修改为刚开始保存原中断向量的值。
	push ds
	mov dx,oldisr[0]
	mov ax,oldisr[2]
	mov ds,ax
	mov ax,251ch
	int 21h
	pop ds
	
	mov ax,4c00h
	int 21h
isr proc
push ax
push dx
push bx
sti
mov bx,num
inc timer
cmp timer,1000/55
jb g2
mov timer,0
mov dl,13
mov ah,2
int 21h
cmp count,9
jg g1
mov dl,30h
mov ah,2
int 21h
g1:
push count
call output
inc count
cmp count,bx
jl g2
mov isdone,1
g2:
pushf
call dword ptr oldisr
cli
pop bx
pop dx
pop ax
iret
isr endp

input proc	;从键盘输入一个数,(-32768~32767)
push bp
mov bp,sp
push ax
push bx
push cx
push si
mov bx,10
mov word ptr[bp+4],0
mov si,1
again:mov ah,01h
int 21h
cmp al,45
jnz f1
mov si,-1
jmp again
f1: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:mov ax,word ptr[bp+4]
imul si
mov word ptr[bp+4],ax
pop si
pop cx
pop bx
pop ax
pop bp
ret
input endp

output proc	;将数输出到屏幕(-32768~32767)
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]	;	直接送到ax有些糟糕了
cmp ax,0
jnz l
mov dl,30h
mov ah,02h
int 21h
mov ax,word ptr [bp+4]
l:
add ax,0
jns l1
mov dl,45
mov ah,02h
int 21h
mov ax,word ptr [bp+4]
neg ax
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

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3、VC++中编写内联汇编,将字节数组char dbyte[] = {0x34,0x45,0x56,0x67,0xaf}的每个元素高低四位互换,并显示出来。

#include<iostream>
using namespace std;
unsigned char change(unsigned char x) {
	unsigned char c;
	__asm {
		mov cl, 4;
		mov al, x;
		mov bl, x;
		shl al, cl;
		shr bl, cl;
		or al, bl;
		mov c, al;
	}
	return c;
}
int main() {
	char dbte[] = { 0x34,0x45,0x56,0x67,0xaf };
	for (int i = 0; i < 5; i++) {
		cout << "0x" << hex << (int)change(dbte[i]) << "H ";
	}
	return 0;
}

在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值