Как найти адреса команд?
Я новичок в программировании на ассемблере, и у меня возникли некоторые проблемы с этой проблемой. Таким образом, адреса приведенных ниже команд определяются содержимым CS:IP
регистры. Если CS
равен 0750h и IP
047Bh найти все адреса команд. Дано, что все команды имеют размер 3 байта.
Я обнаружил, что адрес равен сегменту * 10h + смещение. Это означает 0750h * 10h + 047Bh = 797Bh. После этого, чтобы найти адрес каждой команды, я просто добавляю 3 к 797Bh? Я прав?
start:
mov ax, data
mov ds, ax
mov al,3Fh
mov ah,30h
cmp al,ah
jl p1
add ah,al
sub ah,30h
p1:
add al,ah
sub al,30h
mov ax, 4c00h
int 21h
ends
1 ответ
Дано, что все команды имеют размер 3 байта
Это конечно ложно. Посмотрите ниже, чтобы узнать.
CS:IP = 0750h:047Bh
соответствует линейному адресу 0000797Bh.
0000797B mov ax, data 3 bytes : opc + word immediate
0000797E mov ds, ax 2 bytes : opc + modr/m
00007980 mov al, 3Fh 2 bytes : opc + byte immediate
00007982 mov ah, 30h 2 bytes : opc + byte immediate
00007984 cmp al, ah 2 bytes : opc + modr/m
00007986 jl p1 2 bytes : opc + byte displacement
00007988 add ah, al 2 bytes : opc + modr/m
0000798A sub ah, 30h 3 bytes : opc + modr/m + byte immediate
p1:
0000798D add al, ah 2 bytes : opc + modr/m
0000798F sub al, 30h 2 bytes : opc + byte immediate
00007991 mov ax, 4c00h 3 bytes : opc + word immediate
00007994 int 21h 2 bytes : opc + byte immediate