8086程序集将输入字符串转换为整数

时间:2013-12-28 20:48:09

标签: assembly type-conversion x86-16

我正在尝试让我的代码在emu8086中正确执行计算,但是,我不确定如何将字符串转换为整数。

  message1 db 0dh, 0ah, "input width: $"
   message2 db 0dh, 0ah, "Input perimeter: $"                     
   width dw ' ', 20 dup('?')
   height dw ' ', 20 dup('?')
   w dw 0
   h dw 0

    calc: 
    mov dx, offset message1
    mov ah, 9
    int 21h  

    lea dx, width
    mov ah, 0ah 
    int 21h 
    mov cx, width

    xor bx, bx
    .next_digit1:
    mov ax, byte[cx]
    inc cx
    sub al, '0'
    mul bx, 10
    add bx, ax
    loop .next_digit1
    mov ax, w     


    mov dx, offset message2
    mov ah, 9
    int 21h 

    lea dx, height
    mov ah, 0ah 
    int 21h 
    mov cx, height

    xor bx, bx
    .next_digit2:
    mov ax, byte[cx]
    inc cx
    sub al, '0'
    imul bx, 10
    add bx, ax
    loop .next_digit2
    mov bx, 2
    div bx
    mov bx, w
    sub bx, ax
    mov ax, h 


    mov cx, w 
    add cx, 100
    mov dx, h
    add dx, 20

我需要转换输入,以便w和h值是整数,所以我可以用它们和普通的整数值执行加法,是否有办法使实际输入成为concidered整数,或者我是否必须转换它,在任何一种情况下,我将如何去做呢?我对汇编语言不是很有经验。

2 个答案:

答案 0 :(得分:2)

如果你想从8086程序集中的String中获取一个Integer(例如,你的命令行参数是字符串),你必须确实转换输入。它可以相对简单地完成。 您的输入字符串实际上是一个ASCII符号表。如果您确定输入中只有数字0-9(如果您不确定,则需要先检查),只需执行以下操作:

  1. 准备输出变量(当然可能是寄存器),将其初始化为0.

  2. 将结果乘以10(“准备空间”表示新的数字)。

  3. 从输入中取第一个数字(从左边开始,是你未来整数中最重要的数字)并从中减去48(ASCII中的'0'是48,如果这看起来不清楚则搜索ASCII表)。

  4. 将您获得的值(数字 - 48)添加到您的结果中。

  5. 对输入中的所有符号重复[2,3,4],从左(最高有效数字)到右(最低有效数字)。

  6. 遵循这个简单的算法,您可以非常简单地将String输入转换为Integer输出。当然,互联网上有许多现成的解决方案;如果你决定使用其中一个,那么上面的算法应该有助于你理解代码。

    更多研究可以引导您:Convert string to int. x86 32 bit Assembler using Nasm

答案 1 :(得分:-1)

in al=keyboard ascii
out al=hexadecimal digit

org 3C8A
call 3cc3   ;string decimal numeric nc=no
jc 3c9f     ;its 0-9
nop 
nop 
nop 
push    ax
or  al,20   ;convert TO LOWER case
sub al,61   ;'a'
cmp al,5    ;'f'-'a'
ja  3ca1    ;not a-f or A-F
add al,a 
inc sp  ;loop 3c9d  normal return (first pop old AX)
inc sp 
clc         ;loop 3c9f
ret 

org 3ca1
pop ax  ;loop 3ca1  error
stc 
ret 

org 3cc3
mov ah,al
sub al,30          ;'0'
jl     3ccf
cmp al,9           ;9
ja  3ccf        ;if not digit
stc
ret
mov al,ah   ;3ccf loop    not number
clc      
ret