首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >汇编程序设计

汇编程序设计
EN

Stack Overflow用户
提问于 2014-10-05 00:14:50
回答 2查看 192关注 0票数 0

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

代码语言:javascript
复制
     SUB ax, 48

但这只能通过键入一个数字来实现...如果数字更高,我如何将键入的数字转换为ascii整数?我想过把字符串拆分成字符,但我不知道该怎么做。

这是我已经编写的程序的一部分:

代码语言:javascript
复制
    .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
EN

回答 2

Stack Overflow用户

发布于 2014-10-05 00:26:32

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

票数 0
EN

Stack Overflow用户

发布于 2014-10-05 00:35:51

当您输入一个数字或想要打印它时,您需要转换为ascii或从ascii转换,因此减去48是正确的。

现在,如果用户输入类似于"123“的内容,则不能直接减去。您需要:

  • split number
  • make number make

(再次将号码拆分为数字并重新生成号码)

现在想一想。"123“实际上是1*100+2*10+3,所以伪代码应该是:

代码语言:javascript
复制
A = readNumber
exp = 10^A.length
result = 0
for i = 0, i < A.length, i++ do
  result += A[i]*exp
  exp /= 10
end

在汇编语言中,它可能类似于:

代码语言:javascript
复制
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还快,现在我就喜欢它了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26194655

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档