急急急!!!!请教汇编一题
编写一程序,要求从键盘接收一个四位十六进制数,并在终端上显示与他等值的二进制数`
date segment
date ends
stack segment stack
db 120 dup(0)
stack ends
code segment
main proc far
assume ds:date,ss:stack,cs:code
start:
push ds
sub ax
push ax
mov ah,1
int 21h
//sub al,30h
cmp al,0ah
jl L1
sub al,7h//这四句我不要结果也一样
L1:
mov cl,4 ;把低四位循环为高四位,以用于下面的四次循环
sal al,cl
mov ch,4 ;循环计数器
mov cl,1 ;循环左移的1次
rotate:
rol al,cl
jc next
mov dl,30h ;如果cf=0输出0的十六进制30h
jmp L2
next:
mov dl,31h ;为1输出1的十六进制31h
L2:
mov ah,2 ;2号输出
int 21h
dec ch ;计数器自减1
cmp ch,0 ;比较是否结束循环
jne ratate
ret
main endp
code ends
end
我们老师说我们用的是很旧的版本,前面的东东必写,我也不知什么该写什么不该写,全写上了。
我这编译能编译通过,但每次输入一个数总是输出0000
我们老师刚从研究生毕业一年,啥都不会,连书上的程序都看不懂,我请他帮我看过程序,他说一句自己看,
我反思了这个程序,我觉得可能我对数字在内存中的存储方式不懂。比如在键盘上输入一个十进制数,他是用ASC2还是压缩的十六进制存储,是不是计算机在帮我们转换?
我们用的书是清华大学的《IBM-PC汇编语言和程序设计》第二版编著沈美明,温冬婵
问题点数:100、回复次数:17Top
1 楼deadog(死狗不死)回复于 2003-06-03 12:12:36 得分 0
up.Top
2 楼nik_Amis(...)回复于 2003-06-03 12:25:36 得分 0
。。。。。Top
3 楼bethrezen(拖泥)回复于 2003-06-03 12:44:51 得分 0
upTop
4 楼dunkel(内心和夜 哪个黑)回复于 2003-06-03 12:50:07 得分 0
版主替楼主转到汇编版去吧.Top
5 楼chenzhangf(寒剑文)回复于 2003-06-03 12:52:53 得分 0
贴错地方了.Top
6 楼pds9902(双)回复于 2003-06-03 14:34:47 得分 100
楼主,你算是遇到好人了!
呵呵,好人?不就是我啰?!
看了你的程序,帮你调试了一下, 你的问题是出在了每次调用2号输出的时候,al的值都会改变,它会变成你输入的在dl中的值.即总在30H,31H两个中变化.
你只要在调用2号输出时将ax进栈,调用完后将ax出栈即可!!!
具体程序如下(我把你定义的堆栈去掉了我认为不需要定义那么长的堆栈):
date segment
date ends
code segment
main proc far
assume ds:date,cs:code
start:
push ds
mov ax,date
mov ds,ax;置有效的数据段
sub ax,ax;此处置ax=0
push ax
mov ah,1
int 21h
sub al,30h
cmp al,0ah
jl L1
sub al,7h;这四句很重要,0-9的asii是30h-39h,A-F的asii是41h-46h,中间隔了07h
;所以当输入0-9时减30h,输入A-F时,减37h
L1:
mov cl,4 ;把低四位循环为高四位,以用于下面的四次循环
sal al,cl
mov ch,4 ;循环计数器
mov cl,1 ;循环左移的1次
rotate:
rol al,cl
jc next
push ax ;此处进栈
mov dl,30h ; 如果cf=0输出0的十六进制30h
jmp L2
next:
push ax ;此处进栈
mov dl,31h ; 为1输出1的十六进制31h
L2:
mov ah,2 ; 2号输出
int 21h
pop ax ;此处出栈
dec ch ;计数器自减1
cmp ch,0 ;比较是否结束循环
jne rotate
ret
main endp
code ends
end
程序成功运行,呵呵Top
7 楼wuhaiping(一)回复于 2003-06-04 15:44:12 得分 0
多谢仁兄指点
我想知为什么al会变
小弟刚学请不要见笑Top
8 楼wuhaiping(一)回复于 2003-06-04 15:49:38 得分 0
mov ds,ax;置有效的数据段
sub ax,ax;此处置ax=0
push ax
这三句我知是和ret一起用,
但我不知为什么ax=0再压栈
Top
9 楼wuhaiping(一)回复于 2003-06-04 15:51:09 得分 0
汇编论坛在那儿,我找不找Top
10 楼pds9902(双)回复于 2003-06-04 16:05:02 得分 0
>>我想知为什么al会变
mov dl,待输出的字符
mov ah,2
int 21h
以上是在屏幕上输出dl中的字符,成功则al=输出的字符;
push ds
mov ax,date
mov ds,ax;置有效的数据段
sub ax,ax;此处置ax=0
push ax
以上五句最好写成:
push ds ;保存ds
push ax ;保存ax ->以上两句不要也可以,但习惯上写上
mov ax,date
mov ds,ax;置有效的数据段
sub ax,ax;此处置ax=0
Top
11 楼dunkel(内心和夜 哪个黑)回复于 2003-06-04 18:55:22 得分 0
"汇编语言" 在 "开发语言" 里.Top
12 楼wuhaiping(一)回复于 2003-06-05 15:42:42 得分 0
pds9902(双):
我前天又有一题不能运行能否再帮一个忙,
冒泡排序的子程序调用。
data segment
num dw 5,8,5,16,84,32
save_cnt dw ?
start_addr dw ?
data ends
stack segment stack
db 120 dup(0)
stack ends
code segment
main proc far
assume ds:data,ss:stack,cs:code
start:
push ds
sub ax,ax
push ax
mov ax, data
mov ds,ax
mov di,num
call bubble
mov cx,[di]
L1:
add di,2
mov dx, [di]
mov ah,2
int 21h
loop L1
ret
main endp
bubble proc near
mov start_addr,di
mov cx,[di]
mov save_cnt,cx
init:
mov bx,1
mov ax,save_cnt
dec ax
mov save_cnt,ax
jz sorted
mov cx,save_cnt
mov di,start_addr
next:
add di,2
mov ax,[di]
cmp [di+2],ax
jae cont
xchg [di+2],ax
mov [di],ax
sub bx,bx
cont:
loop next
cmp bx,0
je init
sorted:
mov di,start_addr
ret
bubble endp
code ends
end start
我不知子程序调用是否与普通程序一样编译和联接
masm 程序名.asm
默认三个回车生成.obj文件,
link 程序名.obj
默认三个回车生成.exe文件,
执行.exe
程序出来一行……module[.obj]:我也记不清前面是什么?
关于那个stack segment stack 我们学校的机子必须要,不然报错说stack error.
Top
13 楼ttty()回复于 2003-06-05 15:56:09 得分 0
upTop
14 楼lovehululu(夜晚熊熊燃烧)回复于 2003-06-05 15:59:48 得分 0
upTop
15 楼pds9902(双)回复于 2003-06-05 16:28:25 得分 0
to 楼主,
先把这个贴子结了吧,
我可一直在等着接分呢!!!Top
16 楼pds9902(双)回复于 2003-06-06 14:30:02 得分 0
to 楼主,
你上面的冒泡排序我已经帮你改好了,
又是一个忘记进栈出栈的问题,
我觉得奇怪的是,
上面的程序是不是你自己亲自写的,
如果是,应该不会犯这种低级错误啊!!!
楼主快结贴吧,别忘了,另开100分的帖,我把改好的冒泡排序发给你!!!Top
17 楼wuhaiping(一)回复于 2003-06-10 15:50:42 得分 0
ok,
全给你Top
相关问题
- ※※数组赋值问题(VC内联汇编中的)急急急,在线等待##
- 菜了问题,汇编有没有什么可以用的库函数??那里有教程??急急急急!!!
- 请教,X86汇编转AT&T汇编,急急
- 急急急急急急急急急急急急急急急用户控件的问题急急急急急急急急急急急急急急急急急急
- 窗口重画问题!急急急急急急急急急急急急急急急急急急急急急急急急急急急急急急
- 急!急!急!急!急!急!急!急!急!急!急!路由问题!
- DropDownList 问题!急急急急急急急!
- 关于validation experssion的问题?急急急急急急急急急急急急急急急急急急急
- 学过win32汇编高手们:帮忙!!--急!急!急(散分)
- hook api的问题 急急急急急急急急急急急急急急急急急急急急急急急急急急




