汇编的基础
原视频
基础篇:1.1编程环境的安装
打开DOSBox 0.74-3 Options.bat调整窗口大小
windowresolution=1200x640
output=ddraw
mount c D:\masm
c:
debug
DEBUG
用Debug的R命令查看、改变CPU寄存器的内容:
用Debug的D命令查看内存中的内容:
用Debug的E命令改写内存中的内容:
用Debug的U命令将内存中的机器指令翻译成汇编指令:
用Debug的T命令执行一条机器指令:
用Debug的A命令以汇编指令的格式在内存中写入一条机器指令。
mov,add,sub
mov ax,bx
ax=bx
add ax,bx
ax+=bx
sub ax,bx
ax-=bx
mul,div,and,or
mul乘法指令
因下面要用到,这里介绍一下mul指令,mul是乘法指令,使用mul做乘法的时候,
注意以下两点。
(1)两个相乘的数:两个相乘的数,要么都是8位,要么都是16位。如果是8位,一个默认放在AL中,另一个放在8位reg或内存字节单元中:如果是16位,一个默认在AX中,另一个放在16位reg或内存字单元中。
(2)结果:如果是8位乘法,结果默认放在AX中:如果是16位乘法,结果高位默认在DX中存放,低位在AX中放。mul bl
al*bl
结果在axmul bx
ax*bx
结果高位在DX 低位在AX
div除法指令
(I)除数:有8位和16位两种,在一个reg或内存单元中。
(2)被除数:默认放在AX或DX和AX中,如果除数为8位,被除数则为16位,
默认在AX中存放:如果除数为16位,被除数则为32位,在DX和AX中存放,DX存放高16位,AX存放低16位。
(3)结果:如果除数为8位,则AL存储除法操作的商,AH存储除法操作的余数:
如果除数为16位,则AX存储除法操作的商,DX存储除法操作的余数。div bl
ax/bl
结果ah为余数 al为商div bx
(dx*2^32+ax)/bx
结果dx为余数 ax为商
and or
(I)and指令:逻辑与指令,按位进行与运算。
例如指令:
mov al,01100011B
and al,00111011B
执行后:al=00100011B
(2)or指令:逻辑或指令,按位进行或运算。
例如指令:
mov al,01100011B
or al,00111011B
执行后:al=01111011B
shl
是逻辑左移指令,它的功能为
(1)将一个寄存器或内存单元中的数据向左移位:
(2)将最后移出的一位写入CF中
(3)最低位用0补充。mov al,01001000b
shl al,1
执行后al=10010000b cf=0
shr
是逻辑右移指令,它和shl所进行的操作刚好相皮
(1)将一个寄存器或内存单元中的数据向右移位:
(2)将最后移出的一位写入CF中:
(3)最高位用0补充。shr是逻辑右移指令,它和shl所进行的操作刚好相反mov al,10000001b
shr al,1
执行后:(al)=01000000b,CF=1
dec inc neg xchg
dec ax
ax--
inc ax
ax+=
neg ax
ax取反
xchg ax,bx
ax与bx的值交换
int
int指令是X86汇编语言中最重要的指令之一。它的作用是引发中断,调用“中断例程”(interrupt routine)。本文将介绍int指令的基本原理和应用,以及BIOS和DOS系统的中断例程。一、int指令的原理1,指令原型
int n
注:
1)n 表示中断号,也可以称为中断类型码。n是一个字节大小的正整数,范围为“0 - 255”。
2)执行“int n”时,CPU从中断向量表中,找到第n号表项,修改CS和IP(IP)=(n*4),(CS)=(n*4+2)3)对8086PC,中断向量表指定放在内存地址0处(地址固定),共1024个字节。每个表项占两个字,低字存放偏移地址,高字存放段地址。
ds寄存器,段地址,偏移地址,物理地址
ds用来放段地址
存放当前正在运行的程序代码所在段的段基值
073f:0100
段地址为073f
偏移地址为0100
物理地址为073f*16+0100给ds寄存器赋值
mov ax,0100
mov ds,ax
cs:ip
基地址:偏移地址
cs 为代码段寄存器,一般用于存放代码;
通常和IP 使用用于处理下一条执行的代码
jmp
jmp bx
将ip寄存器的值改为bx
ss-sp pop push
存储栈的地址
ss-sp指向栈顶
push寄存器
:将一个寄存器中的数据入栈
pop寄存器
:出栈,用一个寄存器接收出栈的数据
-a
073F:0100 mova×,1234
073F:0103 push a×
073F:0104 mov b×,5678
073F:0107 push bx
073F:0108 pop ax
073F:0109 pop bx
073F:010Asp=00fd
sp=00fb
sp=00f9073F:0100 78 56 34 12 00 00 00
bp si di
mov ax,[bx]
mov ax,[si]
mov ax,[si+1]
mov ax,[si+bx]
错误指令
mov ax,[bx+bp]
mov ax,[si+di]存放段地址的寄存器可以是默认的,比如:
mov ax,[0]
mov ax,[di]
mova,[bx+8]
mowa%,[bx+si]
mov ax,[bx+si+B]
等指令,段地址默认在ds中:
mov ax,[bp]
mov ax,[bp+8]
mov ax,[bp+si]
mov ax,[bp+si+8]
等指令,段地址默认在ss中。(3)只要在[...]中使用寄存器bp,而指令中没有显性地给出段地址,段地址就默认在ss中。
es 为扩展段寄存器; ss 为栈段寄存器,一般作为栈使用 和sp搭档;
es 为扩展段寄存器;
flag寄存器
标志 | true | false | Name(名称) | 命题 |
---|---|---|---|---|
OF | OV (Overflow) | NV (Not Overflow) | 0verflowFlag(是否溢出) | 存在溢出? |
SF | NG(NeGative负的) | PL(Plus正的) | Sign Flag(结果的符号是正还是负) | 是负数(正数看做无符号)? |
ZF | ZR(Zero) | NZ(Not Zero) | Zero Flag(运算结果是否为0) | 是0? |
PF | PE(Even偶数) | Po(odd奇数) | Parity Flag(结果中二进制位个数的奇偶性) | 是偶数个1? |
CF | CY(Carry yes) | NC(Not carry) | Carry Flag(进位标志) | 有进位? |
DF | DN (Down) | UP(Up) | Direction Flag(方向标志) | si、di递减? |
adc
adc ax,bx
ax=ax+bx+CF
sbb
sbb ax,bx
ax=ax-bx-CF
cmp
cmp是比较指令,cmp的功能相当于减法指令,只是不保存结果。cmp指令执行后,将对标志寄存器产生影响。其他相关指令通过识别这些被影响的标志寄存器位来得知比较结果。
cmp ax,bx
ax-bx如果(ax)=(bx)则(ax)-(bx)=0,所以:zf=1
如果(ax)≠(bx)则(ax)-(bx)≠0,所以:zf=0
如果(ax)<bx)则(ax)-(bx)将产生借位,所以:cf=l
如果(ax)≥(bx)则(ax)-(bx)不必借位,所以:cf=0
如果(ax)>(bx)则(ax)-(bx)既不必借位,结果又不为0,所以:cf=0并且zf=0
如果(ax)≤(bx)则(ax)-(bx)既可能借位,结果可能为0,所以:cf=1或zf=1
指令 | 含义 | 检测的相关标志位 |
---|---|---|
je | 等于则转移 | zf=1 |
jb | 低于则转移 | cf=1 |
ja | 高于则转移 | cf=0且zf=0 |
cmp ax,bx
je 073f:0106
运行asm文件
masm
输入文件名
link 文件名
debug 文件名.asm
循环语句loop
loop指令的格式是:loop标号,CPU执行loop指令的时候,要进行两步操作,
①cx=cx-1:②判断cx中的值,不为零则转至标号处执行程序,如果为零则向下执行。
下面例子中ax=2^12
assume cs:code
code segmentstart:mov ax,2mov cx,12s:add ax,axloop sint 21H
code ends
end start
call ret
call在执行时会先将下一条指令所对应的ip地址入栈,然后修改ip的值实现跳转, ret指令执行的时候,将ip地址pop出来进行跳转call s ;
标号里面存放的是ip偏移地址 如果写成call 3H
那么意思就是跳转到CS:0003h这个位置
执行函数s
assume cs:code
code segmentstart:mov ax,2mov cx,12call sint 21Hs:add ax,axloop sret
code ends
end start
call Far ptr retf
ret和call配套使用,retf和call Far ptr 配套使用
可以通过标号(函数名称)之间数值相减计算函数体代码所占用的内存空间大小
retf
需要配合栈进行使用,当程序执行到retf
这条指令时,会连续从栈中pop
两次数据,第一次的数据赋值给CS
,第二次的数据赋值给IP,那么如果我们想要跳转到指定的指令,需要将该指令的段地址和偏移地址分别push
进栈中
stack segmentdb 128 dup(0)
stack endscode segmentstart:mov ax,stackmov ss,axmov sp,128mov ax,0710H ;指定段地址push axmov ax,0003H ;指定偏移地址push axretf ;程序跳转到0710:0003H这个位置
code ends
end start
内存地址 机器码 汇编指令
1000:0 b8 00 00 mov ax,0
1000:3 9a 09 00 00 10 call far ptr s
1000:8 40 inc ax
1000:9 58 s:pop axadd ax,axpop bxadd ax,bx
为什么ax会是1010?详细解答执行指令先要读入到指令缓冲区中
读进去以后IP已经指向下一条指令了
call far ptr执行了push cs,push ip,jmp far ptr
这么指行的话call far ptr s的cs:1000,ip:8
把cs先扔进栈,后扔ip
那么到了s:pop ax这个时候应该是ip先出来,所以ax=8
接着执行add ax,ax=6
接着pop bx,现在bx=1000
然后执行add ax,bx
那么就是ax=1010H
代码段、数据段、栈段、dup指令
assume cs:codesg,ds:data,ss:stack
MASM内部以数基的个数定义了多种数据类型
BYTE,db,8位
WORD,dw,16位
DWORD,dd,32位
QWORD,dq,64位db 10 dup (0)
初始化10个值为0的空间
assume cs:codesg,ds:data,ss:stack
data segmentdw 123H,456H,789H,OabcH,OdefHdb 3 dup(1,2,3)db 3 dup ('abc,'def)
data ends
stack segmentdb 10 dup (0)
stack ends
codesg segmentstart:dw 'hellow rold'mov ax,3mov cx,11call sinc bxinc bxint 21Hadd ax,axloop s
codesg ends
end start
offset
操作符offset在汇编语言中是由编译器处理的符号,它的功能是取得标号的偏移地址。比如下面的程序:
assume cs:codesg
codesg segmentstart:mov ax,offset start;相当于mov ax,0s:mov ax,offset s;相当于mov ax,3
codesg ends
end start
jmp short s jmp far s
跳转到s位置
jmp short s
机器码显示距离
jmp far s
机器码显示距离地址
jmp dword ptr
功能:从内存单元地址处开始存放着两个字,高地址处的字是转移的目的段地址,低地址处是转移的目的偏移地址。
内存单元地址可用寻址方式的任一格式给出。
比如,下面的指令:
mov ax,0123H
mov ds:[0],ax
mov word ptr ds:[2],0
jmp dword ptr ds:[0]
数组
data1 dd 0, 1, 2, 4 ;
相当于 int data1[] = { 0, 1, 2, 3 };
data1[1]是内存地址+1(不论什么类型都是1个字节)
lea
lea是“load effective address”的缩写
简单的说,lea指令可以用来将一个内存地址直接赋给目的操作数
例如:lea eax,[ebx+8]就是将ebx+8这个值直接赋给eax,而不是把ebx+8处的内存地址里的数据赋给eax。
而mov指令则恰恰相反,例如:mov eax,[ebx+8]则是把内存地址为ebx+8处的数据赋给eax。
5.11输出hello world
assume cs:codesg,ds:data,ss:stack
data segmeNTstr db 'hello world','$'
data ends
stack segmentdb 10 dup (0)
stack ends
codesg SEgmentstart: mov ax,datamov ds,axlea dx,str mov ah,9int 21Hmov ah,4cHint 21H
codesg ends
end start
5.12字符串转大写
assume cs:codesg,ds:data,ss:stack
data segmeNTstr db 'hello world','$'
data ends
stack segmentdb 10 dup (0)
stack ends
codesg SEgmentstart: mov ax,datamov ds,axmov bx,0mov cx,11s:mov al,[bx]and al,1011111Bmov [bx],alinc bxloop s;mov dx,offset strlea dx,str mov ah,9int 21Hmov ah,4cHint 21H
codesg ends
end start
5.13字符串转小写
assume cs:codesg,ds:data,ss:stack
data segmeNTstr db 'hello world','$'
data ends
stack segmentdb 10 dup (0)
stack ends
codesg SEgmentstart: mov ax,datamov ds,axmov bx,0mov cx,11s:mov al,[bx]or al,0100000Bmov [bx],alinc bxloop s;mov dx,offset strlea dx,str mov ah,9int 21Hmov ah,4cHint 21H
codesg ends
end start
5.14求数组最小值
assume cs:codesg,ds:data,ss:stack
data segmeNTstr db 'hello world','$'
data ends
stack segmentdb 10 dup (0)
stack ends
codesg SEgmentstart: mov ax,datamov ds,axmov bx,0mov cx,11mov ah,0FFHs:mov al,[bx]cmp ah,aljna s1mov ah,als1:mov [bx],alinc bxloop s;mov dx,offset strlea dx,str mov ah,9int 21Hmov ah,4cHint 21H
codesg ends
end start
5.15求数组最大值
assume cs:codesg,ds:data,ss:stack
data segmeNTstr db 'hello world','$'
data ends
stack segmentdb 10 dup (0)
stack ends
codesg SEgmentstart: mov ax,datamov ds,axmov bx,0mov cx,11mov ah,0s:mov al,[bx]cmp ah,aljnb s1mov ah,als1:mov [bx],alinc bxloop s;mov dx,offset strlea dx,str mov ah,9int 21Hmov ah,4cHint 21H
codesg ends
end start
5.21数组求和
assume cs:code,ds:data,ss:stack
data segment arr db 1,2,3,4,10,20,30,40res db 8 dup (0)
data endsstack segment db 100 dup (0)
stack endscode segment start:mov ax,datamov ds,axmov bx,0mov cx,8for:add al,arr[bx]inc bxloop formov ax,4c00Hint 21
code ends
end start
5.22拷贝数组
assume cs:code,ds:data,ss:stack
data segment arr db 1,2,3,4,10,20,30,40res db 8 dup (0)
data endsstack segment db 100 dup (0)
stack endscode segment start:mov ax,datamov ds,axmov bx,0mov cx,8for:mov al,arr[bx]mov ds:res[bx],alinc bxloop formov ax,4c00Hint 21
code ends
end start
5.23用si,di翻转数组
assume cs:code,ds:data,ss:stack
data segment arr db 1,2,3,4,10,20,30,40res db 8 dup (0)
data endsstack segment db 100 dup (0)
stack endscode segment start:mov ax,datamov ds,axmov si,0mov di,7mov cx,8for:mov al,arr[si]mov ds:res[di],alinc sidec diloop formov ax,4c00Hint 21
code ends
end start
5.31用栈翻转数组
assume cs:code,ds:data,ss:stack
data segment arr dw 1111H,2222H,3333H,4444H,5555H,6666H,7777H,8888Hres db 800 dup (0)
data endsstack segment db 1000 dup (0)
stack endscode segment start:mov ax,datamov ds,axmov ax,stackmov ss,axmov sp,100mov bx,0mov cx,8for: push ds:arr[bx]add bx,2loop formov bx,0mov cx,8for1: pop ds:arr[bx]add bx,2loop for1mov ax,4c00Hint 21
code ends
end start
5.32动态规划求斐波那契数列
assume cs:code,ds:data,ss:stack
data segment arr dw 1H,1H,100 dup (0)res db 800 dup (0)
data endsstack segment db 100 dup (0)
stack endscode segment start:mov ax,datamov ds,axmov ax,stackmov ss,axmov bx,4mov cx,30for :mov dx,0add dx,ds:arr[bx-2]add dx,ds:arr[bx-4]mov ds:arr[bx],dxadd bx,2loop formov ax,4c00Hint 21
code ends
end start
5.41循环把二维矩阵某一列转大写
assume cs:codesg,ds:data,ss:stack
data segmeNTstr db 'aaaaabbbbbccccc 'db 'aaaaabbbbbccccc 'db 'aaaaabbbbbccccc 'db 'aaaaabbbbbccccc ','$'data ends
stack segmentdb 10 dup (0)
stack ends
codesg SEgmentstart: mov ax,datamov ds,axmov bx,0mov cx,4for:mov al,ds:str[bx+5]and al,11011111Bmov ds:str[bx+5],aladd bx,16loop forlea dx,str mov ah,9int 21Hmov ah,4cHint 21H
codesg ends
end start
5.42二重循环把指定矩形转大写
assume cs:codesg,ds:data,ss:stack
data segmeNTstr db 'aaaaabbbbbccccc 'db 'aaaaabbbbbccccc 'db 'aaaaabbbbbccccc 'db 'aaaaabbbbbccccc ','$'data ends
stack segmentdb 10 dup (0)
stack ends
codesg SEgmentstart: mov ax,datamov ds,axmov bx,0mov cx,4for:mov dx,cxmov si,0mov cx,5for1:mov al,ds:str[bx+si]and al,11011111Bmov ds:str[bx+si],alinc siloop for1mov cx,dxadd bx,16loop forlea dx,str mov ah,9int 21Hmov ah,4cHint 21H
codesg ends
end start
5.51冒泡排序
assume cs:codesg,ds:data,ss:stack
data segmeNTarr db 0A2H,24H,07H,3AH,1BH,0F1H,3BH,25H,81Hdata ends
stack segmentdb 10 dup (0)
stack ends
codesg SEgmentstart: mov ax,datamov ds,axmov bx,0mov cx,8for:mov dx,cxmov si,8mov cx,8sub cx,bxfor1:mov ah,ds:arr[si]mov al,ds:arr[si-1]cmp ah,aljnb allxchg ah,almov ds:arr[si],ahmov ds:arr[si-1],al all:dec siloop for1mov cx,dxadd bx,1loop formov ah,4cHint 21H
codesg ends
end start
5.61十进制转16进制
assume cs:codesg,ds:data,ss:stack
data segmeNTstr db '00012345','$'
data ends
stack segmentdb 10 dup (0)
stack ends
codesg SEgmentstart: mov ax,datamov ds,axmov bx,0mov cx,8mov ax,0s:mov dx,axshl ax,1shl ax,1 shl ax,1shl dx,1add ax,dx
;乘10add al,str[bx]adc ah,0sub ax,30H inc bx loop smov ah,4cHint 21H
codesg ends
end start
5.61十进制转16进制并输出
assume cs:codesg,ds:data,ss:stack
data segmeNTstr db '00002333','$'res db '0000','$'
data ends
stack segmentdb 100 dup (0)
stack ends
codesg SEgmentstart: mov ax,datamov ds,axmov ax,stackmov ss,ax mov sp,10mov si,4mov bx,0mov cx,8mov ax,0s:mov dx,axshl ax,1shl ax,1 shl ax,1shl dx,1add ax,dx
;乘10add al,str[bx]adc ah,0sub ax,30H inc bx loop s;ax=3039mov cx,4l:mov dx,axand dx,0FHadd dx,30Hcmp dx,3AHjb s1add dx,7H
;求出3039的ASCII码,pushs1:dec simov ds:res[si],dlshr ax,1shr ax,1shr ax,1shr ax,1loop l;mov dx,offset reslea dx,resmov ah,9int 21Hmov ah,4cHint 21H
codesg ends
end start
相关文章:

汇编的基础
原视频 基础篇:1.1编程环境的安装 打开DOSBox 0.74-3 Options.bat调整窗口大小 windowresolution1200x640 outputddrawmount c D:\masm c: debugDEBUG 用Debug的R命令查看、改变CPU寄存器的内容: 用Debug的D命令查看内存中的内容: 用Debu…...

并发编程学习(十四):tomcat线程池
1、Tomcat 功能组件结构 Tomcat 的核心功能有两个,分别是负责接收和反馈外部请求的连接器 Connector,和负责处理请求的容器 Container。 其中连接器和容器相辅相成,一起构成了基本的 web 服务 Service。每个 Tomcat 服务器可以管理多个 Servi…...

简洁灵活工单管理系统,支持工单模版字段、工单状态自定义
一、开源项目简介 本项目为FeelDesk工单管理系统的开源版(OS),是基于开发者版(DEV)分离的标准版;支持工单模版字段、工单状态等自定义,可为不同的模版设置不同的路由规则;对工单需求…...

标签派单系统架构设计
需求描述 项目背景 根据员工历史成单情况,计算员工对不同类型工单的转化能力。根据员工和工单标签匹配进行派单。 业务流程图 规则描述 每10分钟,分城进行一次派单,派单规则可能会动态删减,需要支持动态配置 工单标签说明 一…...

Jmeter和Postman那个工具更适合做接口测试?
软件测试行业做功能测试和接口测试的人相对比较多。在测试工作中,有高手,自然也会有小白,但有一点我们无法否认,就是每一个高手都是从小白开始的,所以今天我们就来谈谈一大部分人在做的接口测试,小白变高手…...

k8s污点与容忍
1.前言 污点是给node节点打上污点标签,使得pod不能往该node节点上调度,污点有三种模式,分别是NoSchedule、PreferNoSchedule、NoExecute,容忍是给pod打上和node节点一样的污点标签,使pod能调度到带有该污点标签的node…...

市面上有哪些软件可以结合agentgpt的?众包平台结合的好处!
使用AgentGPT,提升工作效率! 随着科技的迅速发展,人工智能已经成为我们生活中不可或缺的一部分。而AgentGPT则是人工智能领域的一款杰出产品,它能够帮助我们提升工作效率,减少重复性劳动,让我们的生活更加便…...

【js】对象属性的拦截和Proxy代理与Reflect映射的用法与区别
✍️ 作者简介: 前端新手学习中。 💂 作者主页: 作者主页查看更多前端教学 🎓 专栏分享:css重难点教学 Node.js教学 从头开始学习 ajax学习 文章目录 对象属性的拦截介绍SetGet 对象的拦截介绍使用对象属性拦截和对象拦截区别练习题 映射…...

Yolov8涨点神器:ODConv+ConvNeXt提升小目标检测能力
1.涨点神器结合,助力YOLO 1.1 ICLR 2022涨点神器——即插即用的动态卷积ODConv 论文:Omni-Dimensional Dynamic Convolution 论文地址:Omni-Dimensional Dynamic Convolution | OpenReview ODConv通过并行策略引入一种多维注意力机制以对卷积核空间的四个维度学习更灵活的…...

git代码回滚是使用reset还是revert
时光不能回退,Git却允许我们改变历史。 想要让Git回退历史,有以下步骤: 使用git log命令,查看分支提交历史,确认需要回退的版本 使用git reset --hard commit_id命令,进行版本回退 使用git push origin命…...

深入理解Java ThreadLocal及其内存泄漏防范
文章目录 一、ThreadLocal简介二、ThreadLocal的内存泄漏问题三、防止ThreadLocal导致的内存泄漏四、总结 一、ThreadLocal简介 在Java中,ThreadLocal是一种线程封闭的机制,其主要目的是为每个线程都创建一个单独的变量副本。这意味着,每个线…...

介绍10款ChatGPT替代产品
ChatGPT 引领着聊天 AI 的世界,许多人已经开始在日常生活中使用它。OpenAI 的 GPT-3 语言模型是聊天机器人的基础,它使得用户能够通过回答问题与 AI 进行交互。 GPT-4 的引入为机器人提供了更强大的功能。然而,它也有一个明显的缺点ÿ…...

数字逻辑 期末
概述 教材:《电子技术基础(数字部分)》 第六版 7400系列是TTL型芯片,商用型 数制 十进制->二进制 除2取余法&乘2取整法(注意精度,但计科简单不考) 十六进制->二进制 一位变四位 八…...

MT4交易外汇平台有哪些优势?为何是外汇投资首选?
外汇市场上存在着各种各样的外汇交易商,但是很多的外汇交易商所选择的交易平台都是MT4交易外汇平台。作为全世界范围内使用最为广泛的交易平台,MT4交易外汇平台具有哪些优势,能够让外汇交易商和外汇投资者都选择使用。本文就来具体的聊聊&…...

问卷调查工具实力榜单发布
问卷调查是从目标受众那里收集有价值的反馈和见解的有效方式。正确的调查问卷工具可以使问卷的创建、分发和分析变得更加容易和高效。在本文中,我们将问卷调查工具排行榜实力榜,为大家选择问卷平台的时候提供有价值的参考意见。 1、Zoho Survey Zoho S…...

javascript中property和attribute有什么区别?
在JavaScript中,“property”(属性)和"attribute"(属性)这两个术语用于描述对象的特性,但它们在含义和用法上有一些区别。 1、属性(Properties): 属性是属于J…...

快速上手kettle
一、前言 最近由于工作需要,需要用到kettle工具进行数据迁移转换。特意找资料学习了一下,kettle基本操作算是学会了。 所学的也结合实际工作进行了验证。为了防止以后用到忘记了,便写了几篇文章记录一下。 二 、ETL简介 ETL ( Extract-Tran…...

Leetcode 399. 除法求值
Leetcode 399. 除法求值题目 给你一个变量对数组 equations 和一个实数值数组 values 作为已知条件,其中 equations[i] [Ai, Bi] 和 values[i] 共同表示等式 Ai / Bi values[i] 。每个Ai 或 Bi 是一个表示单个变量的字符串。另有一些以数组 queries 表示的问题&am…...

kotlin协程并发/并行与串行互相切换,CoroutineScope与await
kotlin协程并发/并行与串行互相切换,CoroutineScope与await import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.delay import kotlinx.coroutines.launch import java.time.LocalTimefun main(args: Arra…...

初识linux之简单了解TCP协议与UDP协议
目录 一、理解源IP地址和目的IP地址 二、端口号 1. 为什么要有端口号 2. 理解端口号 3. 源端口号和目的端口号 三、初步了解TCP协议和UDP协议 1. 初步认识TCP协议 2. 初步认识UDP协议 3. 可靠传输与不可靠传输 四、网络字节序 1. 网络字节序的概念 2. 如何形成网络…...

【String——简单使用】
文章目录 String1. 字符串定义和初始化2. 字符串基本操作2.1 访问单个字符2.2 修改字符串内容2.3 字符串查找和比较 3. 常用字符串函数3.1 length() 和 size()3.2 empty()3.3 substr()3.4 c_str() 4.字符与整形之间相互转换4.1 char 类型转 int 类型4.2 int 类型转 char 类型4.…...

Python下Taobao封装API接口的优势
Python是一门面向对象编程的语言,封装是面向对象编程中的一种重要概念,它把数据和方法包装在一起,实现了对数据的保护和控制。Python封装接口的优势如下: 1.安全性 封装可以保证数据的安全性,禁止外部对数据的直接访…...

LeetCode 49 字母异位词分组
LeetCode 49 字母异位词分组 来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/group-anagrams/description/ 博主Github:https://github.com/GDUT-Rp/LeetCode 题目: 给你一个字符串数组&#x…...

( 链表) 142. 环形链表 II——【Leetcode每日一题】
❓142. 环形链表 II 难度:中等 给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定…...

论文解读 | 基于改进点对特征的点云6D姿态估计
原创 | 文 BFT机器人 01 摘要 点对特征(PPF)方法已被证明是一种有效的杂波和遮挡下的姿态估计方法。 文章的改进方法主要包括: (1)一种基于奇偶规则求解封闭几何的法向的方法; (2)通过将体素网格划分为等效角度单元的有效降采样方法; (3)基于拟合点的验证步骤。在真实杂波数据集…...

Shell脚本while循环语句应用
记录:433 场景:Shell脚本while循环语句应用。Shell脚本while循环语句应用。while do done、while : do done、while true do done。 版本:CentOS Linux release 7.9.2009。 1.while常用格式 1.1格式一:while do done while c…...

Kubernetes Dashboard + Ingress 及其 yaml 文件分析
概述 记录部署Dashboard Ingress的具体过程及其 yaml 文件分析 Dashboard Yaml # Copyright 2017 The Kubernetes Authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the Li…...

【SpringCloud组件——Nacos】
前置准备: 分别提供订单系统(OrderService)和用户系统(UserService)。订单系统主要负责订单相关信息的处理,用户系统主要负责用户相关信息的处理。 一、服务注册与发现 1.1、在父工程当中引入Nacos依赖 …...

pinia状态管理 用法
Pinia是一个用于vue的状态管理库,类似于vuex,是vue的另一种状态管理工具。 Pinia 是 Vue 的存储库,它允许跨组件/页面共享状态。实际上,Pinia就是Vuex的升级版,官网也说过,为了尊重原作者,所以取名pinia&am…...

Oracle客户端版本安装
一、版本准备 Oracle版本下载官网:Instant Client for Linux x86-64 (64-bit) | Oracle 中国 进入网站下载对应的oracle版本,通常环境所用的包有:basic、sdk、sdkplus三个包。包的类型分为rpm和zip包,均可以下载,当前…...