高手请进!帮我看看这个程序吧

aciwantac 2009-05-29 01:51:48
用汇编语言要实现“将一个字范围内的任意无符号数在屏幕上显示出来”
我的程序如下(请高手调试下,不甚感激):
STASG SEGMENT
DW 32 DUP(?)
STASG ENDS

DATA SEGMENT
DIVNUM DW 10
DATA ENDS

CODE SEGMENT
ASSUME CS:CODE,SS:STASG,ES:DATA
MAIN PROC FAR
PUSH ES
XOR AX,AX
PUSH AX
MOV AX,DATA
MOV ES,AX
MOV BX,162EH
CALL TERN
SHOW: CALL SHOW_RESULT
LOOP SHOW
MOV AX,4C00H
INT 21H
MAIN ENDP

TERN PROC ;二→十并显示。
XOR AX,AX
MOV AX,BX
XOR CX,CX
RECALL: CMP AL,0
JBE STOPCALL
CALL DEC_DIV
INC CX
JMP RECALL
STOPCALL: MOV AX,BX
MOV DX,0
DIV ES:DIVNUM ;商为转换后的一位十进制数
MOV DL,AH
MOV BX,AX
ADD DL,30H ;转换成ASCII码
PUSH DX
RET
TERN ENDP

DEC_DIV PROC
MOV AX,BX
MOV DX,0
DIV ES:DIVNUM ;商为转换后的一位十进制数
MOV DL,AH
MOV BL,AL
XOR BH,BH
ADD DL,30H ;转换成ASCII码
PUSH DX
RET
DEC_DIV ENDP


SHOW_RESULT PROC
XOR BX,BX
POP BX
MOV DL,BL
MOV AH,2 ;显示
INT 21H
RET
SHOW_RESULT ENDP
CODE ENDS
END MAIN
有什么问题呢?
...全文
102 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
bsnhk 2009-06-02
  • 打赏
  • 举报
回复
我这个程序采用直接写屏来显示,如果改为调用DOS功能来显示,程序的可移值性将更好。
bsnhk 2009-06-02
  • 打赏
  • 举报
回复
如果不要求显示十进制形式,那简单得很呀,下面是我以前写的程序,将寄存器的内容显示到屏幕上,显示的是十六进制值:
;====================================
; 显示DX寄存器的内容
; 2006-06-27 by bsnhk
;====================================
stackseg segment stack
db 10h dup(0)
stackseg ends

codeseg segment
assume cs:codeseg,ss:stackseg
start:
mov ax,stackseg
mov ss,ax
mov sp,10h
;----------------------------------------
; 设置25x80彩色显示缓冲区第0页的段基值
;----------------------------------------
mov ax,0b800h
mov es,ax ;设置为附加段
;-----------------------------------------
; 取光标所在位置所对应的第0页显存的偏址
;-----------------------------------------
mov ah,3
mov bh,0
int 10h
and dx,0ff00h ; dh为光标所在行的行号,将dl置0
sub ax,ax
mov al,dh ;设置乘法指令的目的操作数

mov dh,160 ;设置乘法指令的源操作数
mul dh ; 求出光标位置所对应的存储地址在第0页显存的偏址
mov bx,ax ;将这处偏址传送给BX
;------------------------------------------------------
mov dx,0cf05h ;将要显示的数值送入DX中
;------------------------------------------------------
mov cx,4
s:
push cx
mov cx,4
rol dx,cl
sub ax,ax
mov al,00001111b
and al,dl
cmp al,10
js c2 ;如果al-10结果为负数就说明al中的数值是0—9的数字
c1: ; 如果是大于9的数字,就转换成ASCII字符(A—F)
add al,55
jmp ok
c2: ; 如果是0—9的数字,就转换成ASCII字符(0—9)
or al,00110000b
ok:
mov es:[bx],al;将转换后的ASCII字符送到0页显存中
mov byte ptr es:[bx+1],9fh ;将这个字符的显示属性字节送到0页显存中
add bx,2
pop cx
loop s
;----------------------------------
mov ah,4ch
int 21h
codeseg ends
end start
aciwantac 2009-06-01
  • 打赏
  • 举报
回复
谢谢啦 我学会了 !!
jyicai 2009-05-29
  • 打赏
  • 举报
回复
一:ds指向数据段,es指向附加段 (ASSUME CS:CODE,SS:STASG,ES:DATA)
二:首先是push ds,sub ax,ax push ax
三:main结束,无须再用
mov ah,4ch int 21h
这句

aciwantac 2009-05-29
  • 打赏
  • 举报
回复
自己再顶一个 , 都在端午了? 爱国的人么
aciwantac 2009-05-29
  • 打赏
  • 举报
回复
大家都来帮忙啊!

21,459

社区成员

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

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