Помогите понять и устранить мою ошибку.
Вот код:
;...
rec record i1:1=1, i2:1=1, i3:1=0, i4:1=1, i5:1=0, i6:1=1, i7:1=0, i8:1=1
;...
.data
;...
.code
.startup
;...
mov ah, 0
mov al, b
;1101 0101
mov al, mask i3
; По плану, должно быть такое значение? или я не так понял.. .
; 0000 0000
;Далее вывод на экран
;...
Как работает mask? Я думал, он затирает все кроме поля в записи, в данном случае i3
В данной ситуации, на экран выводит 32
У этого числа двоичный код: 00100000
ОН заменил i3 на 1
Почему, что я не так сделал?
Мне нужно было, чтоб исправить эту проблему использовать команды сдвигов и and?
Помогите, пожалуйста понять, я хочу выучить и знать ассемблер хоть на начальном уровне.
Другие языки программирования и технологии
Assembler Запись / Record, Маска
mov al, b - не понятно, что такое b. Вероятно, переменная в сегменте данных.
>
;1101 0101
mov al, mask i3
; По плану, должно быть такое значение? или я не так понял.. .
; 0000 0000
Не совсем понятно, что к чему относится.
Унарная операция MASK создает маску на основе битового поля, в котором биты в возвращаемом значении устанавливаются в 1 и соответствуют битам в поле, которое представляет идентификатор.
Возможно, на примере будет понятнее:
.model small
rec record i1:2=11, i2:1=0, i3:1=1, i4:1=0, i5:1=1
.data
Flags rec ?
.code
Start:
mov ax, @data
mov ds, ax
mov al, mask i2 ; 00001000b - поле i2 расположено в 3-бите записи
mov ah, mask rec ; 00111111b - всего в записи используется 6 бит
mov bl, width i2 ; 1 - ширина поля i2 - 1 бит
mov bh, width rec ; 6 - ширина всей записи
mov dl, mask i1 ; 00110000b - маска для поля i1
mov dh, width i1 ; 2 - ширина поля i1
mov cl, rec ; 00111111b - это тоже маска всей записи
mov Flags, cl
mov ch, mask i4 ; 00000010b
and ch, Flags ; получили значение поля i4
mov ch, mask i4
not ch
and Flags, ch ; Сбросили поле i4 в 0
mov ch, mask i4
or Flags, ch ; установили поле i4 в 1
mov ah, 4Ch
int 21h
end Start
Посмотрите листинг, созданный ассемблером. В нём видно, какие маски загружаются в регистры.
В отладчике пройдите по шагам.
>
;1101 0101
mov al, mask i3
; По плану, должно быть такое значение? или я не так понял.. .
; 0000 0000
Не совсем понятно, что к чему относится.
Унарная операция MASK создает маску на основе битового поля, в котором биты в возвращаемом значении устанавливаются в 1 и соответствуют битам в поле, которое представляет идентификатор.
Возможно, на примере будет понятнее:
.model small
rec record i1:2=11, i2:1=0, i3:1=1, i4:1=0, i5:1=1
.data
Flags rec ?
.code
Start:
mov ax, @data
mov ds, ax
mov al, mask i2 ; 00001000b - поле i2 расположено в 3-бите записи
mov ah, mask rec ; 00111111b - всего в записи используется 6 бит
mov bl, width i2 ; 1 - ширина поля i2 - 1 бит
mov bh, width rec ; 6 - ширина всей записи
mov dl, mask i1 ; 00110000b - маска для поля i1
mov dh, width i1 ; 2 - ширина поля i1
mov cl, rec ; 00111111b - это тоже маска всей записи
mov Flags, cl
mov ch, mask i4 ; 00000010b
and ch, Flags ; получили значение поля i4
mov ch, mask i4
not ch
and Flags, ch ; Сбросили поле i4 в 0
mov ch, mask i4
or Flags, ch ; установили поле i4 в 1
mov ah, 4Ch
int 21h
end Start
Посмотрите листинг, созданный ассемблером. В нём видно, какие маски загружаются в регистры.
В отладчике пройдите по шагам.
Похожие вопросы
- Assembler или C для микроконтроллеров?
- Assembler помогите создать файлы *.obj *.exe
- какой язык легче выучить.C++ или Assembler? какой язык легче выучить.C++ или Assembler?
- Подскажите, правильно ли? assembler
- Assembler. HEEEEEEEEEEEEELP! дан одномерный массив найти количество и сумму нечетных элементов assembler
- Скажите мне истинные программисты, стоит ли изучать Assembler, если ты знаешь другие ЯП?
- Как написать программу для assembler (ассемблер)?
- Нужно ли учить assembler или лучше потратить время на изучение высокоуровневых языков?
- Delphi record to string
- Почему учетная запись администратор, но я не могу устанавливать игры, изменять тип учетной записи, ставить род. контроль