您的位置:程序门 -> 其他开发语言 -> 汇编语言



100求汇编程序 急急急急


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


100求汇编程序 急急急急[已结贴,结贴人:henfeng]
发表于:2007-05-10 09:05:06 楼主
急求汇编程序     要求能实现输入,查找,统计,输出
如:输入一个字符串   查找有没有a(或60)要是有的话统计一共有几个a(或60)然后把结果输出     二进制的数转换成十六进制(或十进制)以ascii码输出


还有   数据传递问题      
如   a   db   (..........)
      b   db     ..........
                  ..........
合并后再传递给c     然后输出
发表于:2007-05-10 09:06:331楼 得分:0
大家多帮帮忙吧     先谢谢了       真的很急啊
发表于:2007-05-10 09:07:082楼 得分:0
汇编还给老师了
呵呵
帮顶
发表于:2007-05-10 09:10:363楼 得分:0
汇编还给老师了
发表于:2007-05-10 09:10:564楼 得分:0
up~~~
发表于:2007-05-10 09:20:455楼 得分:0
问个更菜的问题我的贴是不是发错地方了     大家是不是   不是玩这个的啊
发表于:2007-05-10 09:22:506楼 得分:0
发错地方了``````
发表于:2007-05-10 09:23:087楼 得分:0
应该发到技术区去``````
发表于:2007-05-10 09:24:348楼 得分:0
汇编?这里有人搞汇编?
呵呵。
发表于:2007-05-10 09:26:239楼 得分:0
不好意思有点晕
发表于:2007-05-10 09:40:3610楼 得分:0
樓主,你加一條“二进制的数转换成十六进制(或十进制)以ascii码输出”是什么意思?
統計個數(包括任何數據)在內存中本來就是以十六進制存放的啊!
发表于:2007-05-10 09:50:3511楼 得分:0
start:
mov   ah,01h   ;
int   21h   ;
cmp   al, 'a '   ;
je   count   ;
jmp   start;
  ...

count:
    inc   bl;
  ...

好久没写,全忘了,唉~~~~~~~~~~~
发表于:2007-05-10 12:29:5312楼 得分:0
“进制的数转换成十六进制(或十进制)以ascii码输出”意思是
输入一个字符串(是二进制的籽)   然后把二进制的数转换成十六进制(或十进制)以ascii码输出     能满足两位数的这样输出就行

发表于:2007-05-10 13:37:2713楼 得分:0
看來,樓主是有三道題啊!!
這三題都是非常普通的題啊。。。
自己有沒有寫代碼???
发表于:2007-05-10 13:42:4214楼 得分:0
哎     不好意思啊     我是写不出来啊     我是被逼到这了       本人不学这些东西的
真是没办法了
发表于:2007-05-10 13:44:3715楼 得分:0
能帮我搞定我立刻给分       帮帮忙啊     真的是好急啊
发表于:2007-05-10 16:42:1216楼 得分:0
给你个思路:
先设一键盘缓冲区,接收输入.然后设一寄存器为计数器,调用21h功能获得输入内容,用 'a '的值,即41h,与之逐一比较,相同则计数器加一.直到结束.
我现在没空写.哈哈,祝你成功.
发表于:2007-05-11 21:17:0317楼 得分:0
第一题:
-----------------
data   segment
msg   db   'please   input   a   string: ', '$ '
buff   db   80,0,80   dup(?)
cnta   db   0
data   ends

code   segment
assume   cs:code,ds:data
main: mov   ax,data
mov   ds,ax

lea   dx,msg
mov   ah,9   ;显示字符串
int   21h

lea   dx,buff
mov   ah,0ah   ;等待输入一个字符串,以回车结束
int   21h

mov   dl,10
mov   ah,2
int   21h
mov   dl,13
mov   ah,2
int   21h   ;10,13表示换行

mov   bx,offset   buff+2
s: mov   al,[bx]
cmp   al, 'a '
jnz   _13   ;不等于字符a则判断是不是结束符(回车键的ascii码)
inc   cnta
jmp   next
_13: cmp   al,13
jz   exit
next: inc   bx
jmp   s

exit: xor   ah,ah
mov   al,cnta
mov   cl,10
div   cl
add   ax,3030h
mov   bx,ax   ;转移至bx中,以免ax的值在调用中断时被改变

cmp   al, '0 '
jz   disp1   ;如果计数器的十位数为0则不显示
mov   dl,bl
mov   ah,2
int   21h
disp1: mov   dl,bh
mov   ah,2
int   21h

mov   ah,4ch
int   21h
code   ends
end   main


第二题:
==============
data   segment
                buff   db   9,?,9   dup(?)
                errmsg   db   10,13, 'input   error!$ '
data   ends

code   segment
                assume   cs:code,ds:data
main:       mov   ax,data
                mov   ds,ax
               
                lea   dx,buff
                mov   ah,0ah
                int   21h
               
                mov   dl,10
                mov   ah,2
                int   21h
                mov   dl,13
                mov   ah,2
                int   21h

                mov   bx,offset   buff+2
                cmp   byte   ptr[bx+1],13
                je   one   ;输入的二进数只有一位时的处理情况
s1:           mov   cl,[bx]
                cmp   cl, '0 '
                jz   next
                cmp   cl, '1 '
                jz   next
                cmp   cl,13
                jz   _13   ;如果是回车符,则跳至标号_13处
                jmp   error
next:       sub   cl,30h
                mov   [bx],cl
                inc   bx
                jmp   s1
error:     lea   dx,errmsg
                mov   ah,9
                int   21h
                jmp   short   bye
               
_13:         mov   bx,offset   buff+2
                push   bx
                xor   ch,ch
                mov   cl,[bx-1]   ;确定输入的有效字符的个数
                push   cx
                s3:           push   cx
                                dec   cx
                                shl   byte   ptr   [bx],cl
                                pop   cx
                                inc   bx
                loop   s3
                ;循环s3的作用在于对每个有效字符移位操作。比如输入的二进数为5位数(11111b),
                ;则第一位向左移4位,第二位向左移3位,第三位向左移2位,依此类推


                pop   cx
                pop   bx
                mov   dl,[bx]
                dec   cx
s4:           inc   bx
                add   dl,[bx]
                loop   s4
                ;循环s4的作用就是将移位后的各个数相加,得到实际的[非可显示的]16进数

                mov   dh,dl
                mov   cl,4
                shr   dh,cl
                and   dl,00001111b
                xchg   dh,dl
                add   dx,3030h
                cmp   dh, '9 '  
                jg   h37dh   ;大于9则再加7h
                jmp   short   dl7h
h37dh:     add   dh,7h
dl7h:       cmp   dl, '9 '
                jg   h37dl
                jmp   short   quit
h37dl:     add   dl,7h
                ;使16进数成为能显示在屏幕上的相对应的字符
                ;以上出现的标号中的 'l '都是小写字母
               

quit:       cmp   dl, '0 '
                je   no0   ;如果16进数的高位为0则不显示
                mov   ah,2h
                int   21h
no0:         mov   dl,dh
                mov   ah,2h
                int   21h
                jmp   short   disph   ;输入的二进数不止一位时直接跳到disph
one:         mov   dl,[bx]
                mov   ah,2h
                int   21h
disph:     mov   dl, 'h '   ;显示十六进数后的标识
                mov   ah,2h
                int   21h
               
bye:         mov   ah,4ch
                int   21h
code   ends
end   main
发表于:2007-05-11 23:37:0118楼 得分:0
第三题:
-------------------
data   segment
                a   db   128,20,30,40,50,60,70,80,255
                b   db   130,30,70,50,10,40,10,60,245
                c   dw   ($-b)   dup(?)
                ;防止a、b数组相对应的数据元素相加后结果溢出
                ;所以将c定义成字型数组[($-b)表示数组b的长度]
data   ends

stack   segment
                dw   8   dup(0)
stack   ends

code   segment
                assume   cs:code,ds:data
main:       mov   ax,data
                mov   ds,ax
                mov   ax,stack
                mov   ss,ax
                mov   sp,0h


               
                xor   bx,bx
                xor   di,di
                mov   cx,offset   b-offset   a   ;取得数组a或b的数据个数

s1:           xor   ah,ah
                mov   al,a[bx]
                add   al,b[bx]
                adc   ah,ah
                mov   c[di],ax
                inc   bx
                add   di,2
loop   s1   ;循环求和
               
                xor   di,di
                mov   bl,10
                mov   cx,offset   b-offset   a
s2:           mov   ax,c[di]
                call   dtoc  
                add   di,2
                cmp   cx,1   ;显示完最后一个数据后不再显示分隔符号
                je   bye
                call   dispchar
loop   s2

bye:         mov   ah,4ch
                int   21h

dispchar   proc   near   ;显示分隔符号
                push   ax
                push   dx
                mov   dl, ', '
                mov   ah,2
                int   21h
                pop   dx
                pop   ax
                ret
dispchar   endp

dtoc   proc   near   ;使word型数据转变为表示十进数的字符串
                push   ax
                push   bx
                push   dx
                push   cx
                ;保护现场
                xor   cx,cx     ;计数器清零
next:       div   bl
                xor   dh,dh
                mov   dl,ah
                add   dl,30h   ;使数字成为可显字符
                push   dx
                inc   cx
                cmp   al,0
                je   exit   ;当商为零时开始出栈
                xor   ah,ah
                jmp   next

                exit:       pop   dx   ;逐个显示字符
                                mov   ah,2h
                                int   21h
                loop   exit

                pop   cx
                pop   dx
                pop   bx
                pop   ax
                ;恢复现场
                ret
dtoc   endp
               
               
code   ends
end   main
发表于:2007-05-11 23:38:1819楼 得分:100
补充:
第三题中的mov   sp,0h
改为mov   sp,10h
发表于:2007-05-14 17:38:2620楼 得分:0
多谢了     现在一切ok了
发表于:2007-05-19 16:05:2221楼 得分:0
你可以參考一下下面的數組a、b合並的程序:
數組a和數組b各相應元素相加,存放到數組c中的相應單元中。然后將c數組打印!!
-------------------
data   segment
                a   db   128,20,30,40,50,60,70,80,255
                b   db   130,30,70,50,10,40,10,60,245
                c   dw   ($-b)   dup(?)
                ;防止a、b数组相对应的数据元素相加后结果溢出
                ;所以将c定义成字型数组[($-b)表示数组b的长度]
data   ends

stack   segment
                dw   8   dup(0)
stack   ends

code   segment
                assume   cs:code,ds:data
main:       mov   ax,data
                mov   ds,ax
                mov   ax,stack
                mov   ss,ax
                mov   sp,0h


               
                xor   bx,bx
                xor   di,di
                mov   cx,offset   b-offset   a   ;取得数组a或b的数据个数

s1:           xor   ah,ah
                mov   al,a[bx]
                add   al,b[bx]
                adc   ah,ah
                mov   c[di],ax
                inc   bx
                add   di,2
loop   s1   ;循环求和
               
                xor   di,di
                mov   bl,10
                mov   cx,offset   b-offset   a
s2:           mov   ax,c[di]
                call   dtoc  
                add   di,2
                cmp   cx,1   ;显示完最后一个数据后不再显示分隔符号
                je   bye
                call   dispchar
loop   s2

bye:         mov   ah,4ch
                int   21h

dispchar   proc   near   ;显示分隔符号
                push   ax
                push   dx
                mov   dl, ', '
                mov   ah,2
                int   21h
                pop   dx
                pop   ax
                ret
dispchar   endp

dtoc   proc   near   ;使word型数据转变为表示十进数的字符串
                push   ax
                push   bx
                push   dx
                push   cx
                ;保护现场
                xor   cx,cx     ;计数器清零
next:       div   bl
                xor   dh,dh
                mov   dl,ah
                add   dl,30h   ;使数字成为可显字符
                push   dx
                inc   cx
                cmp   al,0
                je   exit   ;当商为零时开始出栈
                xor   ah,ah
                jmp   next

                exit:       pop   dx   ;逐个显示字符
                                mov   ah,2h
                                int   21h
                loop   exit

                pop   cx
                pop   dx
                pop   bx
                pop   ax
                ;恢复现场
                ret
dtoc   endp
               
               
code   ends
end   main


快速检索

最新资讯
热门点击