BTW: что источник вы вывесили, не может быть скомпилирован (num1
не определен).
В общем случае для загрузки значения из памяти в регистр можно использовать:
mov reg8|16|32|64,[<memory_address>]
Пример:
num1: db 7
Ассемблер будет компилировать это в один байт, содержащий значение 7
, и он будет принимать к сведению в таблицу символов, которая имеет метку num1
, указывая на этот байт.
num2: dw 0x0809
Это будет составлен в виде двух байт: 09 08
(не менее значительная часть числа идет сначала в память, так что 09
находится num2
адреса, 08
находится num2+1
адреса). Метка num2
помещается в таблицу символов, указывая на первый байт определенного слова (значение 09
).
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.
Чтобы загрузить 8 битное значение из bl
в 16-битный регистр cx
у вас есть несколько вариантов, но все по тому же принципу, вы должны продлить 8 битное значение, чтобы быть 16 бит «в ширину».
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». Вы должны сначала построить строку ASCII, содержащую пять символов 1234$
в некотором буфере памяти (из числового значения 16b в cx
), тогда вы можете использовать int 21h,9
для отображения этой строки.
хотите принять вход и присвоить это значение CX register – anila
Как я могу это сделать? – anila
YEs Я просто хочу получить значение от пользователя, который находится в mov bl, al Теперь я хочу присвоить это значение регистру CX, как я могу это сделать? – anila