-1

だから私はコードのこの部分を持っています

    mov SI, 0002
    mov ah, INPUT[SI]
    INC SI
    mov al, INPUT[SI]
    sub AX, 3030h
    aad
    inc al
    cmp byte ptr INPUT[0002], 39h
    jne OTHER



OTHER: aam
       add ax, 3030h
       mov INPUT[0003], al
       mov INPUT[0002], ah

ここで、入力はユーザー入力です。このコードが行うことは、3桁の数字をインクリメントするときに、私の問題である2桁の数字をインクリメントすることです。

例:入力:98出力:99

入力:99出力:110

望ましい結果:入力:99出力:100

4

2 に答える 2

0

inc次のようなコマンドを使用する必要があります: inc var、しかし、コードでこれを使用しても役に立たないようです。incうまくいかない場合は、add destination, source

それが役立つことを願っています。

于 2012-07-09T17:14:34.493 に答える
0

キャリーに関連するすべてのものをCPUに任せると、はるかに簡単になります。入力数値を整数に完全に変換し、インクリメントしてから文字列に変換して出力することをお勧めします。これについて考えてもらいたいので、C ライクな疑似コードを提供し、さらにヘルプが必要な場合はそれをアセンブリに変換するのを手伝います ;)

int nInput = 0;

// Converting to decimal
if( input[ 0 ] > '9' ) input[ 0 ] -= 'a' + 10;
else input[ 0 ] -= '0'
nInput += input[ 0 ];

if( input[ 1 ] > '9' ) input[ 1 ] -= 'a' + 10;
else input[ 1 ] -= '0'
nInput += input[ 1 ] * 16;

if( input[ 2 ] > '9' ) input[ 2 ] -= 'a' + 10;
else input[ 2 ] -= '0'
nInput += input[ 2 ] * 256;

if( input[ 3 ] > '9' ) input[ 3 ] -= 'a' + 10;
else input[ 3 ] -= '0'
nInput += input[ 3 ] * 4096;

// Incrementing :)
nInput += 1;

// Converting back to string
char output[ 5 ];

int digit = nInput & 15;
if( digit > 9 ) digit += 'a' + 10;
else digit += '0';
output[0] = digit;

digit = ( nInput & 255 ) / 16;
if( digit > 9 ) digit += 'a' + 10;
else digit += '0';
output[1] = digit;

digit = ( nInput & 4095 ) / 256
if( digit > 9 ) digit += 'a' + 10;
else digit += '0';
output[2] = digit;

digit = ( nInput & 65535 ) / 4096;
if( digit > 9 ) digit += 'a' + 10;
else digit += '0';
output[3] = digit;

output[4] = 0;

これは、アセンブリで実装する必要があるコードです。やみくもにやらないで、自分が何をしているのか、そしてその理由を考えてください。

ヒント:これらの掛け算や割り算はすべて避けることができます。割り算や掛け算を注意深く見てください :)

于 2012-07-09T18:28:57.953 に答える