qq_33699804 2016-12-26 11:18 采纳率: 0%
浏览 1388
已结题

急急急急急急汇编报错求大神帮忙改错

include io32.inc
.data
m1 byte ' 代码转换系统 ',13,10,0 ;菜单
m2 byte '----------------------------------------------',13,10,0 ;分割线
m3 byte ' 编号 操作 ',13,10,0

ma byte ' a 实现大写字母向小写字母的转换',13,10,0
mb byte ' b 实现小写字母向大写字母的转换',13,10,0
mc byte ' c 实现二进制向十六进制数的转换',13,10,0
md byte ' d 实现十六进制向二进制数的转换',13,10,0
me byte ' e 实现十六进制向十进制数的转换',13,10,0
mq byte ' q 退出',13,10,0
m_err byte ' 输入错误,请重新输入',13,10,0
m_meau byte '请输入菜单中的编号: ',0
m_inputs byte '请输入一个小写字母: ',0
m_inputl byte '请输入一个大写字母: ',0
m_outputl byte '对应的小写字母: ',0
m_outputs byte '对应的大写字母: ',0
m_input1 byte '请输入二进制位数: ',0
m_input11 byte '请输入二进制数: ',0
m_output1 byte '转换后的十六进制数: ',0
m_output2 byte '转换后的二进制数: ',0
m_input3 byte '请输入一个十六进制数: ',0
m_output3 byte '转换后的十进制数: ',0
array byte 8 dup (0) ;用字符串数组保存十六进制数
sum dword ? ;十进制数变量
len byte ? ;字符串数组的长度
m byte ?
array1 byte 100 dup (0) ;定义一个数组用来保存初始二进制数
array2 byte 100 dup (0) ;用来保存转换后的十六进制数
n dword ?
k dword ?
j dword ?
.code
start:
mov eax,offset m1 ;显示菜单中的内容
call dispmsg
mov eax,offset m2
call dispmsg
mov eax,offset m3
call dispmsg
mov eax,offset ma
call dispmsg
mov eax,offset mb
call dispmsg
mov eax,offset mc
call dispmsg
mov eax,offset md
call dispmsg
mov eax,offset me
call dispmsg
mov eax,offset mq
call dispmsg

meau: mov eax,offset m_meau
call dispmsg ;提示输入相应的菜单编号
call readc ;输入对应的编号
call dispcrlf ;换行
cmp al,'a' ;判断输入
jz a ;若输入‘a’,则跳转到标识符‘a’
cmp al,'b'

jz b ;若输入‘b’,则跳转到标识符‘b’
cmp al,'c'
jz cc ;若输入‘c’,则跳转到标识符‘cc’
cmp al,'d'
jz e ;若输入‘d’,则跳转到标识符‘e’
cmp al,'e'
jz e ;若输入‘e’,则跳转到标识符‘e’
cmp al,'q'
jz q ;若输入‘q’,则跳转到标识符‘q’
mov eax,offset m_err
call dispmsg ;输入错误,提示错误的信息
jmp meau

                            ;大写字母向小写字母的转换

returna:
mov eax,offset m_err
call dispmsg
a: mov eax,offset m_inputl
call dispmsg ;提示输入一个大写的字母
call readc ;获得字母
mov bl,al ;将输入的内容存储到bl中
call dispcrlf ;换行
cmp al,'A' ;判断输入的字母是否合法
jb returna ;如果比'A'小,则跳转到returna标识符
cmp al,'Z'
ja returna ;如果比'Z'大,则跳转到returna标识符
call dispc ;显示字母
mov eax,offset m_outputl
call dispmsg ;输入正确,则提示输出相应的小写字母
add bl,20h ;实现大写向小写的转换
mov al,bl
call dispc ;显示转换后的字母
call dispcrlf ;换行
jmp meau

                            ;小写字母向大写字母的转换

returnb:
mov eax,offset m_err
call dispmsg
b: mov eax,offset m_inputs
call dispmsg ;提示输入一个小写字母
call readc ;获得字母
mov bl,al ;将输入的内容存储到bl中
call dispcrlf

cmp al,'a' ;判断输入合法性
jb returnb ;如果比‘a’小,则跳转到returnb标识符
cmp al,'z'
ja returnb ;如果比‘z’大,则跳转到returnb标识符
call dispc ;显示字母
mov eax,offset m_outputs
call dispmsg ;提示输出相应的大写字母
sub bl,20h ;实现小写到大写字母的转换
mov al,bl

call dispc ;将转换的字母输出
call dispcrlf ;换行
jmp meau

                            ;二进制向十六进制转换

cc:
mov eax,offset m_input1
call dispmsg
call readuid ;输入二进制数的位数
mov j,eax ;保存二进制位数
mov eax,offset m_input11 ;提示输入二进制数
call dispmsg
call dispcrlf
mov ecx,0 ;清零,计数器
c1:
call readuid
mov array1[ecx],al ;一位一位的输入
inc ecx
cmp ecx,j
jb c1 ;低于位数,继续输入
mov ecx,j
dec ecx
mov eax,1
xor ebx,ebx ;记录移动的位数
xor edx,edx ;表示四个二进制位的和
xor esi,esi ;保存十六进制当前的位置
c2:
mov n,0 ;n作为二进制位数是否已达4位的一个标志
mov k,0 ;k作为数值是否已经结束的一个标志
cmp array1[ecx],1
jnz c11 ;判断二进制数的某一位是否为1
mov eax,1
cmp ebx,1
jnz c3 ;判断数据所在的位数,不相等,转向c3
shl eax,1 ;逻辑左移
jmp c5
c3: cmp ebx,2
jnz c4 ;根据比较来确定移动的位数
shl eax,2 ;逻辑左移
jmp c5

c4:
cmp ebx,3
jnz c5 ;根据比较来判断移动的位数
shl eax,3 ;逻辑左移
c5:
add edx,eax ;保存和
c11:
cmp ebx,3 ;判断二进制数是否已经有四位
jnz c12
mov n,1
c12:
cmp ecx,0 ;判断数值是否已经全部计算完毕
jnz c13
mov k,1
c13:
mov edi,n
or edi,k ;保存n或者k的值
cmp edi,1
jnz c16
cmp edx,9
jna c14
sub edx,10 ;edx大于9
add edx,'A' ;转换成相应的字母
mov array2[esi],dl ;将十六进制数保存至数组
jmp c15
c14:
add edx,'0'
mov array2[esi],dl ;edx大于等于0小于等于9
c15:
inc esi ;改变当前十六进制数所在位置
xor edx,edx ;清零以便下一次运用
mov ebx,-1
c16:
inc ebx
dec ecx
cmp ecx,0
jnl c2 ;小于0,退出循环
mov eax,offset m_output1
call dispmsg
mov ecx,esi ;16进制数的位数
dec ecx
ccc:
mov al,array2[ecx]
call dispc ;输出每一个十六进制数
dec ecx
cmp ecx,0 ;输出转换后的数据
jnl ccc
call dispcrlf
jmp meau ;返回主菜单

                            ;十六进制向二进制的转换

d:

mov eax,20
push eax ;将20作为一个判断标识
mov eax,sum ;将十进制数存入eax中
jmp d1

d1: mov edx,0
mov ebx,2 ;除数2
div ebx
mov ecx,eax ;保存商
mov eax,edx

push eax ;将余数压入栈
mov eax,ecx

cmp eax,0 ;判断商是否为0
jz d2
jmp d1
d2: mov ecx,eax ;暂存
mov eax,offset m_output2
call dispmsg
mov eax,ecx
jmp d3
d3: pop eax ;出栈
cmp eax,20
jz d4 ;判断是否出栈完毕
call dispsid
jmp d3
d4: call dispcrlf
jmp meau ;返回主菜单

                            ;十六进制向十进制的转换

e: mov m,al
mov eax,offset m_input3
call dispmsg

mov eax,offset array

call readmsg

mov len,al ;获得字符串长度
xor ecx,ecx ;异或清零
mov cl,len ;计数
dec cl ;自减1
xor eax,eax
mov edx,1 ;初始权值
again: cmp array[ecx],'A'
jl shiliu_shi1 ;小于A,转向shiliu_shi1
cmp array[ecx],'F'
jg shiliu_shi1 ;大于Z,转向shiliu_shi1
xor ebx,ebx
mov bl,array[ecx] ;相对寻址
sub bl,55 ;转换成相应的数字
imul ebx,edx
add eax,ebx
imul edx,16 ;改变权值
jmp shiliu_shi3
shiliu_shi1:
cmp array[ecx],'0'
jl shiliu_shi2 ;小于‘0’,转向shiliu_shi2
cmp array[ecx],'9'
jg shiliu_shi2 ;大于‘9’,转向shiliu_shi2
xor ebx,ebx ;临时寄存
mov bl,array[ecx]
sub bl,'0' ;转换成相应的数字
imul ebx,edx
add eax,ebx
imul edx,16 ;改变权值
jmp shiliu_shi3

shiliu_shi2:
mov eax,offset m_err
call dispmsg ;提示输入错误
jmp e
shiliu_shi3:
dec ecx ;自减
cmp ecx,0

jnl again ;不小于0,转向again
mov sum,eax
cmp m,'d' ;判断选择的功能
jz d ;为d,继续进行转换成二进制
cmp m,'e'
jz ee ;为e,直接输出
ee: mov eax,offset m_output3
call dispmsg
mov eax,sum ;数据输出
call dispuid
call dispcrlf
jmp meau ;返回主菜单
q: jmp done ;退出
done:
exit 0
end start

  • 写回答

1条回答

  • devmiao 2016-12-26 16:27
    关注
    评论

报告相同问题?

悬赏问题

  • ¥20 win11修改中文用户名路径
  • ¥15 win2012磁盘空间不足,c盘正常,d盘无法写入
  • ¥15 用土力学知识进行土坡稳定性分析与挡土墙设计
  • ¥70 PlayWright在Java上连接CDP关联本地Chrome启动失败,貌似是Windows端口转发问题
  • ¥15 帮我写一个c++工程
  • ¥30 Eclipse官网打不开,官网首页进不去,显示无法访问此页面,求解决方法
  • ¥15 关于smbclient 库的使用
  • ¥15 微信小程序协议怎么写
  • ¥15 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?
  • ¥20 怎么用dlib库的算法识别小麦病虫害