Кстати: тот источник, который вы разместили, не может быть скомпилирован (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
для отображения этой строки.
person
Ped7g
schedule
13.12.2016
AL
содержит число со знаком, вы можете использоватьCBW; MOV CX,AX
. - person Weather Vane   schedule 13.12.2016