· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.ASSEMBLER —› В чем ошибка????

Посл.отвђт Сообщенiе


Дата: Июл 19, 2003 08:56:21 · Поправил: Безпощадный даос

Я написал программу, которая переводит числа из одной системы исчисления в другую. Вот её код. В чем ошибка?
Помогите.
data segment
xtable db '0123456789ABCDEF'
string db 10 dup(0)
len_string=$-string
string_e db "Integer is big$",13,10
ent db 13,10,'$'
buffer db 16 dup(' ')
bufferEnd label byte
data ends
st1 segment stack
	db 200 dup(0)
st1 ends
code segment
beg:
	assume cs:code, ss:st1, ds:data
	mov ax,data
	mov ds,ax
	mov ax,st1
	mov ss,ax
	xor bx,bx
	lea dx,string
	mov cx,len_string
	mov ah,3fh
	int 21h
	mov cx,ax
	sub cx,2
	jcxz exit
	dec cx
	lea si,string
	xor ax,ax
	jcxz L2
	
	mov bx,10
L1:
	xor dx,dx
	mov dl,[si]
	and dl,0Fh
	add ax,dx
	mul bx
	jc exit_e
	inc si
	loop L1
	push ax	
M1:
	mov ah,0
	int 16h
	cmp al,'b'
	jz bin
	cmp al,'h'
	jz hex
	cmp al,'o'
	jz oct
	cmp al,'d'
	jz dec3
	jmp M1
exit:
	mov ah,4Ch
	int 21h
exit_e:
	mov ah,9
	lea dx,string_e
	int 21h
	jmp exit
	
	
L2:
	mov dl,[si]
	and dl,0fh
	add ax,dx
	jc exit
	push ax
	jmp M1
dec3:
	jmp dec2
bin:
	call ent1
	pop ax
	xor cx,cx
	lea di,bufferEnd
	mov bx,2
B1:
	xor dx,dx
	div bx
	xchg ax,dx
	push bx
	lea bx,xtable
	xlat
	pop bx
	dec di
	mov [di],al
	xchg ax,dx
	inc cx
	or ax,ax
	jz vivod
	jmp B1
dec2:
	jmp dec1
hex:
	call ent1
	pop ax
	xor cx,cx
	mov bx,16
	lea di,bufferEnd
H1:
	xor dx,dx
	div bx
	xchg ax,dx
	push bx
	lea bx,xtable
	xlat
	pop bx
	dec di
	mov [di],al
	xchg ax,dx
	inc cx
	or ax,ax
	jz vivod
	jmp H1
oct:
	call ent1
	pop ax
	xor cx,cx
	mov bx,8
	lea di,bufferEnd
O1:
	xor dx,dx
	div bx
	xchg ax,dx
	push bx
	lea bx,xtable
	xlat
	pop bx
	dec di
	mov [di],al
	xchg ax,dx
	inc cx
	or ax,ax
	jz vivod
	jmp O1

dec1:
	call ent1
	pop ax
	xor cx,cx
	mov bx,10
	lea di,bufferEnd
D1:
	xor dx,dx
	div bx
	xchg ax,dx
	push bx
	lea bx,xtable
	xlat
	pop bx
	dec di
	mov [di],al
	xchg ax,dx
	inc cx
	or ax,ax
	jz vivod
	jmp D1
vivod:
	
	mov ah,2
	mov dl,[di]
	int 21h
	inc di
	loop vivod
	jmp exit			
ent1 proc
	mov ah,2
	mov dl,al
	int 21h
	mov ah,9
	lea dx,ent
	int 21h
	ret
ent1 endp
code ends
	end beg


Дата: Июл 20, 2003 01:57:17

ruslan20031
Ты бы хоть комментариев добавил, что ли


Дата: Июл 21, 2003 04:30:33

ruslan20031
1) Вначале программы не инициализируется регистр SP;
2) Операцию чтения со стандартного потока ввода (int21h AH=3Fh) надо проверять на JC;
3) В первоначальном преобразовании из строки в число программа не преобразовывает последний символ, например, ввел 123, в результате преобразования получил 120, что дальше приводит к операциям с неверным числом.

PS зачем бессмысленный jmp dec3 -> jmp dec2 -> jmp dec1.


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.084