实验三 高级汇编程序设计

实验三 高级汇编程序设计

一. 实验目的

1、汇编语言宏程序设计;

2、 掌握中断服务子程序的编写。

二. 实验内容

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

2、挂接1CH中断,正计时60秒后退出。要求屏幕显示0-59的秒数。

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

三. 实验过程和程序

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

MIN3 MACRO x,y,z,min

MOV BL,x

MOV BH,y

MOV CL,z

CMP BL,BH

JB S

CMP BH,CL

JB B2

MOV AL,CL

JMP DONE

S:

CMP BL,CL

JB B1

MOV AL,CL

JMP DONE

B2:MOV AL,BH

JMP DONE

B1:MOV AL,BL

JMP DONE

DONE:

MOV DL,AL

MOV AH,2

ADD DL,30H

INT 21H

ENDM

DATA SEGMENT

output DB 0ah,0dh,“min=”,"$"

MIN_DATA DB 0

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA

START:

MOV AX,DATA

MOV DS,AX

LEA DX,output

MOV AH,9

INT 21H

MIN3 3,2,1,MIN_DATA

MOV AH,4CH

INT 21H

CODE ENDS

END START

2、挂接1CH中断,正计时60秒后退出。要求屏幕显示0-59的秒数。

stack segment stack

dw 512 dup(?)

stack ends

data segment

oldisr dw ?,?

counter db 100

line db 0dh,0ah,’$'

isdone db 0

count db 0

data ends

code segment

assume cs:code,ds:data,ss:stack

start: mov ax,data

mov ds, ax

mov ax,0

mov es,ax

cli;关中断

mov ax,es:[1ch*4]

mov oldisr[0],ax

mov ax,es:[1ch*4+2]

mov oldisr[2],ax

mov word ptr es:[1ch*4],offset isr

mov word ptr es:[1ch*4+2],seg isr

sti;开中断,进行系统调用

again: cmp isdone,60

jz done;执行完毕必须得要跳出中断

jnz again

done: mov ax,oldisr[0]

mov es:[1ch*4],ax

mov ax,oldisr[2]

mov es:[1ch*4+2],ax

mov ah,4ch

int 21h

isr proc far;系统调用

push ax

push bx

push dx

sti;

inc count

cmp count ,1000/55;利用中断来确定秒数

jb next

mov count,0

mov al,isdone

xor ah,ah

mov bl,0ah

div bl;做除法后余数放在ah,商放在al

mov dh,ah;开始输出

mov dl,al

mov ah,02h

add dl,30h

int 21h

mov ah,02h

mov dl,dh

add dl,30h

int 21h

mov ah,09h;换行

mov dx,offset line

int 21h

inc isdone

next: pushf

call dword ptr oldisr

cli;关闭中断

pop dx

pop bx

pop ax

iret

code ends

end start

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

*#include********
********using namespace std;********
********int main()********
********{********
********char dbyte[] = { 0x34, 0x45, 0x67, 0xaf };********
********for (int i = 0; i < 4; i++){********
********cout << int(dbyte[i]) << " ";********
********}********
********cout << endl;********
********_asm{********
********mov esi,0********
********mov ecx,4********
********again:********
********mov dl, dbyte[esi]********
********mov eax,0********
********snext:********
********ror dl,1********
********inc eax********
********cmp eax,4********
********jne snext********
********mov dbyte[esi],dl********
********add esi,1********
********loop again********
********}********
********for (int i = 0; i < 4; i++){********
********cout << int(dbyte[i]) << " ";********
********}********
********cout << endl;********
********return 0;********
********}*

四. 实验结果(包括必要的截图)

1.

img

img

img

img

img

img

四.** 实验结果(包括必要的截图)

1.

img

img

img

img

img

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值