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