ところで:あなたが投稿そのソースは、(num1
が定義されていない)にコンパイルすることはできません。
使用できるレジスタにメモリから値をロードするために一般的に :
mov reg8|16|32|64,[<memory_address>]
例:
num1: db 7
アセンブラが値7
を含む単一のバイトにこれをコンパイルし、それはノートを取りますシンボルテーブルにはそのバイトを指し示すラベルnum1
が存在します。
num2: dw 0x0809
これは2つのバイトとしてコンパイルされます09 08
(番号の最下位部分がメモリに最初に移行し、そう09
num2
がアドレスであり、08
はnum2+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
を使用してその文字列を表示することができます。
入力を取り、CXにその値を割り当てますレジスタ – anila
どうすればいいですか? – anila
YEs私はちょうどmovのblにあるユーザーから価値を取ってみたい、今私はCXのレジスタにその値をasignにしたいどのように私はそれを行うことができますか? – anila