我是个汇编语言新手。现在,我正在尝试编写一个将数字从十进制转换为二进制的程序,但我遇到了一个问题。在用户输入数字(从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发布于 2014-10-05 00:26:32
对于输入的每个字符,都需要一个循环。对于每个,减去得到一个介于0和9之间的整数。要“移到下一个数字”,您需要将当前值乘以10,然后添加下一个数字。
发布于 2014-10-05 00:35:51
当您输入一个数字或想要打印它时,您需要转换为ascii或从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还快,现在我就喜欢它了。
https://stackoverflow.com/questions/26194655
复制相似问题