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;
}