作为初学者和自学者,我正在学习集会,目前正在阅读由Allen Hollub撰写的The C Companion一书的第3章.我无法理解他在具有双字节字的假想演示机器中描述的程序计数器或PC的描述.以下是第57页的PC说明.
"PC始终保存当前正在执行的指令的地址.它会在执行每条指令时自动更新,以保存下一条要执行的指令的地址.......这里的重要概念是PC保存下一条指令的地址,而不是指令本身."
我无法理解保持当前地址和下一条指令的地址之间的区别.PC是否同时在两个连续的字节中保存两个地址?
我试图了解地址计算指令的工作原理,尤其是leaq命令.然后当我看到leaq用于进行算术运算的例子时,我感到困惑.例如,以下C代码,
long m12(long x) {
return x*12;
}
Run Code Online (Sandbox Code Playgroud)
在组装中
leaq (%rdi, %rdi, 2), %rax
salq $2, $rax
Run Code Online (Sandbox Code Playgroud)
如果我的理解是正确的,那么leaq应该移动任何(%rdi, %rdi, 2)应该2*%rdi+%rdi评估的地址%rax.我感到困惑的是,因为值x存储%rdi在内,这只是内存地址,为什么%rdi乘以3然后左移这个内存地址 2等于x乘以12?是不是当我们%rdi用3时,我们跳到另一个没有值x的内存地址?
如果我说'打电话'而不是跳?会怎么样?由于没有写入返回语句,控制权只是转移到下面的下一行,还是在调用后仍然返回到该行?
start:
mov $0, %eax
jmp two
one:
mov $1, %eax
two:
cmp %eax, $1
call one
mov $10, %eax
Run Code Online (Sandbox Code Playgroud) 这是我的C程序......我试图打印ESP,EBP和EIP.
#include <stdio.h>
int main() {
register int i asm("esp");
printf("%#010x <= $ESP\n", i);
int a = 1;
int b = 2;
char c[] = "A";
char d[] = "B";
printf("%p d = %s \n", &d, d);
printf("%p c = %s \n", &c, c);
printf("%p b = %d \n", &b, b);
printf("%p a = %d \n", &a, a);
register int j asm("ebp");
printf("%#010x <= $EBP\n", j);
//register int k asm("eip");
//printf("%#010x <= $EIP\n", k);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我没有ESP和EBP的问题.
user@linux:~# ./memoryAddress …Run Code Online (Sandbox Code Playgroud) 在我的16位程序中,GAS拒绝执行以下指令:
movw %ip, %dx
Run Code Online (Sandbox Code Playgroud)
我发现这很奇怪,因为移动段寄存器可以正常工作,例如:
movw %ss, %ax
Run Code Online (Sandbox Code Playgroud)
完整的错误消息是:
错误:错误的寄存器名称`%ip'
我的版本字符串是:
GNU汇编器(GNU Binutils)2.22
我想将CS(代码段)和IP(指令指针)地址存储到任何可用的寄存器AX,BX,CX或DX中.是否有可能以某种方式访问当前的CS或IP值?
我需要有关使用ASSEMBLY部件的C代码的帮助.GCC编译程序集有问题,错误:
$ make
gcc -Wall -g -std=c99 -pedantic -c -o sthread.o sthread.c
sthread.c: In function ‘sthread_create’:
sthread.c:159:57: warning: pointer of type ‘void *’ used in arithmetic [-Wpointer-arith]
t->context = __sthread_initialize_context(t->memory + DEFAULT_STACKSIZE, f, arg);
^
gcc -Wall -g -std=c99 -pedantic -c -o queue.o queue.c
as -g -o glue.o glue.s
glue.s: Assembler messages:
glue.s:32: Error: operand type mismatch for `push'
<wbudowane>: polecenia dla obiektu 'glue.o' nie powiod?y si?
make: *** [glue.o] B??d 1
Run Code Online (Sandbox Code Playgroud)
有问题的代码:
__sthread_switch:
# preserve CPU state on the …Run Code Online (Sandbox Code Playgroud) 我想知道我是否可以在8086汇编中操作(读取和更改值)指令指针(IP).
例如,
说IP当前正在存储0200h.我想读取这个值并将其更改为其他内容4020h.我怎么能这样做?