华农总汇编程序设计题汇总情况.docx

上传人:b****1 文档编号:16841598 上传时间:2023-04-23 格式:DOCX 页数:16 大小:17.96KB
下载 相关 举报
华农总汇编程序设计题汇总情况.docx_第1页
第1页 / 共16页
华农总汇编程序设计题汇总情况.docx_第2页
第2页 / 共16页
华农总汇编程序设计题汇总情况.docx_第3页
第3页 / 共16页
华农总汇编程序设计题汇总情况.docx_第4页
第4页 / 共16页
华农总汇编程序设计题汇总情况.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

华农总汇编程序设计题汇总情况.docx

《华农总汇编程序设计题汇总情况.docx》由会员分享,可在线阅读,更多相关《华农总汇编程序设计题汇总情况.docx(16页珍藏版)》请在冰豆网上搜索。

华农总汇编程序设计题汇总情况.docx

华农总汇编程序设计题汇总情况

1.编一个程序,实现从键盘输入一个长度不超过300个字符的串(以回车键作为输入结束),然后在下一行以倒序输出所输入的字符。

DATASSEGMENT

stringdb301dup('$')

ctrldb0ah,0dh,'$'

DATASENDS

STACKSSEGMENT

;此处输入堆栈段代码

STACKSENDS

CODESSEGMENT

ASSUMECS:

CODES,DS:

DATAS,SS:

STACKS

START:

MOVAX,DATAS

MOVDS,AX

leabx,string

Movcx,0

lp1:

movah,1

int21h

cmpal,0dh

jelp2

mov[bx],al

incbx

Inccx

jmplp1

lp2:

decbx

movdl,[bx]

movah,2

int21h

looplp2

exit:

MOVAH,4CH

INT21H

CODESENDS

ENDSTART

2.编写一个程序,从键盘输入一个0~65535之间的10进制无符号数,然后以16进制形式显示出所输入的数。

datasegment

stringdb0dh

numdb4dup(?

),'H$'

tabdb'0123456789ABCDEF'

dataends

codesegment

assumecs:

code,ds:

data

begin:

movax,data

movds,ax;初始化代码段

xorbx,bx

movcx,10;进制

next:

movah,1

int21h

cmpal,0dh

jzconv;如果是回车,表示输入结束,转换开始

pushax;保存输入值,当然还有AH,因为堆栈的存取必须以字为单位

movax,bx

mulcx

movbx,ax;将先前的结果向上推一位

popax;取回本次输入

andal,0fh;屏蔽掉无用位,类SUBAL,30H

xorah,ah;高位归零

addbx,ax;合并本次输入

jmpnext

conv:

movax,bx;开始转换

movch,4

leabx,tab;bx直接定址表

movcl,4

leasi,num

lopa:

rolax,cl;把高4位移到低4位

pushax

andax,000fh;取出低4位

xlat

mov[si],al;按地址由低到高的顺序将结果由高到底存放

incsi

popax

decch

jnzlopa

leadx,string

movah,9

int21h;回车换行

movah,4ch

int21h

codeends

endbegin

3.编写一个程序,计算1+2+3+4+…+100的累加和,并把累加和以2进制形式显示出来(要使用循环累加方法,不能使用公式S=N*(N+1)/2=50*101=5050)。

DATASSEGMENT

sumdw0

DATASENDS

STACKSSEGMENT

;此处输入堆栈段代码

STACKSENDS

CODESSEGMENT

ASSUMECS:

CODES,DS:

DATAS,SS:

STACKS

START:

MOVAX,DATAS

MOVDS,AX

movax,0

movbx,1

lp1:

addax,bx

incbx

cmpbx,101

jenext

jmplp1

next:

movcx,16

movbx,ax

lp3:

shlbx,1

jclp2

movah,2

movdl,0

adddl,30h

int21h

deccx

cmpcx,0

jeexit

jmplp3

lp2:

movah,2

movdl,1

adddl,30h

int21h

deccx

cmpcx,0

jeexit

jmplp3

exit:

MOVAH,4CH

INT21H

CODESENDS

ENDSTART

已知数据块BUFA中存放15个互不相同的字数据,BUFB中存放20个互不相同的字数组,编一个程序,将既在BUFA中出现,又在BUFB中出现的数据存放到BUFC开始的缓冲区中。

DATASSEGMENT

BUFAdb1,3,5,7,9,21,21,21,21,21,21,21,21,21,21

count1dw$-BUFA

BUFBdb1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20

count2dw$-BUFB

BUFCdb15dup(?

DATASENDS

STACKSSEGMENT

STACKSENDS

CODESSEGMENT

ASSUMECS:

CODES,DS:

DATAS,SS:

STACKS

START:

MOVAX,DATAS

MOVDS,AX

leadi,BUFC

movcx,count1

movbx,0

L:

pushcx

moval,BUFA[bx]

incbx

movcx,count2

leasi,BUFB

L2:

movdl,[si]

incsi

cmpal,dl

jzL3

loopL2

jmpL4

L3:

mov[di],dl

incdi

L4:

popcx

loopL

MOVAH,4CH

INT21H

CODESENDS

ENDSTART

5.LINK指向一个字线性表,其中的首单元保存线性表的长度,编一个程序,将该线性表中的0FFFFH项删除。

DATASSEGMENT

linkdw7,0ffffh,2,3,4,5,6,8

bufferdw7dup(0)

DATASENDS

CODESSEGMENT

ASSUMECS:

CODES,DS:

DATAS

START:

MOVAX,DATAS

MOVDS,AX

MOVBX,0

LEASI,LINK

MOVCX,[SI]

LEADI,BUFFER+2

L:

ADDSI,2

MOVAX,[SI]

CMPAX,0FFFFH

JNZCUN

LOOPL

JMPFUZHI

CUN:

MOV[DI],AX

ADDDI,2

INCBX

LOOPL

FUZHI:

LEASI,BUFFER

MOV[SI],BX

LEADI,LINK

MOVCX,BX

L2:

ADDSI,2

ADDDI,2

MOVAX,[SI]

MOV[DI],AX

LOOPL2

MOVAH,4CH

INT21H

CODESENDS

ENDSTART

编写一个程序,从键盘输入一个不大于16位的2进制数,然后以8进制形式显示出所输入的数。

DATASEGMENT

xdw0ah,0dh,'$'

InputBufferdb17,0,17dup(0)

UserInputdw0

DATAENDS

CODESEGMENT

ASSUMECS:

CODE,DS:

DATA

START:

MOVAX,DATA

MOVDS,AX

callGetUserInput;输入子程序

movUserInput,ax;取得输入值16进制,也是2进制

leadx,x

movah,9

int21h

movbx,UserInput;取得输入值

movcl,3;移位数

movch,0;计数

next:

movax,bx

andax,0000000000000111b;取低3(111)位,即八进位

oral,'0';转ascii

pushax;保存

incch;计数

shrbx,cl;左移3位,即下一位

orbx,bx;是否完了

jnznext;未

movcl,ch;取得计数

movch,0;清0

next1:

popdx;弹出dl

movah,2;印出结果

int21h

loopnext1

movah,7;暂停

int21h

quit:

MOVAH,4CH;带返回码结束功能

INT21H;返回系统

;-----------------------

GetUserInput:

movdx,offsetInputBuffer;指向输出缓冲

movax,0c0ah;输入函数,先清空键盘缓冲

int21h

movsi,offsetInputBuffer+2

movcx,0

movcl,[si-1];取实际输入数

jcxzGetUserInput;无输入

CallGetValue;取值子程序,ax传回该值,cf=1表示错误,可能输入非数字

jcGetUserInput;输入错误,非数字

ret

;--------------------------------------------------------------------------

;转值子程序,把输入的字符转成16进制(2进制)

;输入:

ds:

si数字字符串起点,以0dh结束

;输出:

ax=转换后的16进制值,cf=1表示有非数字字符

GetValue:

pushbx

pushdi

xorbx,bx

movdi,10

GetV10:

lodsb;指向起点

movah,0;清除

cmpal,0dh;回车?

jzGetvx

cmpal,'0';以下比较0-1,否则cf=1离开

jbGetvy

cmpal,'1'

jaGetvy

subal,'0';ascii->值

shral,1;cf=1,1cf=0,0

rclbx,1;一位接一位的旋入bx

jmpshortGetV10

Getvx:

movax,bx;ascii转值后由ax转回

clc;成功cf=0

jmpshortGetvz

Getvy:

stc;错误cf=1

Getvz:

popdi

popbx

ret

;------------------------------------

CODEENDS

ENDSTART

以下面形式定义一个长整数,其所占用字节数由N得到,比如128位的数5746352413DE89674523BC9A78563412H定义成:

NUMDB12H,34H,56H,78H,9AH,0BCH,23H,45H

DB67H,89H,0DEH,13H,24H,35H,46H,57H

NDB$-NUM

试编写一个程序,实现对N字节的NUM的值求补,并把求补后的值仍保存在NUM中。

DATASSEGMENT

NUMDB12H,34H,56H,78H,9AH,0BCH,23H,45H

DB67H,89H,0DEH,13H,24H,35H,46H,57H

NDW$-NUM

DATASENDS

STACKSSEGMENT

STACKSENDS

CODESSEGMENT

ASSUMECS:

CODES,DS:

DATAS,SS:

STACKS

START:

MOVAX,DATAS

MOVDS,AX

leasi,NUM

movcx,N

stc;将CF置1

L:

moval,[si]

notal;求补即是取反+1(not为取反)

adcal,0

mov[si],al

incsi

loopL

MOVAH,4CH

INT21H

CODESENDS

ENDSTART

4.编写一个程序,将内存地址0B800H:

0开始的32KB内容保存在文件VRAM.SCN中。

(不考虑文件处理过程中的错误)

DATASEGMENT

PATHNMDB'VRAM.SCN',0

HANDLEDW0

TIP1DB'ERROROPEN!

$'

TIP2DB'ERRORWRITE!

$'

TIP3DB'OK!

$'

DATAENDS

STACKSEGMENTSTACK

DB100HDUP(?

STACKENDS

CODESEGMENT

ASSUMECS:

CODE,DS:

DATA,SS:

STACK

MAINPROCNEAR

START:

MOVAX,DATA

MOVDS,AX

LEADX,PATHNM

xorcx,cx;normal

movax,3c00h

INT21H

JCERROR1

PUSHDS;save

MOVHANDLE,AX

MOVBX,AX

MOVDX,0B800H

MOVDS,DX

XORDX,DX;b800:

0

MOVCX,8000H

MOVAH,40H

INT21H

POPDS;restore

JCERROR2

JMPOK

ERROR1:

MOVAH,09H

LEADX,TIP1

INT21H

JMPEXIT

ERROR2:

MOVAH,09H

LEADX,TIP2

INT21H

JMPEXIT

OK:

MOVAH,09H

LEADX,TIP3

INT21H

MOVBX,HANDLE

MOVAH,3EH;closefile

INT21H

EXIT:

MOVAH,4CH

INT21H

MAINENDP

CODEENDS

ENDMAIN

 

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

当前位置:首页 > 教学研究 > 教学反思汇报

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

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