我听说使用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).但我尝试了这个,结果是相同的(分段错误).我怎样才能执行这种无限循环?
这是我的代码:
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.对我来说,为什么我们使用一个值从另一个地方获取值而不是使用内存地址来获取值是没有意义的.
这就是我的全部问题.请给我任何关于我的想法错误或对我的标签概念的任何更正的回应.
我知道这些模式如何在其他处理器上工作,我不明白为什么80386不需要后递增和预递减寻址模式?
这些寻址模式push和pop指令之间的关系是什么?
我正在按照本教程了解如何检查和启用 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) 我试图理解此递归代码,但对的目的感到困惑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) 这是一个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)