用输入值计算emu8086,无法让我的代码工作

时间:2013-12-29 20:33:54

标签: assembly x86-16

我试图让这段代码工作,但是我一直在转换中遇到问题,我尝试了一些示例,这些示例是类似问题的答案,但是没有一个可以工作,但是从中我修补了一下我认为代码的版本,但它仍然无效。

org  100h

jmp calc
message db 0dh, 0ah, "Input width. $"                    
width dw 10,?, 10 dup('?')
w dw 0

 calc: 
    mov dx, offset message
    mov ah, 9                ;output message
    int 21h  

    mov dx, offset width
    mov ah, 0ah            ;read input for width
    int 21h
    mov dx, width 


    .next_digit1:
    mov cx, width[bx+2]
    inc bx
    sub cx, '0'
    mul w, 10               ;convert width string into a number
    add w, cx
    loop .next_digit1

    mov cx, w
    add cx, 100        ; do calculation
    mov w, cx  


    mov ah, 2         ;output the result
    int 21h   

我最大的问题是字符串到数字转换无法正常工作,而我尝试过的另一种转换方法是先前在我这里建议的:

; Input:
; ESI = pointer to the string to convert
; Output:
; EAX = integer value
string_to_int:
  xor ebx,ebx    ; clear ebx
.next_digit:
  movzx eax,byte[esi]
  inc esi
  sub al,'0'    ; convert from ASCII to number
  imul ebx,10
  add ebx,eax   ; ebx = ebx*10 + eax
  loop .next_digit  ; while (--ecx)
  mov eax,ebx
  ret

似乎不起作用,主要是因为行

movzx eax,byte [esi]

给出了非法的教师错误,如果我将其更改为mov,则byte [esi]会给出错误的参数错误和未定义的var错误。

1 个答案:

答案 0 :(得分:0)

byte是关键字,但您需要将其与ptr结合使用:

movzx eax, byte ptr [esi]  # clear EAX and load the byte into its lowest eight bits

您的模拟器无需支持movzx。然后,或者,您可以分两步执行movzx所做的事情:

xor eax,eax                # clear EAX
mov al, byte ptr [esi]     # load the byte into EAX's lowest eight bits