2016-12-13 5 views
-4

MASMコンパイラとDOSBOXを使用しています。私は変数からレジスタへの値を保存したいと思っています。私はCXレジスタにnum1の値を保存したい。どうやってやるの?変数からレジスタへの値を保存したい

 .MODEL SMALL 
.STACK 50H 
.DATA 
num1 db '5' 
    NL DB 0DH, 0AH, '$'   
    msg  db ?,0AH,0DH,"Enter an odd number between 0 to 10:$" 
    nxtline db 0Ah,0DH,"$" 
.CODE 
MAIN PROC 
    MOV AX, @DATA 
    MOV DS, AX 



       LEA DX,msg  
       mov ah,9 
       int 21H 
       LEA DX,nxtline  
       mov ah,9 
       int 21H 

       MOV AH,1      
       INT 21H 
       LEA DX,nxtline  
       mov ah,9 
       int 21H 



     mov bl,al ;save the value from input 
       mov num1,bl 
       LEA DX,num1  
       mov ah,9 
       int 21H 
       mov cl,al 

    main endp 
    end main 
+0

入力を取り、CXにその値を割り当てますレジスタ – anila

+0

どうすればいいですか? – anila

+0

YEs私はちょうどmovのblにあるユーザーから価値を取ってみたい、今私はCXのレジスタにその値をasignにしたいどのように私はそれを行うことができますか? – anila

答えて

2

ユーザーが入力した値がALで失われています。これであなたは、入力1つの文字:

  MOV AH,1      
      INT 21H 

文字がALに保存されていますが、BLに値を保存する前に改行表示されていますので、なくなって

  LEA DX,nxtline  
      mov ah,9 
      int 21H 

そしてALの値をこの割り込みはALを使用して文字列を表示します。 CXに移動値:

  MOV AH,1      
      INT 21H 
    mov bl,al ;save the value from input 
      LEA DX,nxtline  
      mov ah,9 
      int 21H 

編集:解決策は、あなたが改行を表示BLに値を保存することです

xor cx,cx  ;CLEAR CX. 
mov cl,bl  ;MOVE CHAR INTO CL. 
sub cl, 48  ;CONVERT CHAR TO DIGIT, EXAMPLE: '5' -> 5. 
+0

@jozeどうすればこの問題を解決できますか?私はちょうどユーザーからの価値を取って、番号であるcxレジスタに保存したいと思います。 – anila

+0

num1変数値の@ jozeが格納されています。私はちょうどcxレジスタにその値をmovにしたいのですが、どうすればいいですか? – anila

1

ところで:あなたが投稿そのソースは、(num1が定義されていない)にコンパイルすることはできません。

使用できるレジスタにメモリから値をロードするために一般的に

mov reg8|16|32|64,[<memory_address>] 

例:

num1: db 7 

アセンブラが値7を含む単一のバイトにこれをコンパイルし、それはノートを取りますシンボルテーブルにはそのバイトを指し示すラベルnum1が存在します。

num2: dw 0x0809 

これは2つのバイトとしてコンパイルされます09 08(番号の最下位部分がメモリに最初に移行し、そう09num2がアドレスであり、08num2+1アドレスです)。 num2ラベルはシンボルテーブルに置かれ、定義されたワードの最初のバイト(値09)を指します。 16ビットにblから8ビット値をロードするために

mov bl,[num1] ; loads value 7 into bl 
mov cx,[num2] ; loads value 0x0809 (8*256+9 = 2057 in decimal) into cx 
mov al,[num2] ; loads value 9 into al 
mov ah,[num2+1] ; loads value 8 into ah = now ax contains 2057. (ax = ah:al) 
mov dx,[num1] ; will load dl with 7, and dh with something what is after it 
    ; if you wanted "num1", then this is bug, as "num1" is only 1 byte "wide" 
    ; and dx is 16 bit register, so it's two bytes wide. 

あなたはいくつかのオプションがありますが、すべては同じ原理に従って、あなたは「ワイド」16ビットであることを8ビットの値を拡張する必要がcx登録してください。

mov cl,bl ; set's lower 8 bits of cx to bl, doesn't care about upper 8 bits 
    ;^unless done on purpose, this is bug, as "cx" has unexpected value 

movzx cx,bl ; "zx" = zero-extend, value 0xFE (254) will become 0x00FE (254) 
    ; recommended way for 386+ code (does not exist on 8086-80286 CPUs) 

movsx cx,bl ; "sx" = sign-extend, so value 0xFE (-2) will become 0xFFFE (-2) 
    ; recommended way for 386+ code (does not exist on 8086-80286 CPUs) 

xor cx,cx ; cx = 0 
mov cl,bl ; same as first example, but ch was set to zero with previous ins. 
    ; recommended way for 8086 code 

mov ch,bl ; ch = bl, cl undefined 
sar cx,8 ; cx = sign extended bl to 16 bits (bl=0xFE will set cx=0xFFFE) 
    ; "recommended" way for 8086 code (not really, but who cares about 8086 anyway) 
    ; for al -> ax sign extension there's specialized CBW instruction 


mov cl,bl  ; cl = bl, ch undefined 
and cx,0x00FF ; AND with 0x00FF will clear ch, and keep cl 
    ; not recommended (slower), just example that any valid math works of course 

これらの作品を確認するには、デバッガでコードを起動し、各命令をステップオーバーの後に変更するレジスタの値を見て


あなたの更新された質問は「x86アセンブラの番号の表示方法」です。

https://stackoverflow.com/tags/x86/infoを参照してください。「どのように複数桁の数字を処理しますか?」を検索します。

しかし、最初はASCIIとは何か、またコンピュータの「文字列」はどのように検索され、どのようにレジスタの数値と異なるのかを調べるべきでしょう。

ほとんどのプラットフォーム(DOSでも)では、mov cx,1234を実行し、単一命令で画面上に文字列 "1234"として表示することはできません。いくつかのメモリバッファー(1633b数値のcxから)に5文字のASCII文字列を作成する必要があります。int 21h,9を使用してその文字列を表示することができます。

+0

@ ped m .dataでnum1 db '5'を使用しているのは正しいですか? – anila

+0

@anilaこれは、値 '0x35'(hexa)== '53'の10進数で1バイト==' 0011 0101'バイナリ==数字文字 '' 5''のASCIIコードとしてコンパイルします。それが正しいかどうか?そのバイトに値53が必要かどうかによって異なります。それは数字ではありません。 ''5 '+' 5 '=' j''! 53 + 53 = 106なので、106は '' j ''のASCIIコードです。あなたは、計算したい値を明確にしておくべきです。あなたがASCII文字列を計算したいのであれば、 '' 5''はおそらくあなたが望むものです。数字が必要な場合は、「5」が必要です。数字をASCII文字列として表示したい場合は、数値を文字列に変換するコードを書く必要があります(Cの 'printf') – Ped7g

+0

@anilaあなたの質問から、混乱しているように見えます。私はスクリーンに何かを印刷するのをやめ、デバッガを使って値をレジスタで見て、まずそのような少数の命令を学び、数値を操作し、デバッガで見ています。次に、10バイトのメモリをゼロに設定するなどの小さなタスクをいくつか実行します。 ASCII。その後、x86/info linkのnumber-to-stringフォーマット関数を見てみましょう。 – Ped7g

関連する問題