【问题标题】:Basics of Assembly Programming in NASMNASM 中的汇编编程基础
【发布时间】:2018-09-08 14:28:19
【问题描述】:

我是汇编编程的初学者,想澄清我在解释这段代码时引起的一些疑问

%macro print 2
    mov rax,1
    mov rdi,1
    mov rsi,%1
    mov rdx,%2
    syscall
%endmacro   
%macro exit 0
    mov rax,60
    mov rdi,0
    syscall
%endmacro
%macro accept 2
    mov rax,0
    mov rdi,0
    mov rsi,%1
    mov rdx,%2
    syscall
%endmacro
section .data

    a dw 123AH



section .bss
    b resb 2;       
    buff resb 2;

section .code
global _start
_start:
    accept b,2
    mov rsi,a           ;3
    mov rbx,[rsi]           ;6
    call hextoascii
    mov rsi,buff
    exit
hextoascii:
    mov rcx,4
    mov rsi,buff
    back:
        rol bx,4
        mov al,bl
        and al,0Fh
        cmp al,09H
        jbe add30h
        add al,7h
        add30h:
            add al,30h
        mov [rsi],al
        inc rsi         ;4
    loop back
    print buff,2            ;7


ret

我有几个问题要问:

  1. 以下两者在内存中的存储或任何其他方面是否有任何区别 a) 一个 resb 2 b) 回复 1
  2. 如果我接受来自用户的变量,那么我必须为按下的“Enter”键保留另一个字节。是这样吗 ?如果是,那么“Enter”的ascii值是否会被连接为变量的最后一个字节?
  3. 指令:mov rsi,a (a=1234H) rsi 指向“a”的哪个内存位置?即——它存储的是4的地址还是1的地址。

  4. 如果我增加 rsi 那么它会指向变量 a 的下一个数字吗?我该如何解释代码最后第四行中的“inc rsi”? 假设 rsi 当前指向 "a" 的基地址,它会增加多少位置?增量是否取决于它指向的变量的大小?

  5. 'a' 是如何出现在内存中的?即- 相对于其他数字,1 出现在最低地址还是出现在最高地址?

  6. 在指令中:mov rbx,[rsi] 有多少 'a' 进入 rbx 以及 rbx 可以存储在其中的 'a' 的最大限制是多少?

  7. 在指令中:打印 buff,4 它只打印 'a' (12) 值的一半,而不是完全打印 '1234'。我已经读过 print 宏的第二个参数应该是变量的大小(这里是 'buff')但是由于 buff 的大小是 2 个字节,它只是打印一半而不是完全。相反,如果我将 2 替换为 4,则会打印完整的“1234”。这里的大小是什么意思?是不是。字节或其他东西?

【问题讨论】:

  • 第 4 部分是您之前从另一个同名帐户发布的问题的副本。 stackoverflow.com/questions/49541502/…inc rsi 将 64 位整数值加 1。当用作指针时,它始终表示下一个字节,不管其他任何内容。
  • 啊,重复帐户...
  • @Jacob:使用调试器(如 GDB)单步执行代码,并执行 print /x *(char*)$rsi(或 x /xbc $rsi)之类的操作来检查内存中的字节以查看 RSI 是什么指向。您可以通过一些实验自己回答大部分问题。
  • 好吧,我不知道变量存储值的方式(小端序),这让我非常困惑,以至于我不得不就新代码提出问题!我无法使用该帐户发布新问题!

标签: assembly nasm


【解决方案1】:
  1. 没有。
  2. 是的。
  3. x86 是小端,所以第一个字节是最低有效字节,即34h
  4. 不,十六进制数字是 4 位(半个字节)。您只能指向字节。 inc rsi 递增 1,当用作地址时为 1 个字节。
  5. 参见上面的第 3 点。
  6. 由于您正在加载到 rbx 这是一个 64 位寄存器,这就是您将获得的数量。
  7. 要打印的文本的长度。代码被破坏了,因为它将 4 个字节写入 2 个字节的缓冲区。

【讨论】:

  • 在 3. 什么是 34h,因为 'a' 是 123AH ?当我打印“buff”时,会打印前 2 个字节,而不是最后 2 个字节。即打印 MSB 的 12 而不是 34。
  • hextoascii 以大端(人类可读)格式打印。 cpu 以 little endian 存储二进制数据。
  • 1) 您没有回答上述评论中提到的 34 小时。 2)您的意思是 buff 将结果存储为 A321 并将其打印为 123AH 3)我仍然没有得到 rsi 指向什么?如果我使用循环首先将 rsi 指向变量“a”,然后将其递增以同时打印变量,那么这个打印的顺序是什么?
  • 在您的问题中,您声称 a=1234H。我在代码中看到它实际上是123AH。我用1234。不,buff 已经存储了要打印的文本。只有a 存储字节3A, 1234, 12
  • rbx中123A的存储顺序是不是相反?即 - rbx 是否以简单的方式存储它 bcz 每次旋转都会给我最后的最高数字?你能给我每个循环中 buff 和 rbx 的值,以及每个循环中 rsi 指向 buff 的位置吗?为什么 'a' 遵循小端而不是 buff ?你能给我任何资源来弄清楚这是如何工作的吗?
猜你喜欢
  • 1970-01-01
  • 2018-09-22
  • 1970-01-01
  • 2014-01-03
  • 1970-01-01
  • 1970-01-01
  • 2010-10-07
  • 2017-12-26
  • 1970-01-01
相关资源
最近更新 更多