汇编程序.docx

上传人:b****5 文档编号:4601676 上传时间:2022-12-07 格式:DOCX 页数:34 大小:43.23KB
下载 相关 举报
汇编程序.docx_第1页
第1页 / 共34页
汇编程序.docx_第2页
第2页 / 共34页
汇编程序.docx_第3页
第3页 / 共34页
汇编程序.docx_第4页
第4页 / 共34页
汇编程序.docx_第5页
第5页 / 共34页
点击查看更多>>
下载资源
资源描述

汇编程序.docx

《汇编程序.docx》由会员分享,可在线阅读,更多相关《汇编程序.docx(34页珍藏版)》请在冰豆网上搜索。

汇编程序.docx

汇编程序

实验1-1——多字节数的运算

⑴、两个长度为3个字节(3B)的二进制无符号数,分别存放在首地址为buf1和buf2的连续内存单元中,编程求这两者之和,并将结果放在起始地址为res的内存单元中。

例如,这两个数据为888888H、456789H,则其和应为[1]345671H。

源代码如下:

.modelsmall

.modelsmall

.stack

.data

buf1dd888888h

buf2dd456789h

resdd0h

.code

start:

movax,@data

movds,ax

movax,wordptrbuf1;取buf1的低16位

addax,wordptrbuf2;取buf2的低16位+buf1的低16位

movwordptrres,ax;相加结果存入res

movax,wordptrbuf1+2;取buf1的高16位

adcax,wordptrbuf2+2;取buf2的高16位+buf1的高16位+CF

movwordptrres+2,ax;相加结果存入res

;输出

movcx,3;置循环初值

movsi,2

again:

movdl,byteptrres[si];依次取res的两个字节,由高到低

pushcx;保护循环值cx

movcl,4

shrdl,cl;将dl高四位移到低四位

popcx

ordl,30h;将dl高四位转化为ASCII

cmpdl,39h;判断是否大于10

jbenext1

adddl,7;加7转化为A到E字母输出

next1:

movah,2

int21h

movdl,byteptrres[si]

anddl,0fh;将dl高四位清零

ordl,30h;;将dl低四位转化为ASCII

cmpdl,39h

jbenext2

adddl,7

next2:

movah,2

int21h

decsi

loopagain

movax,4c00h

int21h

endstart

运行结果截图

⑵、将两数改为3B的压缩BCD码,重复以上实验过程。

例如,这两个数据为888888H、456789H,则其和应为[1]345677H(表示[1]345677)。

源代码如下:

.modelsmall

.modelsmall

.stack

.data

buf1dd888888h

buf2dd456789h

resdd0h

.code

start:

movax,@data

movds,ax

moval,byteptrbuf1;取buf1的低8位

addal,byteptrbuf2;取buf2的低8位+buf1的低8位

daa;调整为十进制

movbyteptrres,al;相加结果存入res

moval,byteptrbuf1+1;取buf1的中间8位

adcal,byteptrbuf2+1;取buf2的中间8位+buf1的中间8位+CF

daa;调整为十进制

movbyteptrres+1,al;相加结果存入res

moval,byteptrbuf1+2;取buf1的高8位

adcal,byteptrbuf2+2;取buf2的高8位+buf1的高8位+CF

daa;调整为十进制

movbyteptrres+2,al;相加结果存入res

;输出

movcx,3;置循环初值

movsi,2

again:

movdl,byteptrres[si];依次取res的两个字节,由高到低

pushcx;保护循环值cx

movcl,4

shrdl,cl;将dl高四位移到低四位

popcx

ordl,30h;将dl高四位转化为ASCII

cmpdl,39h;判断是否大于10

jbenext1

adddl,7;加7转化为A到E字母输出

next1:

movah,2

int21h

movdl,byteptrres[si]

anddl,0fh;将dl高四位清零

ordl,30h;;将dl低四位转化为ASCII

cmpdl,39h

jbenext2

adddl,7

next2:

movah,2

int21h

decsi

loopagain

movax,4c00h

int21h

endstart

运行结果截图:

实验1-2——BCD码操作

⑴、将存放在首地址为buf的5B的压缩BCD码分离为10B的非压缩BCD码,并存于首地址为res的单元中

原代码如下:

.

.modelsmall

.stack

.data

bufdt1223568941h;

resdt?

.code

start:

movax,@data

movds,ax

movcx,5

xorsi,si;置循环次数

leadi,buf;取其地址

again:

movdl,[di];取两个字节先保存低四位后保存高四位

anddl,0fh;置高四位为零

movbyteptrres[si],dl;保存到res单元

movdl,[di]

pushcx;保护循环次数

movcl,4

shrdl,cl;高四位移到第四位,并置高四位为零

popcx

incsi

movbyteptrres[si],dl

incsi

incdi

loopagain;循环继续取值

decsi;输出,由高位开始输出

movcx,10

again1:

movdl,byteptrres[si];依次取res的两个字节,由高到低

pushcx;保护循环值cx

movcl,4

shrdl,cl;将dl高四位移到低四位

popcx

ordl,30h;将dl高四位转化为ASCII

movah,2

int21h

movdl,byteptrres[si]

anddl,0fh;将dl高四位清零

ordl,30h;;将dl低四位转化为ASCII

movah,2

int21h

decsi

loopagain1

movax,4c00h

int21h

endstart

运行结果截图

⑵、将存放在首地址为buf的10B的非压缩BCD码合并为5B的压缩BCD码,并存于首地址为res的单元中。

10B的非压缩BCD码数据请自行设计。

源代码如下:

.modelsmall

.stack

.data

bufdt01020203050608090401h;

resdt?

.code

start:

movax,@data

movds,ax

movcx,5

xorsi,si;置循环次数

leadi,buf;取其地址

again:

movdl,[di];取两个字节

incdi

moval,[di];再依次取两个字节

pushcx

movcl,4;其中高位移四位

shlal,cl

popcx

ordl,al;相与后将其前导覆盖

movbyteptrres[si],dl;保存到res单元

incsi

incdi

loopagain;循环继续取值

decsi;输出,由高位开始输出

movcx,5

again1:

movdl,byteptrres[si];依次取res的两个字节,由高到低

pushcx;保护循环值cx

movcl,4

shrdl,cl;将dl高四位移到低四位

popcx

ordl,30h;将dl高四位转化为ASCII

movah,2

int21h

movdl,byteptrres[si]

anddl,0fh;将dl高四位清零

ordl,30h;;将dl低四位转化为ASCII

movah,2

int21h

decsi

loopagain1

movax,4c00h

int21h

endstart

运行结果截图:

⑶、将存放在内存单元buf(字节)中的BCD码转为相应的数据并存到res(字节)单元。

例如将35H转换为二进制数据应得到23H、即十进制的35。

源代码如下:

.modelsmall

.stack

.data

bufdb35h

.code

start:

movax,@data

movds,ax

movdl,buf

movcl,4

shrdl,cl

movbl,dl;bl=00000011

movdl,buf

anddl,0fh;dl=00000101

;利用移位指令,实现数值bl乘以10

shlbl,1;bl=00000110

moval,bl

shlbl,1

shlbl,1;bl=00011000

addbl,al;bl=00011110

;将乘于十之后的bl与dl相加

addbl,dl;bl=00100011

;输出

movdl,bl

movcl,4

shrdl,cl

ordl,30h

cmpdl,39h;判断是否大于10

jbenext1

adddl,7;加7转化为A到E字母输出

next1:

movah,2

int21h

movdl,bl

anddl,0fh

ordl,30h

cmpdl,39h

jbenext2

adddl,7

next2:

movah,2

int21h

movax,4c00h

int21h

endstart

运行结果截图:

实验1-3——数据的求和、求均

源代码如下:

.modelsmall

.stack

.data

bufdw0,1,2,3,4,5,6,7,8,9,90,91,92,93,94,95,96,97,98,99

res1dw?

res2dw?

res3dw?

.code

start:

movax,@data

movds,ax

leadi,buf

movcx,14h;循环次数,即20D

xorbx,bx;运算结果保存在bx里面

again:

adcbx,[di]

adddi,2

loopagain

movres1,bx;计算的结果和保存在res1

movdx,0

movax,bx

movbx,0014h

idivbx;计算平均数

movres2,ax;所得的商保存在res2

movres3,dx;所得的余数保存在res3

movbx,res2

movdl,bh;输出商,形式为十六进制

movcl,4

shrdl,cl

ordl,30h

movah,2

int21h

movdl,bh

anddl,0fh

ordl,30h

cmpdl,39h

jbenext1

adddl,7

next1:

movah,2

int21h

movdl,bl

movcl,4

shrdl,cl

ordl,30h

cmpdl,39h

jbenext2

adddl,7

next2:

movah,2

int21h

movdl,bl

anddl,0fh

ordl,30h

cmpdl,39h

jbenext3

adddl,7

next3:

movah,2

int21h

movah,2

movdl,0ah

int21h

movbx,res3

movdl,bh;输出余数,形式为十六进制

movcl,4

shrdl,cl

ordl,30h

movah,2

int21h

movdl,bh

anddl,0fh

ordl,30h

cmpdl,39h

jbenext4

adddl,7

next4:

movah,2

int21h

movdl,bl

movcl,4

shrdl,cl

ordl,30h

cmpdl,39h

jbenext5

adddl,7

next5:

movah,2

int21h

movdl,bl

anddl,0fh

ordl,30h

cmpdl,39h

jbenext6

adddl,7

next6:

movah,2

int21h

movax,4c00h

int21h

endstart

运行结果截图:

实验1-4——联合移位、代码转换和字符输出

⑴、将存放在首地址为buf、长度为3B的数据联合左移2位。

例如,左移前为888888H,左移后应为222220H

源代码如下:

.modelsmall

.stack

.data

bufdf888888h

.code

start:

movax,@data

movds,ax

shlwordptrbuf,1;低四位左移一位

rclwordptrbuf+2,1;高四位循环左移一位

shlwordptrbuf,1;低四位左移一位

rclwordptrbuf+2,1;高四位循环左移一位

;输出

movbx,wordptrbuf+2

movdl,bl

anddl,0fh

ordl,30h

movah,2

int21h

movdl,bl

movcl,4

shrdl,cl

ordl,30h

movah,2

int21h

;以上输出高两个字节

movbx,wordptrbuf

movdl,bh

movcl,4

shrdl,cl

ordl,30h

movah,2

int21h

movdl,bh

anddl,0fh

ordl,30h

movah,2

int21h

;以上输出中间两个字节

movdl,bl

movcl,4

shrdl,cl

ordl,30h

movah,2

int21h

movdl,bl

anddl,0fh

ordl,30h

movah,2

int21h

;以上输出低两个字节

movax,4c00h

int21h

endstart

运行结果截图:

⑵、将存放在首地址为buf、长度为3B数据,通过调用INT21H的AH=02H子功能、以二进制的形式从屏幕输出。

例如,数据为8421A5H,输出应为“100001000010000110100101”。

源代码如下:

.modelsmall

.stack

.data

bufdf8421A5h

.code

start:

movax,@data

movds,ax

movcx,08h;联合向左移位,移位8位

again1:

shlwordptrbuf,1

rclwordptrbuf+2,1

loopagain1

movcx,18h;输出其二进制形式

again2:

shlwordptrbuf,1

rclwordptrbuf+2,1;联合向左移位,借助CF输出起二进制形式

movdl,0

adcdl,30h;借助adc将进位标志CF转化为ASCII输出

movah,2

int21h

loopagain2

movax,4c00h

int21h

endstart

运行结果截图:

实验1-5——字符串的输入输出

源代码如下:

.modelsmall

.stack

.data

keynum=225

stringdbkeynum;定义键盘输入需要的缓冲区

db0

dbkeynumdup(0)

string1db'InputString',"$"

.code

start:

movax,@data

movds,ax

;输出提示信息InputString

movah,09h

movdx,offsetstring1

int21h

;输出回车

movah,02h

movdl,0dh

int21h

;输出换行

movah,02h

movdl,0ah

int21h

;输入字符串

movdx,offsetstring

movah,0ah

int21h

;输出换行

movdl,0ah

movah,2

int21h

movbx,offsetstring+1

movcl,[bx]

movch,0

again:

incbx

movdl,[bx]

cmpdl,'a'

jbdisp

cmpdl,'z';比较是否为小写字母

jadisp

subdl,20h;将小写字母转化为大写字母

disp:

movah,2

int21h

loopagain

movax,4c00h

int21h

endstart

运行结果截图:

实验1-6——分支形成

⑴、一批单字节有符号数,总共20个,分别统计其中0、正数、负数的个数,并将统计结果分别存放在内存单元res_z、res_p及res_m中。

相关数据请自行设计。

源代码如下:

.modelsmall

.stack

.data

count=20

arraydw-4,5,6,0,-2,3,0,-5,-6,5,3,0,-6,8,7,-5,0,4,-3,4

cplusdb0;保存正数的个数

cminusdb0;保存负数的个数

czerodb0;保存零的个数

.code

start:

movax,@data

movds,ax

movsi,offsetarray

movcx,count

again:

cmp[si],0

jlminus;小于零转入小于零计数

jzzero;等于零转入等于零计数

inccplus;否则计数正数

jmpnext

minus:

inccminus

jmpnext

zero:

incczero

next:

addsi,2

loopagain

;输出正数的个数,二进制形式

movbl,cplus

movdl,bl

movcl,4

shrdl,cl

ordl,30h

movah,2

int21h

movdl,bl

anddl,0fh

ordl,30h

movah,2

int21h

movah,2

movdl,0ah

int21h

;输出负数的个数,二进制形式

movbl,cminus

movdl,bl

movcl,4

shrdl,cl

ordl,30h

movah,2

int21h

movdl,bl

anddl,0fh

ordl,30h

movah,2

int21h

movah,2

movdl,0ah

int21h

;输出零的个数,二进制形式

movbl,czero

movdl,bl

movcl,4

shrdl,cl

ordl,30h

movah,2

int21h

movdl,bl

anddl,0fh

ordl,30h

movah,2

int21h

movax,4c00h

int21h

endstart

运行结果截图:

⑵、调用INT21H的AH=01H功能,接收从键盘输入的一个字符,当它为“F”或“f”时,输出“FORTRAN”并退出;当它为“B”或“b”时,输出“BASIC”并退出;当它为“C”或“c”时,输出“C/C++”并退出,当它为“P”或“p”时输出“PASCAL”并退出,如果输入其他字符,则什么也不输出、鸣笛一声退出

源代码如下:

.modelsmall

.stack

.data

string1db'FORTRAN',"$"

string2db'BASIC',"$"

string3db'C/C++',"$"

string4db'PASCAL',"$"

.code

start:

movax,@data

movds,ax

movah,01h

int21h

cmpal,'F';判断是否输入为F和f

jenext1

cmpal,'f'

jenext1;如果是,转入next1

cmpal,'B';判断是否输入为B和b

jenext2

cmpal,'b'

jenext2;如果是,转入next2

cmpal,'C';判断是否输入为C和c

jenext3

cmpal,'c'

jenext3;如果是,转入next3

cmpal,'P';判断是否输入为P和p

jenext4

cmpal,'p'

jenext4;如果是,转入next4

jmpnext5;否则转入next5

next1:

movah,09h

movdx,offsetstring1;显示string1

int21h

jmpnext

next2:

movah,09h

movdx,offsetstring2;显示string2

int21h

jmpnext

next3:

mov

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 人力资源管理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1