1道汇编题求解!100分送!!!

xishifengxiaodao 2004-04-27 10:02:42
在存储器中有一个首地址为BUF的长度为N(N小于255)的字符串,要求统计其中数字、大写字母的个数,并将结果依次存入字符串后的2个相邻单元中。
‘0’-----‘9’ ASCII 为30H-----39H
‘A’------‘Z’ ASCII 为41H-------5AH

希望能写的帮我写一下,100送!
也是共同学习,这也是大家进这个网站的目的啊
谢谢了!
...全文
45 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
dananhai 2004-05-02
  • 打赏
  • 举报
回复
我也学习学习
呵呵
delphi023445 2004-05-01
  • 打赏
  • 举报
回复
data segment
buf db '1354ABCD*$@98FG'
result db 3 dup(?)
count equ result-buf
data ends

code segment 'code'
assume ds:data,cs:code
start:
mov ax,data
mov ds,ax
mov ch,count
lea si,buf
xor dx,dx
lp: mov ah,[si]
cmp ah,30h
jl next
cmp ah,39h
jg abc
inc dh
jmp next
abc: cmp ah,41h
jl next
cmp ah,5ah
jg next
inc dl
next: inc si
dec ch
jnz lp
mov result,dh
mov result+1,dl
mov ah,4ch
int 21h
code ends
end start

我修改了一下
xishifengxiaodao 2004-04-30
  • 打赏
  • 举报
回复
谢谢了
dunkel 2004-04-29
  • 打赏
  • 举报
回复
置 buf 起始地址的 mov bx, 0 这样的指令不太合适, 应该是 mov bx, offset buf , 虽然这里最后的结果是一样的, 但不应该形成这样的习惯, 否则一旦到复杂点儿的多模块的程序极易出错. 另外, 如果是用 mov si, offset buf lodsb cmp al, ... 这样的指令组合, 循环使用 mov cx, count loop ... 的话, 程序还能再精练些的
xishifengxiaodao 2004-04-29
  • 打赏
  • 举报
回复
谢谢大家了!
不过本人经过认真思考,也写出了一个,仅供参考!
data segment
buf db '1354ABCD*$@98FG'
result db 3 dup(?)
count equ result-buf
data ends

code segment 'code'
assume ds:data,cs:code
start:
mov ax,data
mov ds,ax
mov ch,count

mov bx,0
mov dx,0
lp: mov ah,buf[bx]
cmp ah,30h
jl next
cmp ah,39h
jg abc
inc dh
jmp next
abc: cmp ah,41h
jl next
cmp ah,5ah
jg next
inc dl
next: inc bx
dec ch
jnz lp
mov result,dh
mov result+1,dl


mov ah,4ch
int 21h
code ends
end start
csdsjkk 2004-04-29
  • 打赏
  • 举报
回复
mov si,offset buf
mov cx,n
mov dx,0
cld
l0:
lodsb
cmp al,'0'
jb l2
cmp al,'9'
ja l1
inc dl
jmp l2
l1:
cmp al,'A'
jb l2
cmp al,'Z'
ja l2
inc dh
l2:
loop l0
mov [si],dx
F8F9 2004-04-29
  • 打赏
  • 举报
回复
mov si,BUF
mov cx,N
mov word ptr [si+N],0
cld
beg_do:
lobsb
cmp al,'0'
jc short next
cmp al,'9'+1
jnc short isalpha
inc byte ptr [si+N+1]
isalpha:
cmp al,'A'
jc short next
cmp al,'Z'+1
jnc short next
inc byte ptr [si+N+2]
next:
loop beg_do
老吹老吹 2004-04-28
  • 打赏
  • 举报
回复
在存储器中有一个首地址为BUF的长度为N(N小于255)的字符串,要求统计其中数字、大写字母的个数,并将结果依次存入字符串后的2个相邻单元中。
‘0’-----‘9’ ASCII 为30H-----39H
‘A’------‘Z’ ASCII 为41H-------5AH

LOADSB ;从DS:SI 中读 STOSB ;存入到ES:DI 中

ECX=字符串长度

*<--------------------------------------------------------------*
|<---------------------------* |
LOADSB-->数字吗?-Y->EAX++ -->STOSB -->大写字母吗?-Y->EBX++ -->STOSB-->退出
|N | |N |
*----------------------->* *---------------->*


xishifengxiaodao 2004-04-28
  • 打赏
  • 举报
回复
不过我好像觉的这个程序是错的啊!
XmagicX 2004-04-28
  • 打赏
  • 举报
回复
其实这跟C思路差不多,汇编是逐一比较
先移入一个字符比较是否数字是的话寄存器+1,不是再判断是否大写,是另一寄存器+1,不是移入一个字符,直到移完
xishifengxiaodao 2004-04-28
  • 打赏
  • 举报
回复
最好也能把大概思路说出来,
汇编就是这样的,有时不说出来难懂
谢谢了!@
本人对C语言比较精通,谁有不懂可以问,
这样才能一起学习啊
xishifengxiaodao 2004-04-28
  • 打赏
  • 举报
回复
如果别人还有其它方法的话的,也是可以写上的,
共同学习的吧!
xishifengxiaodao 2004-04-28
  • 打赏
  • 举报
回复
先谢谢了,我去试一下!
1cctv 2004-04-27
  • 打赏
  • 举报
回复
上面的次序不对了。

    mov ebx,buf
mov ecx,N
    mov edi,ebx
    add edi,ecx
    mov word ptr[edi],0
loopp:
    cmp byte ptr[ebx],30h
    jl okok
    cmp byte ptr[ebx],39h
    jg gnum
    inc byte ptr[edi]
    jmp short okok
gnum:
    cmp byte ptr[ebx],41h
    jl okok
    cmp byte ptr[ebx],5ah
    jg okok
    inc byte ptr[edi+1]
okok:
    inc ebx
    loop loopp
1cctv 2004-04-27
  • 打赏
  • 举报
回复

    mov ebx,buf
    mov edi,ebx
    add edi,N
    mov word ptr[edi],0
    mov ecx,edi
loopp:
    cmp byte ptr[ebx],30h
    jl okok
    cmp byte ptr[ebx],39h
    jg gnum
    inc byte ptr[edi]
    jmp short okok
gnum:
    cmp byte ptr[ebx],41h
    jl okok
    cmp byte ptr[ebx],5ah
    jg okok
    inc byte ptr[edi+1]
okok:
    inc ebx
    loop loopp

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧