NASM中汇编编程的基础知识

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NASM中汇编编程的基础知识相关的知识,希望对你有一定的参考价值。

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

%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)resw 1
  2. 如果我接受来自用户的变量,那么我必须为按下的“Enter”键保留另一个字节。是这样吗 ?如果是,则将“Enter”的ascii值连接为变量的最后一个字节?
  3. 指令:mov rsi,a(a = 1234H)rsi指向'a'的内存位置?即 - 它存储地址4或地址1。
  4. 如果我增加rsi那么它会指向变量a的下一个数字吗?如何在代码的第4行解释“inc rsi”?假设它当前指向“a”的基址,rsi会增加多少位置?并且增量是否取决于它指向的变量的大小?
  5. 记忆中如何呈现'a'? ie- 1是出现在最低地址还是出现在最高地址相对于其他数字?
  6. 在指令中:mov rbx,[rsi]有多少'a'进入rbx,rbx可以在其中存储的'a'的最大限制是多少?
  7. 在指令中:print buff,4它只打印'a'(12)的一半而不是'1234'的值。我已经读过打印宏的第二个参数应该是变量的大小(这里是'buff'),但由于buff的大小是2个字节,所以它只是打印一半而不是完全打印。相反,如果我将2替换为4,则打印完成'1234'。尺寸意味着什么?是不是。字节或其他东西?
答案
  1. 没有。
  2. 是。
  3. x86是小端,所以第一个字节是最低有效字节,即34h
  4. 不,十六进制数字是4位(半字节)。您只能指向字节。 inc rsi递增1,当用作地址时为1个字节。
  5. 见上文第3点。
  6. 由于您正在加载到64位寄存器的rbx,这就是您将获得多少。
  7. 要打印的文本的长度。代码被破坏是因为它将4个字节写入2字节的缓冲区。

以上是关于NASM中汇编编程的基础知识的主要内容,如果未能解决你的问题,请参考以下文章

IDA PRO中汇编结构体识别

IDA PRO中汇编结构体识别

IDA PRO中汇编结构体识别

Android 逆向arm 汇编 ( 使用 IDA 解析 arm 架构的动态库文件 | 使用 IDA 打开 arm 动态库文件 | 切换 IDA 中汇编代码显示样式 )

Android 逆向arm 汇编 ( 使用 IDA 解析 arm 架构的动态库文件 | 使用 IDA 打开 arm 动态库文件 | 切换 IDA 中汇编代码显示样式 )

通过查看Windbg中汇编指令及内存中的值去定位软件崩溃问题