2012-09-19 36 views
0

我不知道出了什么问题。我想输入WORD大小的字符串,并向输入的字符串值添加一个整数并重新打印结果。在算术运算中我并不确定,因为这是我第一次在单个程序中使用许多操作,并且它们都是16位。汇编:字符串输入(字大小)和重新打印

clr macro 
mov ax, 03h 
int 10h 
endm 

cseg segment para 'code' 
assume cs:cseg; ds:cseg; ss:cseg; es:cseg 
org 100h 

start: jmp begin 

amount_s label word 
amount_max dw 3 
amount_length dw ? 
amount_field dw 3 dup (?) 

x1 dw 0 
x2 dw 0 

sum1 dw 0 
sum2 dw 0 

bal dw 10 

begin: clr 

mov ah, 0Ah  ;input string 
lea dx, amount_s 
mov cx, amount_length 
lea si, amount_field 
int 21h 

mov ax, [si]  ;copy si to ax 
sub ax, 30h  ;converts value of ax to integer 
mov bx, 10  ;copy 10 to bx  
mul bx   ;multiply it ax by bx 
mov x1, ax  ; copy ax to x1 
inc si   ;move si pointer by 1 

mov ax, [si]  ;copy si to ax 
sub ax, 30h  ;converts value of ax to integer 
mov x2, ax  ; copy ax to x2 

add ax, x1  ;add ax which is x2 by x1 
add ax, bal  ; add ax by bal which is 10 
mov sum1, ax  ;copy the result to sum1 

mov dx, 0  ; copy 0 to dx 
mov bx, 10  ; copy 10 to bx 
div bx   ;divides ax by bx 
mov sum1, ax  ; copy quotient to sum1 
mov sum2, dx  ; copy remainder to sum2 

add sum1, 30h  ;convert for printing 
add sum2, 30h  ;convert for printing 

mov ah, 02h  ;prints sum1 
mov dx, sum1 
int 21h 

mov ah, 02h  ;prints sum2 
mov dx, sum2 
int 21h 

int 20h 
cseg ends 
end start 

回答

2

如何调试和检查参考文档以查看出错和如何? :)

有一点我可以直接告诉,int 21h函数0ah使用的结构包含字节字段,而不是字段。

;但你可以声明为字(dw),而不是字节(db):

amount_max dw 3 
amount_length dw ? 
amount_field dw 3 dup (?) 

而且你不应该访问它们的话,你有做:

mov ax, [si] 

而是读取字节:

mov al, [si] 

如果要将字节值成字的值,只要坚持一个0到字寄存器的最高字节像这样:

mov ah, 0 

其余的看起来合理,但我还没有运行代码。你应该这样做。在调试器中,如果它不正确。

+0

哦。我不知道我使用的代码仅用于字节。感谢您的更正。当我回家后我会尝试它。 – shriekyphantom