有没有哪位仁兄帮忙调试下

I'm Daniel Du 2011-08-19 03:14:28
杨季文的80x86汇编语言程序设计
masm汇编时说类型不匹配
检查了下发现也没错误,用debug太麻烦了,哪位电脑上有od的,就拜托了.


mlength=128;buffer size
;
dseg segment
buff db mlength
db ?
db mlength dup (?)
mess0 db 'please input:$"'
mess1 db 'length=$'
mess2 db 'x=$';number in bh
mess3 db 'y=$';letter in bl
dseg ends
;
cseg segment
assume cs:cseg,ds:dseg
start:mov ax,dseg
mov ds,ax
mov dx,offset mess0
call dispmess
mov dx,offset buff
mov ah,10;10=oah
int 21h
call newline
;清数字符计数 bh
;清字母符计数器 bl
;mov bh,0
;mov bl,0
xor bx,bx
;
mov cl,buff+1;get character string's actual length
mov ch,0
jcxz cok
mov si,buff+2
again:mov al,[si]
inc si
cmp al,'0'
jb next
cmp al,'9'
ja nodec
inc bh
jmp short next
nodec:or al,20h
cmp al,'a'
jb next
cmp al,'z'
ja next
inc bl
next:loop again
;
cok:mov dx,offset mess1
call dispmess
mov al,buff+1
xor ah,ah
call dispal
call newline
;
mov dx,offset mess2
call dispmess
mov al,bh
xor ah,ah
call dispal
call newline
;
mov dx,offset mess3
mov al,bl
xor ah,ah
call dispal
call newline
;
mov ax,4c00h
int 21h
;
;dispal
;in:al=8 bit binary digit
;out:null
dispal proc
mov cx,3
mov dl,10
disp1:div dl
xchg ah,al
add al,'0'
push ax
xchg ah,al
mov ah,0
loop disp1
mov cx,3
disp2:pop dx
call echoch
loop disp2
ret
dispal endp
;
;explanation:show dx
dispmess proc
mov ah,9
int 21h
ret
dispmess endp
;
;explanation:show dl
echoch proc
mov ah,2
int 21h
ret
echoch endp
;
newline proc
push ax
push dx
mov dl,0dh
mov ah,2
int 21h
mov dl,0ah
mov ah,2
int 21h
pop dx
pop ax
ret
newline endp
;
cseg ends
end start
...全文
84 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
I'm Daniel Du 2011-08-19
  • 打赏
  • 举报
回复
谢谢了,我这就结贴.
I'm Daniel Du 2011-08-19
  • 打赏
  • 举报
回复
16位od,你们不知道吧
abee23 2011-08-19
  • 打赏
  • 举报
回复

jcxz cok
mov si,buff+2
again:mov al,[si]

改成:
jcxz cok
mov si,offset buff+2
again:mov al,[si]
或者改成:
jcxz cok
mov si,offset [buff+2]
again:mov al,[si]

;;;;-------
;原先的mov si,buff+2的意思把buff+2这个位置的值传给si,buff是byte的!所以buff+2也是byte的,而si是word来的,MOV要求两个操作数的长度大小一样的呀,所以MASM报错啦。!
;si应该存放buff+2这个地址的偏移,应该是16位的!
;而lz的mov si,buff+2 尝试直接把一个8数数值放到 si,16位寄存器当中。
;还好 mov 发现 两个操作数是不同长度的....呵呵。

钱国正 2011-08-19
  • 打赏
  • 举报
回复
看到上面的大牛就晕了
masmaster 2011-08-19
  • 打赏
  • 举报
回复
mov si,buff+2 ;buff是db类型,与si不符,改成
mov si,word ptr buff+2 ;试一试

ps:od不能调试16位程序吧?
zara 2011-08-19
  • 打赏
  • 举报
回复
; ...
mov ch,0
jcxz cok
mov si,buff+2 ; 这里改为 mov si, offset buff[2] 试试
again:mov al,[si]
inc si
; ...
; 另外,你这个是 dos16 类的程序吧,od 针对的是 Win32 类程序调试的
; 这个程序运行大体上是对的,虽然显示上略有瑕疵

21,458

社区成员

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

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