【问题标题】:How to find commands addresses?如何找到命令地址?
【发布时间】:2019-02-13 13:56:07
【问题描述】:

我是汇编编程的初学者,我遇到了这个问题的一些问题。所以下面命令的地址是由CS:IP registers 的内容定义的。如果CS 等于 0750h 并且IP 是 047Bh 查找所有命令的地址。假设所有命令的大小为 3 个字节。

我发现地址等于segment * 10h + offset。这意味着 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

【问题讨论】:

  • 是的,应该没问题。
  • @Jester 即使我有跳转 3 字节添加到 797B?
  • 就术语而言,它们被称为指令,而不是命令。给定 CPU 支持的指令集合称为该 CPU 的指令集。每条指令都由汇编器翻译成机器语言,这是CPU实际在内存中解释的一个或多个字节,IP指向用于获取和执行。每条指令所需的字节数取决于指令和该指令具有的参数类型。这记录在 CPU 的指令集参考手册中。
  • 假设所有命令的大小都是 3 个字节。我认为您显示的代码中的所有指令都不是这样。例如,add al,ah 是一个 2 字节指令。请参阅本表第 26 页开始:Intel 8086 Microprocessor Data Sheet
  • @prl sub ah, 30h 指令也是 3 字节指令。

标签: assembly x86-16 instructions emu8086


【解决方案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

【讨论】:

    猜你喜欢
    • 2017-04-09
    • 2015-01-29
    • 2016-06-22
    • 2013-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-22
    相关资源
    最近更新 更多