当前位置:文档之家› 24个汇编实例小程序

24个汇编实例小程序

24个汇编实例小程序
24个汇编实例小程序

24个汇编小程序

题目列表:

1.逆序输出字符串“BASED ADDRESSING”

2.从键盘上输入两个数,分别放到x,y单元,求出它们的和

3.是编写一段程序,要求在长度为10h的数组中,找出大于42h的无符号数的个数并存入地址为up开始区域,找出小于42h的无符号数的个数并存入地址为down的开始区域

4.键盘输入一段字符串,其中小写字母以大写字母输出,其他字符不变输出

5.从键盘上就收一个小写字母,找出它的前导字符和后续字符,在顺序显示这三个字符

7.把一个包含20个数据的数组M分成两组:正整数组P和负整数组N,分别把这两个数组中的数据的个数显示出来

8.求出首地址为data的100个字数组中的最小偶数,并把它放在ax中

9输入两船字符串string1和string2,并比较两个字符串是否相等,相等就显示“match”,否则显示“no match”

10从键盘接收一个四位的十六进制数,并在终端显示与它等值的二进制数

11从键盘输入一系列以$为结束符的字符串,然后对其中的非数字字符计数,并显示计数结果

12有一个首地址为mem的100个字的数组,试编程序删除数组中所有为零的项,并将后续项向前压缩,最后将数组的剩余部分补上零

13.从键盘上输入一串字符(用回车键结束,使用10号功能调用)放在string中,是编制一个程序测试字符串中是否存在数字。如有,则把cl的第五位置1,否则将该位置置0

14.在首地址为data的字数组中,存放了100h的16位字数据,试编写一个程序,求出平均值放在ax寄存器中,并求出数组中有多少个数小于此平均值,将结果放在bx寄存器中(f 分别考虑有符号数、无符号数情况)

15.一直数组A包含15个互不相等的整数,数组B包含20个互不相等的整数。试编制一个程序,把既在A中又在B中出现的整数存放于数组C中

16.设在A、B和D单元中分别存放着三个数。若三个数都不是0,则求出三个数的和并存

放在S单元,若其中有一个数为0,则把其它两个单元也清零。请编写此程序

17.从键盘输入一系列字符(以回车键结束),并按字母、数字和其他字符分类计数,最后显示这三类的计数结果

18.已定义两个整数变量A和B,试编写程序完成以下功能

(1)若两个树种有一个是奇数,则将奇数存入A中,偶数存入B中

(2)若两个数均为奇数,则将两个数加1后存回原变量

(3)若两个数均为偶数,则两个变量均不变

19.写一段子程序skiplines,完成输出空行的功能。空行的行数由用户在主程序中通过键盘输入,并将行数放在ax寄存器中

20.设有10个学生成绩分别是76, 69,84,73,88,99,63,100和80。试编写一个子程序统计60-69分,70-79分,80-89分,90-99分和100分的人数,并分别放到S6,S7,S8,S9,S10单元中

21.编写子程序嵌套结构的程序,把整数分别用二进制和八进制显示出来

22.在D盘根目录建立一个文件abc.txt,第一次向文件写入“123456”六个字符,第二次增加“abcdefg”几个字符

23从键盘上输入文本文件:“d:\temp.txt”的内容后,然后新建一个文件“d:\temp2.txt”,把前一个文件的所有内容复制到后一个文件中

24从键盘上输入一个十进制数,以十六进制数显示出来。要求子程序用寄存器参数传送方法

25.试编制一个程序,把bx寄存器中的二进制数用十六进制数的形式在屏幕上显示出来

代码:

1.逆序输出字符串“BASED ADDRESSING”

s1 segment stack ;定义栈段s1

dw 100 dup(?) ;定义栈空间为100

top label word ;top指向栈顶

s1 ends

s2 segment ;定义数据段s2

s db 'BASED ADDRESSING','$' ;定义字符串s

S2 ends

s3 segment ;定义代码段s3

assume cs:s3,ds:s2,ss:s1

main proc far

mov ax,s1 ;栈初始化——

mov ss,ax

lea sp,top ;——栈初始化

mov ax,s2 ;数据段初始化——

mov ds,ax ;——数据段初始化

mov si,15

l: mov dl,s[si] ;dl获取字符串s的最后一个(从零开始的第十五个字符)mov ah,2 ;调用int 21h 2号功能输出dl上的值

int 21h

dec si ;寄存器减一,准备获取下一个字符

cmp si,0

ja l

mov ah,4ch ;终止

int 21h

main endp

s3 ends

end main

2.从键盘上输入两个数,分别放到x,y单元,求出它们的和

s1 segment stack

dw 100h dup(?)

top label word

s1 ends

s2 segment

h1 db 'Please input x:','$' ;提示输入

h2 db 'Please input y:','$' ;提示输入

h3 db 'z=x+y:','$' ;提示输出

crlf db 0dh,0ah,24h ;定义回车换行

x dw ?

y dw ?

s2 ends

s3 segment

assume cs:s3,ds:s2,ss:s3

main proc far

mov ax,s1 ;初始化——

mov ss,ax

lea sp,top

mov ax,s2

mov ds,ax ;——初始化

lea dx,h1 ;int 21h 9号功能输出“提示输入x”的字符串

mov ah,9

int 21h

xor bx,bx ;bx清零,即把bx置零

InputX:

mov ah,1 ;输入一个字符

int 21h

cmp al,0dh ;判断时候为“回车”字符

jz exit1 ;如果是回车字符就跳转到exit1

cmp al,30h ;和30h(即字符0的asii值)比较

jl exit1 ;如果输入字符小于'0',跳转到exit1

cmp al,39h ;和39h(即字符9的ascii值)比较

jg exit1 ;如果输入字符大于'9',跳转到exit1

sub al,30h ;al减去30h,输入字符转化成数字(从这一行开始到后面的add bx,ax为输入字符转化为数字的处理方法)

cbw ;al扩充为ax

xchg ax,bx

mov cx,10

mul cx

xchg ax,bx

add bx,ax ;sub al,30h开始到这一行为输入字符转化为数字的处理方法

jmp InputX

exit1: mov x,bx ;把输入的存于bx的放到x中

lea dx,crlf

mov ah,9

int 21h

lea dx,h2

mov ah,9

int 21h

xor bx,bx

InputY: ;和InputX类似,输入y

mov ah,1

int 21h

cmp al,0dh

jz exit2

cmp al,30h

jl exit2

cmp al,39h

jg exit2

sub al,30h

cbw

xchg ax,bx

mov cx,10

mul cx

xchg ax,bx

add bx,ax

jmp InputY

exit2: mov y,bx ;把输入的存于bx的放到y中

mov bx,x

add bx,y ;此时bx为两数加和

lea dx,crlf

mov ah,9

int 21H

lea dx,h3

mov ah,9

int 21h

xor si,si ;si清零,用作计数

mov ax,bx ;把和放到ax上

l4: mov cl,10 ;把和连续除以10知道和变为零,余数依次进栈div cl

mov dl,ah

mov dh,0

push dx

inc si

mov ah,0 ;重要,不能漏写

cmp al,0

jnz l4

l5: pop dx ;余数依次出栈

add dl,30h ;余数转换为显示的余数字符

mov ah,2 ;输入余数字符

int 21h

dec si

cmp si,0

jnz l5

mov ah,4ch

int 21H

main endp

s3 ends

end main

3.是编写一段程序,要求在长度为10的数组中,找出大于42h的无符号数的个数并存入地址为up开始区域,找出小于42h的无符号数的个数并存入地址为down的开始区域,并分别显示up、down数组的个数和数组内的数字

s1 segment stack

dw 100h dup(?)

top label word

s1 ends

s2 segment

h1 db 'the num of up array and the up array are(prints in decimalism) :','$'

h2 db 'the num of down array and the down array are(prints in decimalism) :','$'

crlf db 0dh,0ah,24h

array db 0,50h,11h,61h,22h,72h,33h,73h,41h,74h,'$' ;定义数组array

up db 10 dup(?) ;定义up数组down db 10 dup(?) ;定义down数组

s2 ends

s3 segment

assume cs:s3,ds:s2,ss:s3

main proc far

mov ax,s1

mov ss,ax

lea sp,top

mov ax,s2

mov ds,ax

mov si,0

mov di,1

mov bp,1

repeat: cmp array[si],42h ;把array数组中小于42h的值放到down数组里,大于42h 的值放到up数组里面

jb downarray

mov dl,array[si]

mov up[bp],dl

inc si

cmp si,10

jz exit1

inc bp

jmp repeat

downarray:

mov dl,array[si]

mov down[di],dl

inc si

cmp si,10

jz exit2

inc di

jmp repeat

exit1: sub di,1

jmp exit

exit2: sub bp,1

exit: mov dx,bp ;把分配好的up数组和down数组在其有效数字后面添加'$',便于后面的输出结束

mov up[0],dl

inc bp

mov up[bp],'$'

mov dx,di

mov down[0],dl

inc di

mov down[di],'$'

mov cl,10

mov si,0

lea dx,h1

mov ah,9

int 21h

PrintUparray:

cmp up[si],'$'

jz next

mov al,up[si]

call print

inc si

jmp PrintUparray

next:

lea dx,crlf

mov ah,9

int 21h

lea dx,h2

int 21h

xor si,si

PrintDownArray:

cmp down[si],'$'

jz atend

mov al,down[si]

call print

inc si

jmp PrintDownArray

print proc near ;print为输出十进制输出某个数的子程序mov di,0

rediv: mov ah,0

div cl

mov dl,ah

mov dh,0

push dx

inc di

cmp al,0

jnz rediv

break: pop dx

add dl,30h

mov ah,2

int 21h

dec di

cmp di,0

jnz break

mov dl,' '

mov ah,2

int 21H

ret

print endp

atend: mov ah,4ch

int 21H

main endp

s3 ends

end main

4.键盘输入一段字符串,其中小写字母以大写字母输出,其他字符不变输出

s1 segment stack

dw 100h dup(?)

top label word

s1 ends

s2 segment

h1 db 'Please input a string:','$'

h2 db 'The changed string is:','$'

crlf db 0dh,0ah,24h

temp db ?

s2 ends

s3 segment

assume cs:s3,ds:s2,ss:s3

main proc far

mov ax,s1

mov ss,ax

lea sp,top

mov ax,s2

mov ds,ax

lea dx,h1

mov ah,9

int 21h

mov si,0

l: mov ah,1

int 21h

cmp al,0dh

jz exit

cmp al,'a'

jl putin

cmp al,'z'

jg putin

sub al,20h ;把小写字符变为大写字符

putin: mov temp[si],al ;把字符放到temp数组里

inc si

jmp l

exit: lea dx,crlf ;输出tmp数组

mov ah,9

int 21h

lea dx,h2

mov ah,9

int 21h

inc si

mov temp[si],'$'

lea dx,temp

mov ah,9

int 21h

mov ah,4ch

int 21H

main endp

s3 ends

end main

5.从键盘上就收一个小写字母,找出它的前导字符和后续字符,在顺序显示这三个字符

s1 segment stack

dw 100h dup(?)

top label word

s1 ends

s2 segment

h1 db 'Please input a lowercase: ','$'

h2 db 'The the three chars are: ','$'

crlf db 0dh,0ah,24h

s2 ends

s3 segment

assume cs:s3,ds:s2,ss:s3

main proc far

mov ax,s1

mov ss,ax

lea sp,top

mov ax,s2

mov ds,ax

l: lea dx,h1

mov ah,9

mov ah,1

int 21h

cmp al,'a'

jl l

cmp al,'z'

jg l

mov cl,al

lea dx,crlf

mov ah,9

int 21H

lea dx,h2

mov ah,9

int 21h

dec cl

mov dl,cl ;输出前导字符

mov ah,2

int 21h

mov dl,' '

mov ah,2

int 21h

inc cl

mov dl,cl ;输出该字符mov ah,2

int 21h

mov dl,' '

mov ah,2

int 21h

inc cl

mov dl,cl ;输出后导字符

mov ah,2

int 21h

mov ah,4ch

int 21H

main endp

s3 ends

6.把一个包含20个数据的数组M分成两组:正整数组P和负整数组N,分别把这两个数组中的数据的个数显示出来

s1 segment stack

dw 100h dup(?)

top label word

s1 ends

s2 segment

h1 db 'the positive number is: ','$'

h2 db 'the negative number is: ','$'

crlf db 0dh,0ah,24h

array dw 50h,-11h,61h,-22h,72h,-33h,73h,-41h,74h,21h,67h,-90h,73h,77h,-1h,-89h,-11h,61h,-22h,20h,'$'

s2 ends

s3 segment

assume cs:s3,ds:s2,ss:s3

main proc far

mov ax,s1

mov ss,ax

lea sp,top

mov ax,s2

mov ds,ax

mov bx,0

mov si,0

l: mov dx,array[si]

cmp dx,0

jl addlow ;有符号数比较用jl

add si,2

cmp si,40

jz exit

jmp l

addlow: inc bx

add si,2

cmp si,40

jz exit

jmp l

mov ah,9

int 21h

mov ax,bx

call print

lea dx,crlf

mov ah,9

int 21h

lea dx,h1

mov ah,9

int 21h

mov ax,20

sub ax,bx

call print

jmp atend

print proc near ;打印数字字符的子程序

mov cl,10

mov si,0

repeat: div cl

mov dl,ah

add dl,30h

mov dh,0

push dx

inc si

mov ah,0

cmp al,0

jnz repeat

l2: pop dx

mov ah,2

int 21h

dec si

cmp si,0

jnz l2

ret

print endp

int 21H

main endp

s3 ends

end main

7.打印输出首地址为data的20个字数组中的最小偶数

s1 segment stack

dw 100h dup(?)

top label word

s1 ends

s2 segment

h1 db 'the min even number is: ','$'

crlf db 0dh,0ah,24h

data dw 50,-11,61,-22,72,-33,73,-41,74,21,67,-90,73,77,-1,-89,-11,61,-22,20,'$' s2 ends

s3 segment

assume cs:s3,ds:s2,ss:s1

main proc far

mov ax,s1

mov ss,ax

lea sp,top

mov ax,s2

mov ds,ax

mov bx,65534 ;bx存最小数,初始令最小值置为65534

mov si,0

mov cl,100

mov dl,2

l2: mov ax,data[si]

cmp ax,0

jnl l4

neg ax ;如果是负数,则求补

l4: div cl

mov al,ah

mov ah,0

div dl

cmp ah,0

jnz l1

cmp bx,data[si] ;比较最小值和数组中的每个数

jl l1 ;如果数组中的数大于最小值跳转到l1

mov bx,data[si] ;如果数组中的数小于最小值则将其赋给最小值

l1: add si,2

cmp si,40

jz exit

jmp l2

exit: lea dx,h1

mov ah,9

int 21h

cmp bx,0

jnl l5

neg bx

mov dl,'-'

mov ah,2

int 21h

l5: mov ax,bx

call print ;调用子程序输出最小值

jmp atend

print proc near

mov cl,10

mov si,0

repeat: div cl

mov dl,ah

add dl,30h

mov dh,0

push dx

inc si

mov ah,0

cmp al,0

jnz repeat

mov ah,2

int 21h

dec si

cmp si,0

jnz l3

ret

print endp

atend: mov ah,4ch

int 21H

main endp

s3 ends

end main

8.输入两船字符串string1和string2,并比较两个字符串是否相等,相等就显示“match”,否则显示“no match”

s1 segment stack

dw 100h dup(?)

top label word

s1 ends

s2 segment

h1 db 'Please input the first string: ','$'

h2 db 'Please input the second string: ','$'

h3 db 'MATCH','$'

h4 db 'NO MATCH','$'

crlf db 0dh,0ah,24h

str1 db 50,?,50 dup('$')

str2 db 50,?,50 dup('$')

s2 ends

s3 segment

assume cs:s3,ds:s2,ss:s3

main proc far

mov ax,s1

mov ss,ax

lea sp,top

mov ax,s2

mov ds,ax

mov ah,9

int 21h

lea dx,str1

mov ah,0ah

int 21h

lea dx,crlf

mov ah,9

int 21h

lea dx,h2

int 21h

lea dx,str2

mov ah,0ah

int 21h

lea dx,crlf

mov ah,9

int 21h

mov dl,str1+1 ;str1+1为str1实际的字符个数

cmp dl,str2+1 ;str2+1为str2实际的字符个数

jnz l

mov si,2

l2: mov dl,str1[si]

cmp dl,str2[si]

jnz l

inc si

cmp si,50

jz l3

jmp l2

l: lea dx,h4 ;输出不匹配信息

mov ah,9

int 21h

l3: lea dx,h3 ;输出匹配信息

mov ah,9

int 21h

int 21H

main endp

s3 ends

end main

9.从键盘接收一个四位的十六进制数,并在终端显示与它等值的二进制数

s1 segment stack

dw 100h dup(?)

top label word

s1 ends

s2 segment

h1 db 'Please input a hexadecimal number: ','$'

h2 db 'The number is printed in binary number: ','$'

temp db 17 dup('$')

crlf db 0dh,0ah,24h

s2 ends

s3 segment

assume cs:s3,ds:s2,ss:s3

main proc far

mov ax,s1

mov ss,ax

lea sp,top

mov ax,s2

mov ds,ax

repeat: lea dx,h1

mov ah,9

int 21h

mov bx,0

mov cx,4

newchar: ;接收新字符

mov ah,1

int 21h

cmp al,30h

jb repeat

cmp al,46h

jg repeat

jnb l1 ;如果输入字符大于9跳到l1

sub al,30h

jmp l2

l1: cmp al,41h

jb repeat ;如果输入字符小于A,则输入错误,跳到repeat

sub al,37h ;输入字符为A~Z,故相应地要减37h

jmp l2

l2: cbw ;l2为把输入字符转化为数值

xchg ax,bx

mov dx,10h

mul dx

xchg ax,bx

add bx,ax

;loop newchar

dec cx

cmp cx,0

jnz newchar

lea dx,crlf

mov ah,9

int 21h

lea dx,h2

int 21h

mov si,0

mov cx,10h ;cx作计数器,即待会要循环16次

l5: rol bx,1 ;bx循环左移以为,最高位进标志位

jc l3 ;若标志位为1则跳转到l3

mov temp[si],'0'

jmp l4

l3: mov temp[si],'1'

l4: inc si

loop l5

lea dx,temp

mov ah,9

int 21h

mov ah,4ch

int 21H

main endp

s3 ends

end main

10从键盘输入一系列以$为结束符的字符串,然后对其中的非数字字符计数,并显示计数结果

s1 segment stack

dw 100h dup(?)

top label word

s1 ends

s2 segment

h1 db 'Please input a string: ','$'

h2 db 'The number of the chars that is not digit:','$'

crlf db 0dh,0ah,24h

s2 ends

s3 segment

assume cs:s3,ds:s2,ss:s3

main proc far

mov ax,s1

mov ss,ax

lea sp,top

mov ax,s2

mov ds,ax

lea dx,h1

mov ah,9

int 21h

mov cx,0

l2: mov ah,1

int 21h

cmp al,'$'

jz exit

cmp al,30h

jb l

cmp al,39h

jnb l

jmp l2

汇编语言程序设计练习题

汇编语言程序设计练习题 一、字符与串处理类 1.逆序输出字符串“BASED ADDRESSING”。 2.试编写一段程序,要求对键盘输入的小写字母用大写字母显示出来。 3.编写程序,从键盘接收一个小写字母,然后找出它的前导字符和后续字符,再按顺序显示这三个字符。 4.从键盘上输入一系列以$为结束符的字符串,然后对其中的非数字字符计数,并显示计数结果。 5.从键盘上输入一串字符(用回车键结束,使用0A号功能调用。)放在STRING中,试编制一个程序测试字符串中是否存在数字。如有,则把CL的第5位置1,否则将该位置置0。 6.从键盘上输入一串字符(用回车键结束,使用0A号功能调用。),将其中的小写英文字母变换为大写英文字母,其他字符保持不变。然后将变换后的字符串显示出来。 7.试编制一个程序:从键盘输入一行字符,要求第一个键入的字符必须是空格符,如不是,则退出程序;如是,则开始接收键入的字符并顺序存放在首地址为buffer的缓冲区中(空格符不存入),直到接收到第二个空格符时退出程序。 8.试编写一段程序,要求比较两个字符串string1和string2所含字符是否相等,如相等则显示“MATCH”, 若不相同则显示“NO MATCH”。 9.试编写一段程序,要求输入两个字符串,如两个字符串相等则显示“MATCH”, 否则显示“NO MATCH”。 10.试编写一段程序,要求在长度为100H字节的数组中,找出大于61H的无符号数的个数并存入字节单元UP中,找出小于2FH的无符号数的个数并存入字节单元DOWN中。 11.在内存区域0B800:0000-0B800:0FFFF(都是16进制数)内查找首地址为SOURCE的串(SOURCE的首字节为串长度),如果找到,则把AL的第0位置0,否则将该位置置1。 12.已知数组A包含15个互不相等的整数,数组B包含20个互不相等的整数。试编制一个程序,把既在A中又在B中出现的整数存放于数组C中。 13.在附加段中,有一个首地址为LIST和未经排序的字数组。在数组的第一个字中,存放着该数组的长度,数组的首地址已存放在DI寄存器中,AX寄存器中存放着一个数。要求编制一个程序:在数组中查找该数,如果找到此数,则把它从数组中删除。 二、数字输入输出类 1. 试编制一个程序,把BX寄存器内的二进制数以十六进制数的形式在屏幕上显示出来。 2. 试编制一个程序,把BX寄存器内的二进制数以八进制数的形式在屏幕上显示出来。 3. 试编制一个程序,把BX寄存器内的二进制数以十进制数的形式在屏幕上显示出来。 4.从键盘上输入2个一位数,求出它们的和(假设和不超过1位)。 5.试编写一段程序,从键盘接收一个四位的十六进制数,并在终端上显示与它等值的二进制数。 6.试编写一段程序,从键盘接收一个0-65535间的十进制无符号数,并在终端上显示与它等值的二进制数。 7.试编写一段程序,从键盘接收一个-32768-32767间的十进制有符号数,并在终端上显示与它等值的二进制数。 8.编写一个程序,从键盘输入一个0~65535之间的10进制无符号数,然后以16进制

汇编经典小程序(精编文档).doc

【最新整理,下载后即可编辑】 实验一:判断一个数X的正,负数,还是零。(假设是正数,输出+,是负数,输出-,是零,输出This is a zore !) DATA SEGMENT X DB 10 CR EQU 0DH LF EQU 0AH W DB 'This is a zore!',CR,LF,'$' ZHENG DB '+',CR,LF,'$' FU DB '-',CR,LF,'$' DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX MOV AL,X AND AL,AL JZ L1 SHL AL,1 JC L3 JMP L2 L1: MOV DX,OFFSET W MOV AH,9 INT 21H JMP L4 L2: MOV DX,OFFSET ZHENG MOV AH,9 INT 21H JMP L4 L3: MOV DX,OFFSET FU MOV AH,9 INT 21H

L4: MOV AH,4CH INT 21H CODE ENDS END START 实验二:求十个数中的最小数,并以十进制输出。(若要求最大的,只要把JC 改为JNC 即可)(仅局限于0---16间的数比较,因为ADD AL,30H只是针对一位的十六进制转换十进制的算法)DATA SEGMENT XDAT DB 0AH,1FH,02H,03H,04H,05H,06H,07H,08H,09H MIN DB ? CR EQU 0DH LF EQU 0AH W DB ' is min',CR,LF,'$' DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX MOV CX,9 MOV SI,OFFSET XDAT MOV AL,[SI] L2: CMP AL,[SI+1] JC L1 MOV AL,[SI+1] L1: INC SI LOOP L2 ADD AL,30H MOV DL,AL MOV AH,2

汇编程序习题

汇编程序习题 1.试分析以下程序段完成什么功能? MOV CL,4 SHL DX,CL SHL AX,CL SHR BL,CL INT 3 2.写出执行以下计算的指令序列: 1)Z←W+(Z-X)2)Z←W-(X+6)-(R+10) 3)Z←(W*X)/(R+6)4)Z←((W-X)/5*Y)*2 3.求两个数56H和67H进行ADD,并求出标志OF,CF,SF,ZF的值。4.阅读程序段,回答下述问题: 1)MOV AX,4000H 2)MOV AX,5678H 3)MOV AX,1234H OV DS,AX MOV BX,99AAH MOV CX,8912H MOV BX,1238H PUSH BX CMP AX,CX MOV〔BX〕,2244H PUSH AX INT 3 MOV AL,〔BX〕 POP DX SF=?OF=?JA成立否? INT 3 POP CX AL=?存储器的物理地址=?DX=?CX=? 5.下列程序能完成什么功能? DATY1 DB 300DUP(?) DATY2 DB 100DUP(?) …… MOV CX,100 MOV BX,200 MOV SI,0 MOV DI,0 NEXT:MOV AL,DATY1〔BX〕〔SI〕 MOV DATY2〔DI〕,AL

INC SI INC DI LOOP NEXT 6.下列指令哪些是错误的?并简述之。 1)MOV 15,BX 2)CMP OP1,OP2(假定OP1,OP2是用DB定义的变量) 3)CMP AX,OP1 4)CMP OP1,25H 5)MOV DS,CS 7.下列程序段执行后,BX的值是什么? MOV CL,3 MOV BX,0B8H ROL BX,1 ROR BX,CL 8.编写一个程序段,将内存200H单元开始的256个单元的内容,取绝对值后传送到400H开始的256个单元中。 9.求出下列各数与62A0H之和,并根据结果确定SF,ZF,CF,OF的值。 1)1234H 2)4321H 3)CFA0H 4)9D60H 10.求出下列各数与4AE0H之差,并根据结果确定SF,ZF,CF,OF的值。 1)1234H 2)5D80H 3)9090H 4)EA04H

嵌入式简单汇编程序实例

ARM实验报告 姓名:郭健傧学号:L2101898 1.实验目的 (1)了解ADS1.2集成开发环境及ARMulator软件仿真; (2)熟悉ARM的乘法指令和逻辑指令; (3)结合ARM处理器硬件特性,比较处理函数的特性; 2.实验设备 硬件:pc机一台; 软件:Windowsxp系统,ADS1.2集成开发环境; 3.实验内容 (1)建立一个新的工程; (2)建立一个汇编文件,并添加到工程; (3)根据所给的两个C语言函数编写相应的汇编程序,并比较一下代码中fact1和fact2两个函数的特性; 4.实验步骤 (1)启动ADS1.2IDE集成开发环境,使用ARM Executable Image 工程模块建立一个工程heiye。 (2)建立汇编源文件test.s,编写程序实验,并添加到工程heiye中。 (3)设置工程连接地址Ro Base为0x40000000,RWBase为0x40003000。设置调试入口地址Image entry point为0x40000000。 (4)编译链接工程,并启动AXD进行软件仿真调试。 5.编写程序如下: C程序源代码: int fact1(int limit) { int fact=1; for(i=1;i

51单片机汇编程序范例

16位二进制数转换成BCD码的的快速算法-51单片机2010-02-18 00:43在做而论道上篇博文中,回答了一个16位二进制数转换成BCD码的问题,给出了一个网上广泛流传的经典转换程序。 程序可见: http: 32.html中的HEX2BCD子程序。 .说它经典,不仅是因为它已经流传已久,重要的是它的编程思路十分清晰,十分易于延伸推广。做而论道曾经利用它的思路,很容易的编写出了48位二进制数变换成16位BCD码的程序。 但是这个程序有个明显的缺点,就是执行时间太长,转换16位二进制数,就必须循环16遍,转换48位二进制数,就必须循环48遍。 上述的HEX2BCD子程序,虽然长度仅仅为26字节,执行时间却要用331个机器周期。.单片机系统多半是用于各种类型的控制场合,很多时候都是需要“争分夺秒”的,在低功耗系统设计中,也必须考虑因为运算时间长而增加系统耗电量的问题。 为了提高整机运行的速度,在多年前,做而论道就另外编写了一个转换程序,程序的长度为81字节,执行时间是81个机器周期,(这两个数字怎么这么巧!)执行时间仅仅是经典程序的!.近来,在网上发现了一个链接: ,也对这个经典转换程序进行了改进,话是说了不少,只是没有实质性的东西。这篇文章提到的程序,一直也没有找到,也难辩真假。 这篇文章好像是选自某个著名杂志,但是在术语的使用上,有着明显的漏洞,不像是专业人员的手笔。比如说文中提到的:

“使用51条指令代码,但执行这段程序却要耗费312个指令周期”,就是败笔。51条指令代码,真不知道说的是什么,指令周期是因各种机型和指令而异的,也不能表示确切的时间。 .下面说说做而论道的编程思路。;----------------------------------------------------------------------- ;已知16位二进制整数n以b15~b0表示,取值范围为0~65535。 ;那么可以写成: ; n = [b15 ~ b0] ;把16位数分解成高8位、低8位来写,也是常见的形式: ; n = [b15~b8] * 256 + [b7~b0] ;那么,写成下列形式,也就可以理解了: ; n = [b15~b12] * 4096 + [b11~b0] ;式中高4位[b15~b12]取值范围为0~15,代表了4096的个数; ;上式可以变形为: ; n = [b15~b12] * 4000 + {[b15~b12] * (100 - 4) + [b11~b0]} ;用x代表[b15~b12],有: ; n =x * 4000 + {x * (100 - 4) + [b11~b0]} ;即: ; n =4*x (千位) + x (百位) + [b11~b0] - 4*x ;写到这里,就可以看出一点BCD码变换的意思来了。 ;;上式中后面的位:

24个汇编实例小程序

24个汇编小程序 题目列表: 逆序输出字符串“BASED ADDRESSING” 从键盘上输入两个数,分别放到x,y单元,求出它们的和 试编写一段程序,要求在长度为10h的数组中,找出大于42h的无符号数的个数并存入地址为up开始区域,找出小于42h的无符号数的个数并存入地址为down的开始区域 键盘输入一段字符串,其中小写字母以大写字母输出,其他字符不变输出 从键盘上就收一个小写字母,找出它的前导字符和后续字符,在顺序显示这三个字符 把一个包含20个数据的数组M分成两组:正整数组P和负整数组N,分别把这两个数组中的数据的个数显示出来 求出首地址为data的100个字数组中的最小偶数,并把它放在ax中 输入两船字符串string1和string2,并比较两个字符串是否相等,相等就显示“match”,否则显示“no match” 从键盘接收一个四位的十六进制数,并在终端显示与它等值的二进制数 从键盘输入一系列以$为结束符的字符串,然后对其中的非数字字符计数,并显示计数结果 有一个首地址为mem的100个字的数组,试编程序删除数组中所有为零的项,并将后续项向前压缩,最后将数组的剩余部分补上零 从键盘上输入一串字符(用回车键结束,使用10号功能调用)放在string中,是编制一个程序测试字符串中是否存在数字。如有,则把cl的第五位置1,否则将该位置置0 在首地址为data的字数组中,存放了100h的16位字数据,试编写一个程序,求出平均值放在ax寄存器中,并求出数组中有多少个数小于此平均值,将结果放在bx寄存器中(f分别考虑有符号数、无符号数情况) 一直数组A包含15个互不相等的整数,数组B包含20个互不相等的整数。试编制一个程序,把既在A中又在B中出现的整数存放于数组C中 设在A、B和D单元中分别存放着三个数。若三个数都不是0,则求出三个数的和并存放在S单元,若其中有一个数为0,则把其它两个单元也清零。请编写此程序

51汇编程序练习题1

单片机汇编程序设计练习 一、存储器之间的数据传送 1、编程实现将单片机内部RAM60H开始的连续32个单元置为FFH。 2、编程实现将内部RAM30H开始的连续16个数传送到内部RAM50H开始的连续单元中。 3、编程实现将单片机外部RAM2000H为首地址的数据块传送到单片机内部RAM30H开始的单元中,数据块的长度为32个字节。 4、编程实现将单片机内部RAM30H为首地址的数据块传送到外部RAM2000H 开始的单元中,数据块的长度存放于内部RAM的20H单元。 5、编程实现将单片机外部RAM2000H为首地址的数据块传送到单片机内部RAM30H开始的单元中,直到数据内容为0DH时停止传送。 6、编程实现将ROM1000H地址的内容传送到内部RAM的25H单元。 7、编程实现将ROM2000H开始的连续10个地址的内容传送到内部RAM的25H 开始的单元。 8、编程实现将ROM1000H开始的连续100个地址的内容传送到外部RAM2000H 开始的连续单元中。 二、查表程序设计 1、编写查表程序,要查表的数据存放在R7中,其范围为0~9。编程查其平方值,并存放于40H。 2、编写查表程序,要查表的数据存放在R7中,其范围为0~9。编程查其立方值,并存放于R6。 3、单片机外部ROM TAB1地址开始存放一组ASCII码表,试用查表方法,将R2的内容(范围为0~F)转换为与其对应 的ASCII码,并从P1口输出。 4、使用8051的P1口作为段控驱动共阳 LED数码管,硬件连接如图。 编程实现将8051 R7单元内容(在 00H-09H之间)显示在数码管上。00H-09H 的共阳字形代码如下表所示。 04H 05H 06H 07H 08H 09H

汇编语言程序例题0001

【例】试编写一程序计算以下表达式的值。 w = (v- (x * y + z -540 )) /x 式中x、y、z、v均为有符号字数据。 设x、y、z、v的值存放在字变量X、Y、Z、V中,结果存放在双字变量W之中,程序的流程图如图所示。 DATA SEGMENT X DW 200 Y DW 100 Z DW 3000 V DW 10000 W DW 2 DUP (?) DATA ENDS STACK SEGMENT STACK DB 200 DUP (0) STACK ENDS CODESEGMENT ASSUME DS DATA CS: CODE SS: STACK START MOV AX DATA MOV DS AX ; DATA>AX MOV AX X IMUL Y ; (X) * (DX AX MOV CX AX

MOV BX,DX ;(DX AX) T BX : CX ) MOV AX,Z CWD ; (Z)符号扩展 ADD CX,AX ADC BX,DX ; ( BX: CX)+( DX:AX)BX: CX) SUB CX,540 SBB BX,0 ;( BX:CX) - 5 40~BX : CX) MOV AX,V CWD ; (V)符号扩展 SUB AX,CX SBB DX, BX ;( DX: AX)-((BX CX DX: AX) IDIV X ;( DX:AX)/X MOV W,AX ;商5 MOV W+2 DX ;余数D?W+2 MOV AH,4CH INT 21H CODEENDS ;退出DOS 状态 END START 【例】已知某班学生的英语成绩按学号(从 1 开始)从小到大的顺序排列在要查的学 生的学号放在变量NO中,查表结果放在变量ENGLISH中。编写程序如下: STACK SEGMENT STACK DB 200 DUP(0) STACK ENDS DATA SEGMENT TAB DB 80 ,85,86,71,79,96 DB 83 ,56,32,66,78,84 NO DB 10 ENGLIST DB ? DATA ENDS CODE SEGMENT ASSUME DS: DATA,SS: STACK,CS: CODE BEGIN: MOV AX,DATA MOV DS,AX LEA BX,TAB MOV AL,NO DEL AL XLAT TAB MOV ENGLIS,H AL MOV AH,4CH INT 21H CODEENDS TAB表中,

8086汇编经典例程

========================================== 5.编写一个数组排序(从小到大)的小程序,数组在程序中定义,程序先将原数组显示一遍,然后排序,再将排好序的数组显示一遍。 ========================================== AAA SEGMENT BUF DB '45$' L = $ - BUF ary dw -897,345,6789,8654,-1234, -3456,-99,-678,987,567, 32762,-12121,0,3434,4645,-234, 23455,-100,100,1000,-1000 dw 572,-2345,-6543,-1234,9999 | len dw ($-ary)/2 ASSUME CS:AAA, DS:AAA MAIN PROC FAR PUSH CS POP DS LEA SI,ARY MOV CX,LEN NEXT3: MOV BX,[SI] CALL DISP CALL SPACE - ADD SI,2 LOOP NEXT3 CALL CRLF CALL CRLF LEA SI,ARY MOV CX,LEN CALL SORT LEA SI,ARY MOV CX,LEN NEXT5: MOV BX,[SI] CALL DISP … CALL SPACE ADD SI,2 LOOP NEXT5 MOV AH,4CH INT 21H MAIN ENDP DISP PROC PUSH SI PUSH AX PUSH BX ! PUSH DX PUSH CX MOV CX,0 CMP BX,0 JNL NEXT1 NEG BX MOV CX,1 NEXT1: LEA SI,BUF+l-1 MOV AX,BX MOV BX,10 NEXT: MOV DX,0 } DIV BX ADD DL,30H DEC SI MOV [SI],DL CMP AX,0 JNE NEXT CMP CX,0 JE NEXT2 DEC SI MOV BYTE PTR [SI],'-' NEXT2: MOV DX,SI ! MOV AH,9 INT 21H POP CX POP DX POP BX POP AX POP SI RET DISP ENDP SORT PROC ( NEXTT: PUSH CX MOV DI,SI MOV AX,[SI] NEXT0: CMP AX,[DI] JL NEXTQ MOV BX,AX MOV AX,[DI] MOV [DI],BX NEXTQ: ADD DI,2 LOOP NEXT0 MOV [SI],AX … ADD SI,2 POP CX LOOP NEXTT RET SORT ENDP CRLF PROC PUSH AX PUSH DX MOV DL,13

汇编语言程序设计练习题

汇编语言程序设计练习题 阅读程序并完成填空: 1.1.MOV BL,85H MOV AL,17H ADD AL,BL AL=?,BL=?,CF=? 2.2.MOV AX,BX NOT AX ADD AX,BX INC AX AX=?,CF=? 3.3.MOV AX,0FF60H STC MOV DX,96 XOR DH,0FFH SBB AX,DX AX=?,CF=? 4.4.MOV BX,0FFFEH MOV CL,2 SAR BX,CL 5.5.MOV BX,0FFH AND BX,0FFFH OR BX,0F0FH XOR BX,00FFH 上述程序段运行后,BX=?,CF=? 6.6.CMP AX,BX JGE NEXT XCHG AX,BX NEXT:CMP AX,CX JGE DONE XCHG AX,CX DONE:。。。。。 试回答: (1)(1)上述程序段执行后,原有AX、BX、CX中最大数存放在哪个寄存器中? (2)(2)这3个数是带符号数还是无符号数?

7.7.在数据段ADDR1地址处有200个字节,要传送到数据段ADDR2处。 MOV AX,SEG ADDR1 MOV DS,AX MOV ES,------- MOV SI,------- MOV DI,OFFSET ADDR2 MOV-----,200 CLD REP--------- 8.8.ADDR1开始的单元中连续存放两个双字数据,将其求和存放在ADDR2开始的单元。 MOV CX,2 XOR BX,BX CLC NEXT:MOV AX,[ADDR1+BX] ADC AX,------- MOV[ADDR2+BX],AX ADD--------,2 ---------NEXT 9.9.设初值AX=1234H,BX=5678H,DX=0ABCDH,则执行下面一段程序后AX=------,BX=----,DX=--------。 MOV CL,4 SHL DX,CL MOV BL,AH SHL AX,CL SHR BL,CL OR DL,BL 10.10.设有一个首地址为ARRAY有N个字数据的数组,要求求出该数组之和,并把结果存入TOTAL地址中,有关程序如下:MOV CX,------ MOV AX,0 MOV SI,0 START:ADD AX,-----

汇编语言例子

实验三: 1)题目:在内存中从ARRAY开始的连续三个字节单元存放着30H,40H,50H。编制程序将这三个连续的数据传送到内存TABLE开始的单元。 DATA SEGMENT ARRAY DB 30H,40H,50H 定义数据段 TABLE DB 3 DUP (?) DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV ES,AX LEA SI,ARRAY LEA DI,TABLE MOV CX,3 REP MOVSB JMP $ CODE ENDS END START (2)题目:把内存2000H和3000H字单元的内容相加,结果存入4000H单元。(不考虑溢出) DATA SEGMENT ORG 2000H DW 1234H ORG 3000H DW 5678H ORG 4000H DW ? DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV AX,[2000H] ADD AX,[3000H] MOV [4000H],AX JMP $ CODE ENDS END START 实验四 1、数据传送指令和算术运算指令完成NUM1和NUM2相加,结果放入SUM中。

DATA SEGMENT NUM1 DW 0012H,0030H,0FC21H ; 数1 NUM2 DW 3E81H,44E9H,6D70H ; 数2 SUM D W 3 DUP(?) ; 结果单元 DATA ENDS CODE SEGMENT ASSUME CS: CODE, DS: DATA START: MOV AX, DATA MOV DS, AX MOV CX,3 LEA SI,NUM1 LEA DI,NUM2 LEA AX,SUM HE: MOV BX,[SI] ADD BX,[DI] MOV [AX],BX INC SI INC DI INC AX LOOP HE MOV AH, 4CH ; 返回DOS INT 21H CODE ENDS END START 2、内存中自TABLE开始的七个单元连续存放着自然数0至6的立方值(称作立方表)。;任给一数X(0≤X≤6)在XX单元,查表求X的立方值,并把结果存入YY单元中。;提示用XLAT指令 DATA SEGMENT TABLE DB 0H,1H,2H,3H,4H,5H,6H XX DB 1 DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX LEA BX,TABLE MOV AL,[XX] XLAT MOV DL,AL MOV AH,02H INT 21H JMP $

汇编语言小程序

16进制转化为10进制STACK SEGMENT STACK'STACK' DW100H DUP(?) TOP LABEL WORD STACK ENDS DATA SEGMENT KEYBUFFER DB100 ;DB ? ;DB 100 DUP(?) DECIMAL DB 5 DUP(?) STRING1 DB'PLEASE INPUT DECIMAL DATA:$' DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA,CS:STACK START: MOV AX,DATA MOV DS,AX MOV ES,AX MOV SS,AX LEA SP,TOP LEA DX,STRING1 MOV AH,09H INT 21H MOV AH,0AH LEA DX,KEYBUFFER ;MOV AX,23456 INT 21H ;LEA SI,KEYBUFFER MOV AX,DX LEA DI,DECIMAL CALL DISPAX MOV AH,4CH MOV AL,0 INT 21H DISPAX PROC NEAR PUSH AX PUSH BX PUSH CX PUSH DX PUSH DI LEA DI,DECIMAL

CALL TRANS16TO10 MOV CX,5 LEA DI,DECIMAL+4 MOV AH,2 DISPAXD: MOV DL,[DI] ADD DL,30H DEC DI INT 21H LOOP DISPAXD POP DI POP DX POP CX POP BX POP AX RET DISPAX ENDP TRANS16TO10 PROC NEAR PUSH AX PUSH BX PUSH CX PUSH DX PUSH DI MOV BX,10 MOV CX,5 LOOP1: XOR DX,DX DIV BX MOV[DI],DX INC DI LOOP LOOP1 LEA DX,DECIMAL MOV AH,09H INT 21H POP DI POP DX POP CX POP BX POP AX RET TRANS16TO10 ENDP

第四章MCS-51汇编语言程序设计

第四章MCS-51汇编语言程序设计 重点及难点: 单片机汇编语言程序设计的基本概念、伪指令、单片机汇编语言程序的三种基本结构形式、常用汇编语言程序设计。 教学基本要求: 1、掌握汇编语言程序设计的基本概念; 2、掌握伪指令的格式、功能和使用方法; 3、掌握顺序结构、分支结构和循环结构程序设计的步骤和方法; 4、掌握常用汇编语言程序设计步骤和方法。 教学内容 §4.1汇编语言程序设计概述 一、汇编语言的特点 (1)助记符指令和机器指令一一对应,所以用汇编语言编写的程序效率高,占用存储空间小,运行速度快,因此汇编语言能编写出最优化的程序。 (2)使用汇编语言编程比使用高级语言困难,因为汇编语言是面向计算机的,汇编语言的程序设计人员必须对计算机硬件有相当深入的了解。 (3)汇编语言能直接访问存储器及接口电路,也能处理中断,因此汇编语言程序能够直接管理和控制硬件设备。 (4)汇编语言缺乏通用性,程序不易移植,各种计算机都有自己的汇编语言,不同计算机的汇编语言之间不能通用;但是掌握了一种计算机系统的汇编语言后,学习其他的汇编语言就不太困难了。 二、汇编语言的语句格式 [<标号>]:<操作码> [<操作数>];[<注释>] 三、汇编语言程序设计的步骤与特点 (1)建立数学模型 (2)确定算法 (3)制定程序流程图 (4)确定数据结构 (5)写出源程序 (6)上机调试程序 §4.2伪指令 伪指令是程序员发给汇编程序的命令,也称为汇编命令或汇编程序控制指令。 MCS- 51常见汇编语言程序中常用的伪指令:

第四章MCS-51汇编语言程序设计91 1.ORG (ORiGin)汇编起始地址命令 [<标号:>] ORG <地址> 2.END (END of assembly)汇编终止命令 [<标号:>] END [<表达式>] 3.EQU (EQUate)赋值命令 <字符名称> EQU <赋值项> 4.DB (Define Byte)定义字节命令 [<标号:>] DB <8位数表> 5.DW (Define Word)定义数据字命令 [<标号:>] DW <16位数表> 6.DS (Define Stonage )定义存储区命令 [<标号:>] DW <16位数表> 7.BIT位定义命令 <字符名称> BIT <位地址> 8.DA TA数据地址赋值命令 <字符名称> DATA <表达式> §4.3单片机汇编语言程序的基本结构形式 一、顺序程序 [例4-1]三字节无符号数相加,其中被加数在内部RAM的50H、51H和52H单元中;加数在内部RAM的53H、5414和55H单元中;要求把相加之和存放在50H、51H和52H单元中,进位存放在位寻址区的00H位中。 MOV R0 ,# 52H ;被加数的低字节地址 MOV R1 ,# 55H ;加数的低字节地址 MOV A ,@ R0 ADD A ,@ R1 ;低字节相加 MOV @ R0 , A ;存低字节相加结果 DEC R0 DEC R1 MOV A ,@ R0 ADDC A ,@ R1 ;中间字节带进位相加 MOV @ R0 , A ;存中间字节相加结果 DEC R0 DEC R1 MOV A ,@ R0 ADDC A ,@ R1 ;高字节带进位相加 MOV @ R0 , A ;存高字节相加结果 CLR A

汇编语言程序例题

【例】试编写一程序计算以下表达式的值。 w=(v-(x*y+z-540))/x 式中x、y、z、v均为有符号字数据。 设x、y、z、v的值存放在字变量X、Y、Z、V中,结果存放在双字变量W之中,程序的流程图如图所示。 DATA SEGMENT X DW 200 Y DW 100 Z DW 3000 V DW 10000 W DW 2 DUP() DATA ENDS STACK SEGMENT STACK DB 200 DUP(0) STACK ENDS CODE SEGMENT ASSUME DS:DATA,CS:CODE,SS:STACK START:MOV AX,DATA MOV DS,AX ;DATA→AX MOV AX,X IMUL Y ;(X)*(Y)→DX:AX MOV CX,AX

MOV BX,DX ;(DX:AX)→(BX:CX) MOV AX,Z CWD ;(Z)符号扩展 ADD CX,AX ADC BX,DX ;(BX:CX)+(DX:AX)→(BX:CX) SUB CX,540 SBB BX,0 ;(BX:CX)-540→(BX:CX) MOV AX,V CWD ;(V)符号扩展 SUB AX,CX SBB DX,BX ;(DX:AX)-(BX:CX)→(DX:AX) IDIV X ;(DX:AX)/X MOV W,AX ;商→W MOV W+2,DX ;余数DX→W+2 MOV AH,4CH INT 21H CODE ENDS ;退出DOS 状态 END START 【例】已知某班学生的英语成绩按学号(从1开始)从小到大的顺序排列在TAB表中,要查的学生的学号放在变量NO中,查表结果放在变量ENGLISH中。编写程序如下:STACK SEGMENT STACK DB 200 DUP(0) STACK ENDS DATA SEGMENT TAB DB 80,85,86,71,79,96 DB 83,56,32,66,78,84 NO DB 10 ENGLIST DB DATA ENDS CODE SEGMENT ASSUME DS:DATA,SS:STACK,CS:CODE BEGIN:MOV AX,DATA MOV DS ,AX LEA BX,TAB MOV AL,NO DEL AL XLAT T AB MOV ENGLISH,AL MOV AH,4CH INT 21H CODE ENDS END BEGIN

汇编小程序

---------程序sy3-1:实现从键盘输入一位数字,判断其奇偶性。并在屏幕上输出一个标志,若为奇数,则输出1;否则输出0。 ---------如果输入的不是数字,则显示字符串“ERROR”。 DATAS SEGMENT STRING DB "ERROR$" ;定义字符串 FLAG DB ? ;设置奇偶标志 DATAS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS START: MOV AX,DATAS MOV DS,AX MOV FLAG,'1' ;给标志位FLAG赋初值 MOV AH,01H INT 21H ;接收键盘输入一位数 CMP AL,30H JB ERR CMP AL,39H JA ERR TEST AL,01H ;测试,根据最后一位判断奇偶性 JNZ OUTPUT ;不为0则为奇数 MOV FLAG,'0' OUTPUT: MOV DL,FLAG MOV AH,02H INT 21H ;输出标志位 JMP EXIT ERR: ;显示字符串 MOV DX,OFFSET STRING MOV AH,9 INT 21H EXIT: MOV AH,4CH INT 21H CODES ENDS END START

;---------程序sy3-2:根据用户输入的星期几数字代号(0代表星期天),在屏幕上显示相应的英文缩写名。 DATAS SEGMENT s0 db "Sun$" S1 DB "Mon$" S2 DB "Tue$" S3 DB "Wed$" S4 DB "Thu$" S5 DB "Fri$" S6 DB "Sat$" ADDR_TABLE DW S0,S1,S2,S3,S4,S5,S6 ;定义地址表 DATAS ENDS STACKS SEGMENT ;此处输入堆栈段代码 STACKS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACKS START: MOV AX,DATAS MOV DS,AX MOV AH,1 INT 21H ;接受键盘输入 CMP AL,30H JB EXIT CMP AL,36H ;不是数字0~6,则退出程序 JA EXIT SUB AL,30H ;转变为数字 MOV BL,2 MUL BL ;数字乘以2的结果是在地址表中的相应位置的偏移值MOV BX,AX ;将输入的数字转换为地址表中的偏移地址 MOV DX,ADDR_TABLE[BX] ;取地址表中的相应内容(即DX为字符串的偏移地址)MOV AH,9 INT 21H ;显示字符串 EXIT: MOV AH,4CH INT 21H CODES ENDS END START

汇编语言典型例题

典型例题(与考试题型,考试范围相近) 1.应用程序具有3个基本段,可执行指令应该保存于( A )。 A) 代码段B) 数据段C) 堆栈段D) 附加段 2. 8位补码F3H要扩展成16位补码应该是( D ),这样其真值才不变。 A) F0F3H B) 00F3H C) 10F3H D) FFF3H 3. “mov [ebx+8],eax”指令的目的操作数采用( C )寻址方式。 A) 存储器间接B) 寄存器C) 寄存器相对D) 立即数 4. 执行“sar ebx,1”指令后,ebx最高D31位一定等于( D ) A) 0 B) 1 C) D0位D) D30位 5. 在代码段内的-128~127个字节前后范围的跳转,可以用( C )类型名表示。 A) WORD B) DWORD C) SHORT D) FAR 6. 在Windows控制台环境,在当前光标显示信息应该使用( B )函数(功能)。 A) ReadConsole B) WriteConsole C) MessageBox D) GetStdHandle 7.汇编语言源程序经汇编后不能直接生成( C ) A) OBJ文件B) LST文件C) EXE文件D) CRF文件 8.在ADD指令中,两个操作数的物理位置不可以安排在( A )中。 A) 两个主存储单元 B) 一个主存储单元和一个数据寄存器 C) 两个数据寄存器 D) 一个堆栈单元和一个数据寄存器 9.假定ax=6987h,执行指令cmp ax,0eb30h后,则标志位CF和OF的状态( C )。 A)0,0 B) 0,1 C) 1,0 D) 1,1 10.假定esp=00120100h,eax=1f6c2107h,执行指令push ax后,存放数据07h的物理地址是( C )。 A) 00120104h B) 00120101h C) 001200fch D) 001200ffh 11.下列对标志寄存器中标志位产生影响的指令是( B ) A) jmp done B) shl eax, 2 C) call subp D) not eax 12. 假设CL=98H, 执行“MOVSX DX, CL”后,DX=( D ) A) F098H B) 0098H C) 1098H D) FF98H 13. “mov 80h[esi], eax”指令的目的操作数采用( C )寻址方式。

汇编经典小程序

实验一:判断一个数X的正,负数,还是零。(假设是正数,输出+,是负数,输出-,是零,输出This is a zore !) DATA SEGMENT X DB 10 CR EQU 0DH LF EQU 0AH W DB 'This is a zore!',CR,LF,'$' ZHENG DB '+',CR,LF,'$' FU DB '-',CR,LF,'$' DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX MOV AL,X AND AL,AL JZ L1 SHL AL,1 JC L3 JMP L2 L1: MOV DX,OFFSET W MOV AH,9 INT 21H JMP L4 L2: MOV DX,OFFSET ZHENG MOV AH,9 INT 21H JMP L4 L3: MOV DX,OFFSET FU MOV AH,9 INT 21H JMP L4 L4: MOV AH,4CH INT 21H CODE ENDS END START 实验二:求十个数中的最小数,并以十进制输出。(若要求最大的,只要把JC 改为JNC 即可)(仅局限于0---16间的数比较,因为ADD AL,30H只是针对一位的十六进制转换十进制的算法) DATA SEGMENT XDAT DB 0AH,1FH,02H,03H,04H,05H,06H,07H,08H,09H MIN DB ? CR EQU 0DH

W DB ' is min',CR,LF,'$' DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX MOV CX,9 MOV SI,OFFSET XDAT MOV AL,[SI] L2: CMP AL,[SI+1] JC L1 MOV AL,[SI+1] L1: INC SI LOOP L2 ADD AL,30H MOV DL,AL MOV AH,2 INT 21H MOV DX,OFFSET W MOV AH,9 INT 21H CODE ENDS END START 实验三:设有3个单字节无符号数存放在BUF开始的缓冲区中,编写一个能将它们从大到小从新排列的程序。 DATA SEGMENT BUF DB 87,234,123 DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX MOV SI,OFFSET BUF MOV AL,[SI] ;把3个数取到寄存器中 MOV BL,[SI+1] MOV CL,[SI+2] CMP AL,BL ;排序,将最大数送AL寄存器 JAE NEXT1 XCHG AL,BL NEXT1:CMP AL,CL JAE NEXT2 XCHG AL,CL NEXT2:CMP BL,CL ;将最小输送CL寄存器

相关主题
文本预览
相关文档 最新文档