我正在尝试让我的代码在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整数,或者我是否必须转换它,在任何一种情况下,我将如何去做呢?我对汇编语言不是很有经验。
答案 0 :(得分:2)
如果你想从8086程序集中的String中获取一个Integer(例如,你的命令行参数是字符串),你必须确实转换输入。它可以相对简单地完成。 您的输入字符串实际上是一个ASCII符号表。如果您确定输入中只有数字0-9(如果您不确定,则需要先检查),只需执行以下操作:
准备输出变量(当然可能是寄存器),将其初始化为0.
将结果乘以10(“准备空间”表示新的数字)。
从输入中取第一个数字(从左边开始,是你未来整数中最重要的数字)并从中减去48(ASCII中的'0'是48,如果这看起来不清楚则搜索ASCII表)。
将您获得的值(数字 - 48)添加到您的结果中。
对输入中的所有符号重复[2,3,4],从左(最高有效数字)到右(最低有效数字)。
遵循这个简单的算法,您可以非常简单地将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