如何在C中定義的匯編中增加值?

我想結合c和匯編代碼。

我有以下C代碼:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

extern void _increment(unsigned short *x);

int main(int argc, char** argv)
{
    unsigned short x = 0;
    _increment(&x);
    printf("%d", x)
    return 0;
}

以及組件(32位NASM)代碼:

section .text

global _increment

_increment: 
    push ebx        

        mov bx, word [esp+8]    ;what is stored in bx here? the x address? 
        mov ax, [bx]            ;what is stored in ax here? the x value?

        ;add word [esp+8], 1 -> dosnt work 

        pop ebx             
        ret

section .data

如果執行此操作,則會出現分段錯誤。有人能解釋寄存器/堆棧中存儲的內容嗎?也許我可以增加值而不是X的地址?

? 最佳回答:

很明顯,您了解指針的工作原理,唯一的錯誤是指針本身的大小。在幾乎所有的CPU上,指針的大小(而不是它指向的對象的大小)將等于指令指針寄存器的大小(通常稱為PC,用于non-x8 6 architectures.上的程序計數器)。這一規則有例外,但通常它只會匹配硬件的默認寄存器大小。這就是為什么,正如您在評論中提到的,您只加載了一半的指針,因為您使用了bx作為從堆棧加載的目標。在x86中,不在括號中的寄存器操作數決定了要讀/寫內存的字節數。這就是為什么在執行mov bx, word [esp+8]時,即使esp是32-bit,而bx是16-bit,也不會因為操作數大小不匹配而出現匯編錯誤;右操作數是16-bit內存,而不是32-bit寄存器。

主站蜘蛛池模板: 国产一区二区精品尤物| 久久国产精品亚洲一区二区| 久久精品国产亚洲一区二区| 国产在线一区二区综合免费视频| 国产精品无码一区二区在线观 | 久久精品亚洲一区二区| 国产一区二区三区小向美奈子 | 久久精品国产一区二区三| 亚洲免费视频一区二区三区| 国产福利无码一区在线| 一区二区亚洲精品精华液| 日韩好片一区二区在线看| 无码免费一区二区三区免费播放| 精品视频一区二区| 一级毛片完整版免费播放一区| 鲁丝丝国产一区二区| 无码中文人妻在线一区二区三区| 亚洲天堂一区在线| AV无码精品一区二区三区| 2022年亚洲午夜一区二区福利 | 蜜桃视频一区二区| 八戒久久精品一区二区三区 | 精品一区二区三区免费视频| 三级韩国一区久久二区综合| 国产亚洲福利一区二区免费看 | AV天堂午夜精品一区| 久久精品国产一区二区三区不卡| 国产精品免费一区二区三区| 一区二区在线视频观看| 精品视频在线观看你懂的一区 | 国产无码一区二区在线| 肥臀熟女一区二区三区 | 无码人妻久久一区二区三区蜜桃 | 福利片福利一区二区三区| 一区二区高清在线观看| 国产亚洲自拍一区| 亚洲av无码一区二区三区天堂古代| 3d动漫精品成人一区二区三| 精品国产一区二区三区久| 亚洲高清成人一区二区三区| 中文字幕VA一区二区三区|