int c;我的锅,把指针递出去了,看看
while ((c = getchar()) != EOF) {
code.append((const char *) &c);
}
<< 操作符能不能用...接下来要写解析器逻辑,因为表达式都是毕竟简单的格式
因为我对 C++ 和结合实在是可以说几乎一无所知,所以暂时不做运算符优先级了,以后慢慢思考
表达式都是这样的
编译出来是这个样子(1 + 1 为例)
因为我对 C++ 和结合实在是可以说几乎一无所知,所以暂时不做运算符优先级了,以后慢慢思考
表达式都是这样的
1 + 1 * 2 / 32 * 233编译出来是这个样子(1 + 1 为例)
duangsuse::Echo
我还以为 8085 按道理应该是 8086 的近亲呢... 没想到指令数目比 8086 少那么多,连除法都要用户做....
现在才知道它是 8-bit 可以说是相当低端的处理器了... 😶
hello.S
... 虽然还有一点小问题,比如不知道为何字符串指针减少一位后才能不 SegFault 否则 会在 main 的 ret 治疗执行时无法正常跳转
和每次执行时 Zsh 都会吐出一个不知名符号出来外,通宵血赚,鸽子不亏 😶
.section .rodataMakefile
hello_world: .string "你好,世界!\n"
.section .text
.globl _start
_start:
call main # call assembly main
mov $60, %rax # sys_exit
mov $0, %rdi # exit status
syscall # make call
sysprintf:
mov %rsp, %rbp # stdcall
mov $1, %rax # sys_write
mov $1, %rdi # use stdout
pop %rsi # string ptr
pop %rdx # length
syscall
ret
main:
mov %rsp, %rbp
mov $hello_world, %rax
dec %rax
push %rax
push $20
call sysprintf
ret
hello: hello.S执行时
as hello.S -o hello.o
ld -o hello hello.o -lc -I /usr/lib64/ld-2*.so
clean:
rm -f hello hello.o
.PHONY: clean
[DuangSUSE@duangsuse asm-foo]$ ldd hello
linux-vdso.so.1 (0x00007fffe01b7000)
libc.so.6 => /lib64/libc.so.6 (0x00007f9e9e68c000)
/usr/lib64/ld-2.27.so => /lib64/ld-linux-x86-64.so.2 (0x00007f9e9ea4b000)
hello: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /usr/lib64/ld-2.27.so, not stripped
9: 0000000000000000 0 FILE LOCAL DEFAULT ABS hello.o
10: 000000000040021c 0 NOTYPE LOCAL DEFAULT 6 hello_world
11: 0000000000400206 0 NOTYPE LOCAL DEFAULT 5 main
12: 00000000004001f0 0 NOTYPE LOCAL DEFAULT 5 sysprintf
[DuangSUSE@duangsuse asm-foo]$ ./hello
�你好,世界!
... 虽然还有一点小问题,比如不知道为何字符串指针减少一位后才能不 SegFault 否则 会在 main 的 ret 治疗执行时无法正常跳转
和每次执行时 Zsh 都会吐出一个不知名符号出来外,通宵血赚,鸽子不亏 😶