乱码三千 – 分享实用IT技术

乱码三千 – 码出一个新世界


  • 首页

  • 归档

  • 搜索

8086语言之Loop

发表于 2020-12-11

LOOP指令

Loop指令和cx寄存器配合使用, 用于循环操作,类似于高级语言中的do while循环

使用格式

1
2
3
4
	mov cx,循环次数
标号:
循环执行的程序代码
loop 标号

标号的名称可以自定义

执行流程

  • 第一步:不管cx中值是否大于0, 先执行一遍循环体(因为程序还未执行到loop 标号位置时,程序不知道是个循环体, 当做正常流程代码执行)
  • 第二步: 执行到loop 标号位置,确认是个循环体后, 先将cx减1,也就是cx=cx-1
  • 第三步:减1后结果如果大于1,则重复执行循环体, 否则跳过循环体代码,继续执行loop 标号后面的代码

总结

因此,从代码层面上看cx的值代表了循环次数, 事实上只循环了cx-1次 只不过判断之前会先执行一遍循环体, 类似于do while

特殊案例

根据以上结论, 如果cx的值为0, 减1后为-1, 那程序会怎么执行呢?

答案是会进入死循环 , 8086cpu是16位 的会循环执行65535次

为什么?

因为-1在计算机里面对应的十六进制为FFFF, 二进制第一位为符号位

小练习

题目: 取出以下内存地址中的值并且相加取和

1
2
3
4
5
FFFF0H----->20h  #每个内存单元存放一个字节数据

FFFF1H----->ach

FFFF2H----->FFh

正常思维是使用八位寄存器取出对应地址的值,比如:

1
2
3
4
5
mov ax,ffffh
mov ds,ax
mov al,[0]
add al,[1]
add al,[2]

但是这里面存在一个问题, ach+ffh明显超出一个字节, 如果使用al寄存器接收势必数据保存不全,此时,需要再借助一个寄存器,代码修改后如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mov ax,ffffh
mov ds,ax
mov dx 0h ;确保数据为0 避免系统脏数据

mov al,[0]
mov ah,0h
add dx,ax

mov al,[1]
mov ah,0h
add dx,ax

mov al,[2]
mov ah,0h
add dx,ax

这种方式保证了数据超出后自动进位, 最后结合loop循环优化代码,如下:

1
2
3
4
5
6
7
8
9
10
mov ax,ffffh
mov ds,ax
mov dx 0h ;确保数据为0 避免系统脏数据
mov bx 0h
mov cx,3h
s: mov al,[bx]
mov ah,0h
add dx,ax
add,bx,1H
loop s

补充

获取数据, 除了通过ds来获取数据之外, 还可以利用其它段地址来获取, 比如:

1
2
3
4
mov ax,ds:[0]
mov ax,cs:[0]
mov ax,ss:[0]
mov ax,es:[0]

本文为作者原创 转载时请注明出处 谢谢

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

8086汇编学习之关于栈段相关知识

发表于 2020-12-09

Push和Pop

Push(入栈):是修改栈内的数据, 并且将sp指针往低地址偏移

Pop(出栈):是读取栈顶数据, 并且将sp指针往高地址偏移

注: Pop指令并未删除栈内原有的数据, 仅仅是读取而已

关于栈底指针位置

如果是一个空栈, 那么ss:sp指向栈空间最高地址单元的一个单元

数据宽度

在8086十六位CPU中, Push和Pop操作的数据都是两个字节的, 也就是说无论是

1
2
3
4
5
6
push ax ;将ax里数据写入栈顶 两个字节

pop ax ;读取栈顶数据赋值给ax 两个字节


pop al ;读取栈顶数据赋值给al 读取两个字节 al接收低八位数据

统统操作两个字节数据

如何执行smali代码

发表于 2020-12-08

java代码的执行需要编译成字节码文件然后借助java虚拟机JVM执行, 那么smali代码的执行同样需要借助虚拟机, 只不过是安卓虚拟机DalvikVM, 但是由于Dalvik虚拟机默认识别dex文件, 因此需要将smali文件封装成dex文件

1.创建smali文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
.class public LTest;
.super Ljava/lang/Object;

.method public constructor <init>()V
.registers 1


invoke-direct {p0}, Ljava/lang/Object;-><init>()V

return-void
.end method

.method public static main([Ljava/lang/String;)V
.registers 3


sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;

const-string v1, "Hello Pangshu!"

invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V

return-void
.end method

2.smali文件转dex(或者打包成Apk也一样)

1
java -jar smali-2.4.0.jar a smali文件或目录 -o 输出目录/xxx.dex

3.将dex传至android设备中(真机或者模拟器)

1
adb push test.dex /sdcard/

4.调用Dalvik VM执行代码

1
2
3
adb shell

dalvikvm -cp /sdcard/test.dex Test

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

汇编学习之大小端模式

发表于 2020-12-07

作用

概念

  • 大端模式: 是指数据的高字节保存在内存中的低地址中, 而数据的低字节保存在内存的高地址中(高低/低高)(Big Endian)
  • 小端模式: 是指数据的高字节保存在内存中的高地址中, 而数据的低字节保存在内存的低地址中(高高/低低)(Little Endian)

ARM既可以工作在大端,也可工作在小端模式

8086学习之关于数据段的取值和赋值

发表于 2020-12-07

前言

数据段存在的意义是为了告诉cpu, 该段物理地址存放的是数据而不是指令

那么既然里面存放的是数据, 势必会有取值和赋值

取值

将20001H物理地址中的数据取值然后填入通用寄存器中, 如下:

1
2
3
mov ax ,2000H
mov ds ,ax
mov ax,[1] #[1]等同于 2000H:1H

以上有几个关键的地方需要记忆

  • []内数字表示偏移地址, 默认将DS设为基地址
  • 必须先声明段地址 也就是必须先给ds赋值
  • 通用寄存器相当于临时变量ax,bx,cx,dx….. 任选 ,只要避免冲突即可

赋值

将BH中的数据赋值给数据物理地址20001H中, 如下:

1
2
3
4
mov bh,30H
mov ax ,2000H
mov ds ,ax
mov [1] ,bh

和取值类似, 反过来即可

注意

  1. 在代码段CS:IP中, cpu读取的内存地址宽度是更具代码所占的字节数据而定, 那么在数据段DS中,如何确定读取多少个字节的数据呢?

以取值代码为例:

1
2
3
mov ax ,2000H
mov ds ,ax
mov ax,[1]

如果物理地址和数据一一对应关系如下:

1
2
3
4
20001H----->23
20002H----->11
20003H----->53
20004H----->71

那么ax中的值是多少呢?

答案是1123 而不是23, 为什么?

这是根据寄存器容器大小决定的, 容器大装得多, 容器小装的小, 因为ax是16位容器,那么则获取16位也就是两个字节的数据,即1123, 如果是ah或者al接收的话则获取8位也就是一个字节的数据,即23

  1. mov 内存单元:内存单元是不允许的, 比如mov [0],[1]

8086学习之jump指令

发表于 2020-12-06

作用

用于更改CS:IP的值

由于在8086cpu中更改段寄存器CS和指针寄存器IP的值不能直接使用mov赋值, 比如:

1
2
3
mov CS,3000H

mov IP, 0001H

以上写法不允许

那么, 如果我们需要给其赋值时, 其中一种替代方案就是使用jump指令,比如:

1
jump 3000H:0001H # 跳转到该代码段物理地址

如果段地址保持不变, 只是更改偏移地址, 那么需要借助通用寄存器, 如下:

1
2
3
mov ax,0002H
jump 3000H:0001H
jump ax #等同于jump 3000H:0002H

则只需jump+保存偏移地址的寄存器 这种写法即可

注意不能直接jump 0002H 这样是不允许的

关于Git版本回退的几种方法

发表于 2020-11-17

如果已经commit 想要回退

版本回退

1
git reset --hard HEAD^   //一个^代表一个版本 如果回退两个版本那就HEAD^^ 以此类推

指定版本/版本穿梭

1
git reset --hard 8383f01   //一个^代表一个版本 如果回退两个版本那就HEAD^^ 以此类推

如果还没有commit

第一种 使用reset回退到当前版本初始状态

1
git reset --hard HEAD

第二种 使用checkout

1
2
git reset checkout . //放弃所有文件的修改
git reset checkout 指定相应文件

第三种 使用stash

1
git stash  //暂存当前修改的代码

第四种 使用revert重做

1
git revert -n 版本号

本文为作者原创 转载时请注明出处 谢谢

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

关于Git打标签Tag分支

发表于 2020-11-17

分支管理

查看当前标签

1
git tag

在本地代码仓库给项目打上一个标签

1
git tag -a v1.0 -m "version 1.0"

将标签推送到远程仓库

1
git push origin v1.0

检出v1.0标签

1
git checkout origin v1.0

从检出状态创建v1.0bugfix分支

1
git checkout -b bugfix1.0

查看远程分支

1
git branch -r

删除远程分支

1
git branch -r -d origin/bugfix1.0

本文为作者原创 转载时请注明出处 谢谢

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

python金融量化交易

发表于 2020-11-17

量化投资绝对是一个趋势

免费数据回测平台

  • 米筐 www.ricequant.com
  • 聚宽 https://www.joinquant.com/

相关代码

以米筐api为例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
 #需求: 获得市盈率大于50且小于65, 营业总收入前10的股票
# 每日调仓
def init(context):

# 沪深300
context.hs300_list=index_components("000300.XSHG")

# 在context中保存全局变量
context.s1 = "000001.XSHE"
# 实时打印日志
logger.info("RunInfo: {}".format(context.run_info))

# 开启定时器 按月调仓
# scheduler.run_monthly(getdata,tradingday=1)


def getdata(context, bar_dict):
# 在一号的时候 先执行before_trading 然后执行getdata定时任务方法 最后执行handle_bar
q=query( fundamentals.eod_derivative_indicator.pe_ratio,fundamentals.income_statement.revenue).filter(
fundamentals.eod_derivative_indicator.pe_ratio>50
).filter(
fundamentals.eod_derivative_indicator.pe_ratio>65

).order_by(
fundamentals.income_statement.revenue.desc()

).filter(
# 在指定的股票池当中选择
fundamentals.stockcode.in_(context.hs300_list)

).limit(10)
found=get_fundamentals(q)
# 格式化显示
logger.info(found.T)
# 将第一列股票代码 放候选表中
context.stock_list=found.T.index

# before_trading此函数会在每天策略交易开始前被调用,当天只会被调用一次
def before_trading(context):
# 选股 获得市盈率大于50且小于65, 营业总收入前10的股票
q=query( fundamentals.eod_derivative_indicator.pe_ratio,fundamentals.income_statement.revenue).filter(
fundamentals.eod_derivative_indicator.pe_ratio>50
).filter(
fundamentals.eod_derivative_indicator.pe_ratio>65

).order_by(
fundamentals.income_statement.revenue.desc()

).limit(10)
found=get_fundamentals(q)
# 格式化显示
logger.info(found.T)
# 将第一列股票代码 放候选表中
context.stock_list=found.T.index


# 你选择的证券的数据更新将会触发此段逻辑,例如日或分钟历史数据切片或者是实时数据切片更新
def handle_bar(context, bar_dict):
# 先判断仓位是否有股票 如果有,卖出不符合条件的股票
if len(context.portfolio.positions.keys())!=0:
for stock in context.portfolio.positions.keys():
if stock not in context.stock_list:
#如果持有的股票不在新股票池中, 卖出
order_target_percent(stock,0)
# 买入最新股票池中的10只股票 等比买入
for new_stock in context.stock_list:
order_target_percent(new_stock,1/len(context.stock_list))


# after_trading函数会在每天交易结束后被调用,当天只会被调用一次
def after_trading(context):
pass

本文为作者原创 转载时请注明出处 谢谢

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

短视频拍摄手法大致有哪些

发表于 2020-11-17

推

说明: 视频拍摄中常用的手法之一, 是指把手机或相机慢慢想拍摄主体推进, 常用于烘托氛围或者强调某个人/事/物

拉

说明: 是指把手机或者相机慢慢向后拉, 使拍摄主体在画面中慢慢变小, 常用于向观众张氏拍摄主体所处的环境

摇

说明: 是只拍摄者拍摄机位不懂(站在原地), 通过摇动手机臂带动手机/相机呈弧线运动

移

说明: 通常是指在水平方向, 按一定运动轨迹进行运动拍摄, 是一种侧面跟拍人物的表现手法

跟

说明: 通常是指在物体后方一直跟着拍摄主体进行拍摄

升

说明: 通常是指在手机由下往上进行拍摄, 这种拍摄方式是展现拍摄氛围的绝佳手段

降

说明: 通常是指在手机由上往下进行拍摄, 这种拍摄方式是拍摄光晕的首选

旋转

说明: 通常是指被拍摄物是圆形的中心点, 手机按一定半径围绕圆心点进行旋转

静

说明: 镜头固定 适合知识类型讲解的画面

本文为作者原创 转载时请注明出处 谢谢

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

1…303132…50

乱码三千

android程序员一枚,擅长java,kotlin,python,金融投资,欢迎交流~

491 日志
143 标签
RSS
© 2025 乱码三千
本站总访问量次
由 Hexo 强力驱动
|
主题 — NexT.Muse v5.1.4
0%