Linux 内存地址为何是从 0x7c00 开始 All In One
Linux 内存地址为何是从 0x7c00
开始 All In One
assembly language
.asm
https://en.wikipedia.org/wiki/Assembly_language
https://zh.wikipedia.org/wiki/汇编语言
汇编语言(第4版) 王爽
https://www.worldcat.org/zh-cn/formats-editions/910380574
http://www.tup.tsinghua.edu.cn/wap/tsxqy.aspx?id=07970801
汇编语言
=> 编译器
=> 机器码
汇编指令、伪指令、助记符、运算符号
pdf 安全:DOM 蒙层 & js 禁用复制
https://wqbook.wqxuetang.com/deep/read/pdf?bid=3213288
汇编语言
教程
/**
*
* @author xgqfrms
* @license MIT
* @copyright xgqfrms
* @created 2023-01-30
* @modified
*
* @description C 语言 & 汇编语言
* @difficulty Easy
* @complexity O(n)
* @augments
* @example
*
* @link https://www.cnblogs.com/xgqfrms/p/17074352.html
* @link https://www.ruanyifeng.com/blog/2018/01/assembly-language-primer.html
*
* @solutions
*
*/
#include <stdio.h>
int add(int a, int b) {
return a + b;
}
int main() {
// printf("Hello, World!\n");
// printf("Hello, Assembly Language!\n");
int sum = add(1, 2);
printf("sum = %i", sum);
// fix: `sum = 3%` bug ❌
printf("\n");
return 0;
}
/*
$ gcc ./add.c
# 二合一
$ gcc ./add.c -o add.out && ./add.out
# sum = 3 ✅
*/
/*
# 使用 gcc 把 `C 语言`程序转换成`汇编语言`程序
$ gcc -S ./add.c
# 二合一
$ gcc -S ./add.c && ./add.s
*/
.section __TEXT,__text,regular,pure_instructions
.build_version macos, 13, 0 sdk_version 13, 1
.globl _add ## -- Begin function add
.p2align 4, 0x90
_add: ## @add
.cfi_startproc
## %bb.0:
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset %rbp, -16
movq %rsp, %rbp
.cfi_def_cfa_register %rbp
movl %edi, -4(%rbp)
movl %esi, -8(%rbp)
movl -4(%rbp), %eax
addl -8(%rbp), %eax
popq %rbp
retq
.cfi_endproc
## -- End function
.globl _main ## -- Begin function main
.p2align 4, 0x90
_main: ## @main
.cfi_startproc
## %bb.0:
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset %rbp, -16
movq %rsp, %rbp
.cfi_def_cfa_register %rbp
subq $16, %rsp
movl $0, -4(%rbp)
movl $1, %edi
movl $2, %esi
callq _add
movl %eax, -8(%rbp)
movl -8(%rbp), %esi
leaq L_.str(%rip), %rdi
movb $0, %al
callq _printf
leaq L_.str.1(%rip), %rdi
movb $0, %al
callq _printf
xorl %eax, %eax
addq $16, %rsp
popq %rbp
retq
.cfi_endproc
## -- End function
.section __TEXT,__cstring,cstring_literals
L_.str: ## @.str
.asciz "sum = %i"
L_.str.1: ## @.str.1
.asciz "\n"
.subsections_via_symbols
http://www.ruanyifeng.com/blog/2018/01/assembly-language-primer.html
- A 1000:0
- MOV AX,4E20
- ADD AX,1416
- MOV BX,2000
- ADD AX,BX
- MOV BX,AX
- ADD AX,BX
- MOV AX,001A
- MOV BX,0026
- ADD AL,BL
- ADD AH,BL
- ADD BH,AL
- MOV AH,0
- ADD AL,BL
- ADD AL,9C
https://www.cnblogs.com/chantmee/p/14386408.html
https://www.ibm.com/docs/en/zos/2.1.0?topic=introduction-assembler-language
http://www.ece.utep.edu/courses/web3376/Notes_files/ee3376-assembly.pdf
https://www.w3cschool.cn/assembly/
X86 and X86_64 Assembly
; * @copyright xgqfrms
; * @created 2023-01-30
; https://www.tutorialspoint.com/assembly_programming/assembly_basic_syntax.htm
;Syntax of Assembly Language Statements
;[label] mnemonic [operands] [;comment]
; INC COUNT ; Increment the memory variable COUNT
; MOV TOTAL, 48 ; Transfer the value 48 in the
; ; memory variable TOTAL
; ADD AH, BH ; Add the content of the
; ; BH register into the AH register
; AND MASK1, 128 ; Perform AND operation on the
; ; variable MASK1 and 128
; ADD MARKS, 10 ; Add 10 to the variable MARKS
; MOV AL, 10 ; Transfer the value 10 to the AL register
section .text
global _start ;must be declared for linker (ld)
_start: ;tells linker entry point
mov edx,len ;message length
mov ecx,msg ;message to write
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel
mov eax,1 ;system call number (sys_exit)
int 0x80 ;call kernel
section .data
msg db 'Hello, X86 Assembly!', 0xa ;string to be printed
len equ $ - msg ;length of the string
; assemble
; $ nasm -f elf hello.asm
; link
; $ ld -m elf_i386 -s -o hello hello.o
; execute
; $ ./hello
; X86 and X86_64 注释 `;`
ARM Assembly
@ * @copyright xgqfrms
@ * @created 2023-01-30
@ https://www.tutorialspoint.com/assembly_programming/assembly_basic_syntax.htm
@ Syntax of Assembly Language Statements
@ [label] mnemonic [operands] [;comment]
@ INC COUNT ; Increment the memory variable COUNT
@ MOV TOTAL, 48 ; Transfer the value 48 in the
@ ; memory variable TOTAL
@ ADD AH, BH ; Add the content of the
@ ; BH register into the AH register
@ AND MASK1, 128 ; Perform AND operation on the
@ ; variable MASK1 and 128
@ ADD MARKS, 10 ; Add 10 to the variable MARKS
@ MOV AL, 10 ; Transfer the value 10 to the AL register
section .text
global _start ;must be declared for linker (ld)
_start: ;tells linker entry point
mov edx,len ;message length
mov ecx,msg ;message to write
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel
mov eax,1 ;system call number (sys_exit)
int 0x80 ;call kernel
section .data
msg db 'Hello, ARM Assembly!', 0xa ;string to be printed
len equ $ - msg ;length of the string
@ assemble
@ $ nasm -f elf hello.asm
@ link
@ $ ld -m elf_i386 -s -o hello hello.o
@ execute
@ $ ./hello
@ ARM 注释 `@`
https://www.tutorialspoint.com/assembly_programming/index.htm
https://www.tutorialspoint.com/assembly_programming/assembly_basic_syntax.htm
Assembly REPL
https://www.tutorialspoint.com/compile_asm_online.php
NASM
https://github.com/netwide-assembler/nasm
WebAssembly Language
.wasm
//
const importObject = { imports: { imported_func: (arg) => console.log(arg) } };
WebAssembly.instantiateStreaming(fetch("simple.wasm"), importObject).then(
(obj) => obj.instance.exports.exported_func()
);
https://developer.mozilla.org/en-US/docs/WebAssembly
(🐞 反爬虫测试!打击盗版⚠️)如果你看到这个信息, 说明这是一篇剽窃的文章,请访问 https://www.cnblogs.com/xgqfrms/ 查看原创文章!
refs
Linux 0.11 源码趣读
https://time.geekbang.org/column/article/598506
https://time.geekbang.org/column/article/598511
为什么 X86
主引导
记录的内存地址
是0x7C00
?
http://www.ruanyifeng.com/blog/2015/09/0x7c00.html
https://www.glamenv-septzen.net/en/view/6
©xgqfrms 2012-2021
www.cnblogs.com/xgqfrms 发布文章使用:只允许注册用户才可以访问!
原创文章,版权所有©️xgqfrms, 禁止转载 🈲️,侵权必究⚠️!
本文首发于博客园,作者:xgqfrms,原文链接:https://www.cnblogs.com/xgqfrms/p/17074352.html
未经授权禁止转载,违者必究!