我正在尝试通过在C++中使用内联程序集来增加数字的值。我这样做的原因是为了练习我的“内联汇编”技能。
到目前为止,这就是我所做的:
void main()
{
int x;
cout << "Please enter a number ";
cin >> x;
cout << "The number you entered is: " << x << "\n";
foo(&x);
cout << "The new
在程序集中,可以将数据存储在寄存器或堆栈中。在任何给定的时刻,只能访问堆栈的顶部(对吗?)考虑以下C代码:
main(){
int x=2;
func();
}
func( int x ){
int i;
char a;
}
调用func()时,会将以下内容推入堆栈(考虑32位系统):
variable x (4 bytes, pushed by main)
<RETURN ADDRESS> (4 bytes pushed by main?)
<BASE POINTER> (4 bytes pushed by func())
varia
我有一个关于硬件内存布局的问题。
我目前正在读取设备的数据表。
它在其登记册清单中列出了所有数据的登记地址,以便通过I S.C或SPI进行通信(表39,第105页)。以下是前三个数字的摘录:
┌─────────┬─────────┬──────────────────────────────────┬─────────────────────────────────┐
│ Address │ Name │ Description │ Bit Length During Communication │
├─────────┼─────────┼─
当然,MOV“移动”(实际上是复制的)某物,但如何?它是将源的实际值放入目的地,还是放置某种地址。
当我在Jeff介绍的汇编书中看到他正在使用Linux的中断80h时,我就想到了这个问题:
mov eax,4 ; Specify sys_write call
mov ebx,1 ; Specify File Descriptor 1: Standard output
mov ecx,Buff ; Pass address of the character to write
mov edx,1 ; Pass number of chars to write
int 80h
我很想知道register存储说明符在C/C++中的行为。下面的程序在C++中是有效的,但是对于C,它是无效的。
int main()
{
register int i;
int* b = &i; // Valid in C++ but not in C
}
那么,我的问题I,,为什么C++允许地址运算符(&)进入寄存器变量?
P.S :我知道寄存器存储说明符在现代编译器中是不可取的。
我目前正在做gdb反汇编工作,以帮助我理解更多关于c程序的细节,所以我写了一个c程序:
#include <stdio.h>
void swap(int a, int b){
int temp = a;
a = b;
b = temp;
}
void main(){
int a = 1,b = 2;
swap(a, b);
}
我使用gdb并运行disass /m main来获取这些:
(gdb) disass /m main
Dump of assembler code for function m
如果有一个函数将指向struct的指针作为参数,并且该函数有一个循环,在每次迭代时都访问一个成员,如下所示:
int function_a(struct b *b)
{
// ... do something then
for(int i = 0; i < 500; ++i){
b->c->d[i] = value();
}
}
它每次都要从内存中检索c指向和d指向的位置吗?
现在考虑以下情况:
int function_a(struct b *b)
{
// ... do something then
float *f
我试着在汇编语言中做这个算术运算,但每次都得到错误的答案,不确定我应该如何准确地做它 这些问题来自教科书,我确实有答案,但我试图理解如何得到答案。 The link contains the image which has question and my work as shown below Address | value || register value
0x100 0xFF || %rax 0x100
0x108 0xAB || %rcx 0x1
0xll0 0x13 || %rdx 0x3
0
我有一个汇编器/C的问题。我刚读到有关段前缀的内容,例如ds:varX等。前缀对于逻辑地址的计算很重要。我也读到了,默认值是"ds“,只要你使用ebp寄存器来计算地址,就会使用"ss”。对于代码"cs“是默认的。这一切都是有道理的。现在,我在c中有以下代码:
int x; // some static var in ds
void test(int *p){
...
*p =5;
}
... main(){
test(&x);
//now x is 5
}
如果您现在考虑一下test-function的实现...你得到堆栈上指向x的指针。如果你想取消对指