小编Fif*_*nik的帖子

装配无限循环(jmp -2)

我听说使用jmp -2我们可以进行无限循环.这听起来很奇怪,但在解释相对跳转需要一个字节后,下一个指令地址(eip)将比jmp地址小2个字节.所以,我决定实现它,但我不能让它工作.
这是我的源代码:

SECTION .text

global main
main:
   push   ebp
   mov    esp, ebp
   jmp    0x-2
   leave
   ret
Run Code Online (Sandbox Code Playgroud)

并用它来编译:

nasm -f elf asmloop.asm -o objasmloop.o 

 ld -m elf_i386 -o execasmloop -e main objasmloop.o  

我也尝试使用-2(FE)的十六进制值,但仍然得到分段错误.毕竟,我看了一下GDB的反汇编:

Dump of assembler code for function main:
   0x08048060 <+0>: push   %ebp
   0x08048061 <+1>: mov    %ebp,%esp
   0x08048063 <+3>: jmp    0xfffffffe
   0x08048068 <+8>: leave  
   0x08048069 <+9>: ret  
Run Code Online (Sandbox Code Playgroud)

我能够在这个转储上看到jmp地址和离开地址之间的实际差异实际上是5个字节(它不使用短引用jmp).但我尝试了这个,结果是相同的(分段错误).我怎样才能执行这种无限循环?

assembly nasm infinite-loop

1
推荐指数
1
解决办法
4631
查看次数

对于X86_64 linux的程序集中标签的使用感到困惑:我们为什么要编写mov [digit],al,而不是mov digit,al?

这是我的代码:

section .data
    digit db 0,10

section .text
    global  _start
_start:

    call _printRAXDigit

    mov rax, 60
    mov rdx, 0
    syscall


_printRAXDigit:
    add rax, 48
    mov [digit], al

    mov rax, 1
    mov rdi, 1
    mov rsi, digit
    mov rdx, 2
    syscall
    ret
Run Code Online (Sandbox Code Playgroud)

我有一个关于之间的差异问题[digit]digit.

我已经知道标签(如代码中的数字)代表数据的内存地址,而运算符"[]"就像取消引用指针一样,因此它会将标签指向的值加载到目标.

例如,mov rax, [digit] 将0抛出到rax寄存器,因为数字指向数据的第一个元素(在本例中为整数0).

但是,在我的代码中,它在我写入时起作用mov [digit], al,这意味着"将存储的值加载al到内存地址数字 ",但我不知道为什么在这种情况下我们应该使用"[]".第一个参数mov必须是目的地(如寄存器或内存地址),所以我认为它应该是mov digit, al而不是mov [digit], al.对我来说,为什么我们使用一个值从另一个地方获取值而不是使用内存地址来获取值是没有意义的.

这就是我的全部问题.请给我任何关于我的想法错误或对我的标签概念的任何更正的回应.

linux x86 assembly nasm

1
推荐指数
1
解决办法
313
查看次数

英特尔80386上的后递增和预递减寻址模式

我知道这些模式如何在其他处理器上工作,我不明白为什么80386不需要后递增和预递减寻址模式?

这些寻址模式pushpop指令之间的关系是什么?

x86 assembly intel addressing-mode

1
推荐指数
1
解决办法
471
查看次数

我对A20线校验码的理解是否正确?

我正在按照本教程了解如何检查和启用 A20 线路。我想我明白了,但是有人可以帮我澄清一下吗?

该教程中已有的评论开始; <comment>
我的评论开始;<comment>

; The following code is public domain licensed

[bits 16]

; Function: check_a20
;
; Purpose: to check the status of the a20 line in a completely self-contained state-preserving way.
;          The function can be modified as necessary by removing push's at the beginning and their
;          respective pop's at the end if complete self-containment is not required.
;
; Returns: 0 in ax if the a20 line is …
Run Code Online (Sandbox Code Playgroud)

assembly bootloader x86-16

1
推荐指数
1
解决办法
315
查看次数

在此代码中添加BX,2的目的是什么?

我试图理解此递归代码,但对的目的感到困惑add bx, 2。我已经在相关行上打上了标记。据我了解,我们必须用值增加指向数组的指针,但是为什么我们要加2而不是1?

    .model small
    .stack 100
    .data
     arr dw 38, 39, 90, 94, 13, 24, 53, 59, 63
     size dw 9
     result dw ?
    .code
    func proc
     push bp
     mov bp, sp
     push ax
     push bx
     push cx
     push dx
     mov cx, [bp+4]
     mov bx, [bp+6]
     mov ax, [bx]
     cmp cx, 1
     ja more
     mov [bp+6], ax
     jmp done
    more:

     **add bx, 2**

     push bx
     dec cx
     push cx
     call func
     pop dx
     cmp dx, ax
     jg …
Run Code Online (Sandbox Code Playgroud)

arrays recursion assembly x86-16

1
推荐指数
1
解决办法
111
查看次数

错误:"操作数类型不正确"

这是一个8086汇编程序,用于将8位十进制数转换为十六进制数.
在第14行,为什么我会收到下一个错误?

不正确的操作数类型

.model small
.data
d1 DB 81d
d1 DB 16d
res DB ?
.code
mov ax,@data
mov ds,ax
xor ax,ax
xor bx,bx
mov al,d1
mov bl,d2
div bl
ror ah,4   ;Error occurs here
add ah,al
mov ax,res
int 3h
align 16
End
Run Code Online (Sandbox Code Playgroud)

assembly x86-16

0
推荐指数
1
解决办法
741
查看次数