注册 登录
编程论坛 汇编论坛

汇编问题求解!

capricorn_lb 发布于 2012-11-21 21:38, 810 次点击
将数据段中的字符转化为大写,然后在第八行第三列显示.大家看下我代码哪里错了啊!
assume cs:codesg
datasg segment
db "Beginner's All-purpose Symbolic Instruction Code.",0
datasg ends
stack segment
dw 8 dup(0)
stack ends
codesg segment
begin: mov ax,datasg
mov ds,ax
mov si,0
mov ax,stack
mov ss,ax
mov sp,8
        mov dh,8   
        mov dl,3
call letterc
call show_str
mov ax,4c00h
int 21h
letterc:push ax
push si
mov ch,0
mov cl,[si]
jcxz s2
s:mov al,[si]
cmp al,'a'
jb s1
cmp al,'z'
ja s1
and al,11011111b
mov [si],al
s1:inc si
jmp letterc
s2:pop si
pop ax
ret
show_str:push ax
push si
push dx
mov ax,0b800h
mov es,ax
mov ax,160
mul dh
mov bx,ax
mov ax,2
mul dl
add bx,ax
mov al,2
mov cl,0
s3:
mov ch,[si]
jcxz s4
mov es:[bx],ch
mov es:[bx+1],al
inc si
add bx,2
jmp s3
s4:pop dx
 pop si
pop ax
ret
codesg ends
end begin
10 回复
#2
zklhp2012-11-21 21:42
好长啊
#3
capricorn_lb2012-11-21 21:46
回复 2楼 zklhp
大哥您能看出来哪里错了吗,我检查不出问题啊
#4
zklhp2012-11-21 21:50
以下是引用capricorn_lb在2012-11-21 21:46:56的发言:

大哥您能看出来哪里错了吗,我检查不出问题啊
编译错误 还是运行出错 你都不说明白 谁给你看。。
#5
capricorn_lb2012-11-21 21:55
回复 4楼 zklhp
编译都没问题,生成的EXE,打开它光标在乱跳,没有显示出我数据段里的内容
#6
青春无限2012-11-21 22:16
看看
#7
zhu2240392012-11-21 22:33
回复 6楼 青春无限
你是个水王啊
#8
zhu2240392012-11-21 22:47
程序代码:
assume cs:codesg
datasg segment
db "Beginner's All-purpose Symbolic Instruction Code.",0
datasg ends
stack segment
dw 8 dup(0)
stack ends
codesg segment
begin: mov ax,datasg
mov ds,ax
mov si,0
mov ax,stack
mov ss,ax
mov sp,8
        mov dh,8  
        mov dl,3
call letterc
call show_str
mov ax,4c00h
int 21h
letterc:push ax             //这个letterc放的位置有问题了 你jmp到这个地方的时候 循环就一直在压站 会发生栈溢出  会覆盖住程序的返回地址的,造成错误 ,就你这个标号letterc 放在我后面说的dec cx处
        push si
        mov ch,0
        mov cl,[si]            //cx被赋值后 没有相应的dec cx的指令  因为你用的是jmp 而不是loop  这个地方得加上 dec cx 为后面的jcxz的跳转提供机会
        jcxz s2               
s:      mov al,[si]
        cmp al,'a'  
        jb s1
        cmp al,'z'
        ja s1
       and al,11011111b
       mov [si],al
s1:    inc si
       jmp letterc
s2:    pop si
       pop ax
       ret
show_str:push ax
      push si
      push dx
      mov ax,0b800h
      mov es,ax
      mov ax,160
   mul dh
   mov bx,ax
   mov ax,2
   mul dl
   add bx,ax
   mov al,2
   mov cl,0
s3:
mov ch,[si]
jcxz s4
mov es:[bx],ch
mov es:[bx+1],al
inc si
add bx,2
jmp s3
s4:pop dx
pop si
pop ax
ret
codesg ends
end begin
就给你改到这了,累的很  你能不能将代码搞出个层次感出来  再放上来呢
#9
zhu2240392012-11-21 22:47
最好是 加上注释好吗?
#10
有容就大2012-11-21 23:00
希望楼主给注释 给思路
现在上网时间很少 还是帮你改一次吧 以后可能这方面的工作就要放下点了
只有本站会员才能查看附件,请 登录


MASMPlus下的
你对比下那里修改了
程序代码:
;#Mode=DOS

assume cs:codesg, ds:datasg
datasg segment
db "Beginner's All-purpose Symbolic Instruction Code.", 0
datasg ends
stack segment
dw 8 dup(0)
stack ends
codesg segment
begin: mov ax,datasg
mov ds,ax
mov si,0
mov ax,stack
mov ss,ax
mov sp,16
        mov dh,8
        mov dl,3
call letterc
call show_str
mov ah, 01h
int 21h
mov ax, 4c00h
int 21h

letterc:push ax
push si
s0 :mov ch,0
mov cl,[si]
jcxz s2
s:mov al,[si]
cmp al,'a'
jb s1
cmp al,'z'
ja s1
and al,11011111b
mov [si],al
s1:inc si
jmp s0
s2:pop si
pop ax
ret

show_str:push ax
push si
push dx
mov ax,0b800h
mov es,ax
mov ax,160
mul dh
mov bx,ax
mov ax,2
mul dl
add bx,ax
mov al,2
mov cl,0
s3:
mov ch, BYTE ptr [si]
jcxz s4
mov byte ptr es:[bx],ch
mov byte ptr es:[bx+1],al
inc si
add bx,2
jmp s3
s4:pop dx
pop si
pop ax
ret
codesg ends
end begin


#11
lbdsgg2012-11-22 12:18
回复 10楼 有容就大
谢谢你,我昨天晚上自己改出来了.
1