2014-10-04 35 views
0

我是编程装配新手。现在我正在尝试编写一个将数字从小数转换为二进制的程序,但是我遇到了一个问题。在用户输入数字(从0到65535)之后,我必须将它从ascii字符转换为ascii整数,我可以开始从十进制转换为二进制。如果它是一个数字(从0到9)我想我可以很容易地通过写作这样做:装配编程

 SUB ax, 48 

但这将通过输入一个数... 我怎么能转换成ASCII整数类型的数只工作如果数字更高?我想过将字符串分隔成字符,但我不知道如何做到这一点。

这是我已经写我的计划的一部分:

.MODEL small 
    .Stack 100h 

    .DATA 
    msg1 db 'input decimal number from from 0 to 65535: $' 
    msg2 db 0Dh,0Ah,'number in binary: $' 
    number db 255, ?, 256 dup ('$') 

    .CODE 
    start: 
    mov ax, @data 
    mov ds,ax 
    mov dx, offset msg1 
    mov ah,09h 
    int 21h 
    mov ah, 0Ah 
    mov dx, offset number 
    int 21h 


    mov ax,04C00h 
    int 21h 

end start 
+0

什么是“十进制数”?什么是“二进制数”?你手上的手指数是十进制还是二进制? – 2014-10-04 16:28:58

回答

0

你需要为每个输入字符的循环。对于每一个,减去获得0到9之间的整数。要“移动到下一个数字”,您需要将当前值乘以10,然后添加下一个数字。

0

当你输入号码或想要打印它,你需要转换到/从ASCII所以你说得对,减去48

现在,如果用户输入类似“123”你不能只是减去。您需要:

  • 分裂成数位
  • 化妆数量再次

现在想想。 “123”居然1*100+2*10+3是这样的伪代码将是:

A = readNumber 
exp = 10^A.length 
result = 0 
for i = 0, i < A.length, i++ do 
    result += A[i]*exp 
    exp /= 10 
end 

在汇编语言中它会是这样的:

mov ah, 0Ah 
mov dx, offset number 
int 21h 

; now number[1] index holds total read characters including RET 
mov cx, number[1] 
dec cx ; we need length without RET 
mov ax, 10 
.makeExponent: 
mul 10 ; MUL multiplies AX with an argument and stores in AX if argument is byte sized 
loop .makeExponent 
; now CX = 0, AX = exponent 
mov dx, ax ; Store exponent in DX 

mov cx, number[1] ;CX = digit count again 
mov si, offset number 
inc si 
inc si ; SI shows into number[0], we need to show for number[2] for the first digit 
cld ; lodsb instruction does INC SI if DF=0. CLD makes DF=0 

xor ax, ax ; AX = 0 
xor bx, bx ; BX = 0, BX will be result 

.decode 
lodsb ;Load value from DS:SI into AL and increment SI 
sub ax, 48 ; ASCII->number 
mul dx  ; Multiply by exponent. Like in 123 case here 1*100, next loop 2*10, then 3*1 
add bx, dx ; Add what we've got to result. For 123 case it's 100+20+3 
mov ax, dx ; DIV and MUL work only for AX, so move exponent to AX 
div 10  ; divide it by 10(100, then 10, then 1) 
xchg dx, ax ; And exchange DX and AX values 
loop .decode 

; BX is your result 

现在我还没有在汇编语言等等一些东西,而编码可能会关闭,如: 我假设mul dx在DX中存储结果的最低位,所以我将DX添加到BX。您可能需要将AX值添加到BX。 DIV也是如此。

xor val, val意味着val = 0.这是很久以前比mov val, 0快现在我只是喜欢它。