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
4

1 に答える 1

2

何がどのようにうまくいかないかを確認するために、参照ドキュメントをデバッグおよびチェックするのはどうですか?:)

私がはっきりと言えることの1つは、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

残りは妥当に見えますが、私はコードを実行していません。あなたはそれをしたほうがいい。デバッガーで、正しく機能していない場合。

于 2012-09-19T22:52:41.073 に答える