asm
文章平均质量分 58
汇编语言相关内容。
源文雨
千载何方归梦,棹舟星河波开。
展开
-
C语言 intel架构处理器下利用gcc内联汇编 xlat 指令 实现转换1字节十六进制数字到十进制
最近发现英特尔处理器有一个从bx指向的内存索引一个字节替换到al的xlat指令,遂编写此简单的转换程序以作练习。由于一次只能查找一字节,而紧凑bcd码最大占用2字节,因此需要用xlat索引2次。原创 2022-10-02 18:48:07 · 625 阅读 · 0 评论 -
C语言 使用数组索引与指针索引 在循环中对编译器优化的影响及耗时分析
C语言在访问数组时既可以使用如a[i]这样的下标方式,也可以使用*(a+i)这样的指针方式,理论上完全等价。但是在编译器对循环作优化时,对于指针方式的索引很有可能分析不彻底,因此相比数组索引耗时有所增加数组索引耗时#include <stdio.h>#include <stdlib.h>#include <time.h>unsigned long get_start_ms() { struct timespec ts; clock_gett.原创 2021-11-11 13:24:02 · 2231 阅读 · 0 评论 -
C语言 64位内联汇编 使用syscall系统调用 打印字符串
在64位系统下,系统调用可以直接通过syscall汇编指令实现,参数依次放入rax,rsi,rdi,rdx,返回值放入rax,因此通过改变这些寄存器的值即可方便地进行系统调用。Linux下打印字符串在Linux中,打印字符串对应的系统调用号为0x1,其原型为ssize_t write (int fd, const void * buf, size_t count);我们把字符串打印到控制台,即stdout,其fd为1。具体代码如下// ssize_t write (int fd @rax=1, .原创 2021-10-24 14:28:49 · 1901 阅读 · 0 评论 -
C语言 x86_64处理器下利用gcc内联汇编实现打印char的二进制编码
由于汇编语言针对特定机器,因此给出大端/小端机器下的2种不同代码实现思路使用shlb依次移出每一位到CF使用setb将CF的值转移到cl将rcx左移/循环右移8位,视机器不同而不同重复上述操作8次64位小端机器char* chr2bin(uint8_t ch, char buf[8*sizeof(char) + 1]) { buf[8*sizeof(char)] = 0; uint64_t a; asm( "xorq %0, %0\n\t" .原创 2021-07-03 00:03:27 · 704 阅读 · 2 评论 -
利用 Ophis 编写 Commodore 64 programs PRG 程序(五)
在上一节中,我们理解了表达式和零页,接下来让我们一起来看看一些汇编代码与高级语言的对应关系:分支、循环与栈本节参考了Structured Programming、The stack、Procedures and register saving分支语句if else汇编语言一般使用相反的构造方式,即将if块中的代码紧跟在分支判断之后,若if条件成立则什么都不做,若不成立则直接跳过该块语句。分支语句一般使用bcc/bcs/beq/bmi/bne/bpl/bvc/bvs做各种标志位的判断。仅有if.原创 2021-03-29 23:11:21 · 273 阅读 · 0 评论 -
利用 Ophis 编写 Commodore 64 programs PRG 程序(四)
在上一节中,我们理解了字符映射与.data段的用法。接下来我们将看看另外两个好用的功能:表达式和零页本节参考了Expressions、Advanced Memory Segments表达式Ophis允许书写表达式,这些表达式将在汇编之前完成计算。全部可用运算符如下运算符含义[ ]相当于( ),因为圆括号另有含意< >取数的低8位/高8位* /乘除+ -加减& | ^按位与、或、非在介绍完零页之后,将在附录介绍一个表达.原创 2021-03-19 18:37:02 · 341 阅读 · 0 评论 -
利用 Ophis 编写 Commodore 64 programs PRG 程序(三)
在上一节中,我们理解了标签、别名、头文件/库以及宏定义的用法。接下来我们将看看另外两个好用的功能:字符映射与.data段本节参考了Character maps、Local variables and memory segments字符映射C64使用PETSCII(CBM ASCII)编码。不同于ASCII编码,其最显著的区别是,大小写字母相较于ASCII码是完全颠倒的。PETSCII - Wikipedia因此,Ophin提供了字符映射功能以解决该问题。我们可以使用.charma.原创 2021-03-18 22:08:37 · 796 阅读 · 0 评论 -
利用 Ophis 编写 Commodore 64 programs PRG 程序(二)
在上一节中,我们利用ophis实现了简单的hello world程序。接下来我们将进一步了解ophis的更多出色功能,它们能大大降低开发难度。本节参考了Labels and aliases、Headers, Libraries, and Macros标签汇编代码的标签必须要求唯一,因此随着程序长度的增加,起一个不冲突的标签将会愈发困难。Ophis提供了以下特性以解决该问题。1. 临时标签临时标签类似于C语言中函数中声明的临时变量,仅在一块语句中有效。int func() { int a; .原创 2021-03-18 13:59:59 · 432 阅读 · 0 评论 -
利用 Ophis 编写 Commodore 64 programs PRG 程序(一)
参考Producing Commodore 64 programs、Writing the actual code准备工作请配置好Ophis,MacOS配置方法可参考Mac OS 安装 Ophis了解PRG 程序文件结构了解汇编语言编写代码以输出HELLO, WORLD!为例,详见注释; test.oph.word $0801.org $0801 ; BASIC内存开始地址; BASIC部分 .word next, 10 ; 下一行与当前行号.原创 2021-03-17 19:21:40 · 385 阅读 · 1 评论 -
Commodore 64 programs PRG 程序文件结构分析
参考Programming with Ophis-Producing Commodore 64 programsPRG程序文件的前两个字节是一个小端序的数字,指向程序起始地址(不会拷贝入内存),接下来的所有内容将被拷贝到0x0800(2048)后的内存区域以供BASIC执行。而为了使该程序可被BASIC执行,PRG的入口地址应存放一条BASIC语句,用以加载后续汇编代码。因此PRG的开头一般如下位置 xx xx 01 02 03 04 05 06 07 08 09 0a 0.原创 2021-03-17 17:24:39 · 454 阅读 · 0 评论 -
Mac OS 安装 Ophis
详见Ophis官网下载代码前往Release页面下载Ophis-x.x.tgz,解压备用安装Lib将解压后文件夹中的lib/Ophis复制到/Library/Python/2.7/site-packages/Ophis安装命令将文件夹中的./ophis复制到/usr/local/bin测试终端输入ophis --help测试是否安装成功sistine:~ rumia$ ophis --helpUsage: ophis [options] srcfile [srcfile ...].原创 2021-03-17 13:38:26 · 253 阅读 · 0 评论 -
gcc对printf的优化
在printf输出的是一整行时,gcc将调用puts而不是printf。#include <stdio.h>int main(void){ printf("hello\n"); return 0;}对应汇编代码为然而,clang将仍然调用printf。...原创 2020-03-14 23:11:42 · 826 阅读 · 0 评论 -
从gcc生成的汇编代码看静态存储区变量与自动变量的区别(x64AT&T)
如果在临时存储区的数组或其他数据过多,超出了`rsp`的范围,则很有可能会出现诸如`segmentation fault`之类的错误。因此,有大量数据需要存储时,请使用静态变量。原创 2020-03-14 22:40:31 · 301 阅读 · 2 评论