汇编之调试环境搭建及调试步骤详解

调试环境搭建

思路

学习一门语言,上手上机调试是非常重要的,它会带来一个感性的认知,所以学习汇编第一件事,推荐把开发环境搞起来。

安装 nasm: 程序中的汇编代码需要转译为处理器指令,在提交给处理器执行 ,nasm负责这个事

安装bochs:因为处理器指令无法像java,go语言直接跑在现有的mac,window等笔记本机器上,是直接跑在处理器上的命令,所以需要安装模拟原生处理器的软件。bochs可模拟多种处理器,包括x86和x86-64的处理器模拟器。

安装sdl : Bochs模拟器需要调用显示库代码来渲染输出界面

只提供mac的样例,其他服务器思路相差不大,自行搜索

安装操作

需要安装好brew工具

brew install bochs
brew install sdl
brew install nasm$ bochs --help
Usage: bochs [flags] [bochsrc options]-n               no configuration file-f configfile    specify configuration file-q               quick start (skip configuration interface)-benchmark N     run Bochs in benchmark mode for N millions of emulated ticks-dumpstats N     dump Bochs stats every N millions of emulated ticks-r path          restore the Bochs state from path-log filename    specify Bochs log file name-unlock          unlock Bochs images leftover from previous session-rc filename     execute debugger commands stored in file-dbglog filename specify Bochs internal debugger log file name--help           display this help and exit--help features  display available features / devices and exit--help cpu       display supported CPU models and exit$ nasm --help

如果遇上安装困难,一般是你的环境被你之前装的命令破坏了。

但是大部分的安装问题都可以搜索到解决,推荐问chatgpt,再根据它回答的上下文,去搜索解决方案

调试步骤

思路

写好汇编代码 => nasm 翻译汇编代码到二进制的处理器指令 => 制作软盘 => 导入 处理器指令程序到软盘,制成带该软盘的img镜像 => 编写启动bochs模拟处理器的配置文件 => 启动bochs => 调试汇编代码

汇编Hello world

hello.asm

bits 16
org 0x7c00jmp startstart:mov ah, 0x0e ; 寄存器ax的高8位设置0x0e 表示 "在 tty 模式下向屏幕打印字符'mov al, 'H' ; 寄存器ax的低8位设置 'H'int 0x1H ;触发中断  VGA BIOS,参数AX,打印al字母 mov al, 'e'int 0x10mov al, 'l'int 0x10mov al, 'l'int 0x10mov al, 'o'int 0x10hang:jmp hang ; 反复重复执行 jmp 回到 hang 处 ;挂住程序times 510-($-$$) db 0
dw 0xaa55

0x7c00 是 BIOS 加载主引导扇区(Master Boot Record, MBR)的默认内存地址, 即加电检查后处理器引导执行第一行命令开始执行的地方

主引导扇区(Master Boot Record, MBR)的规定大小是512字节, 所以在代码的末尾要对剩余的空间反复填充 0,再以 aa 55 两个字节结尾

制作软盘

# 编译asm汇编代码
nasm -f bin -o hello.bin hello.asm
# 制作一个1.44MB的虚拟软盘镜像,并将程序写入镜像
dd if=/dev/zero of=floppy.img bs=1024 count=1440
dd if=hello.bin of=floppy.img conv=notrunc

Bochs配置文件

在一个名为bochsrc.bxrc的文件中,输入以下内容:

# 设置32mb 模拟机器的内存大小 
megs: 32
romimage: file=/usr/local/Cellar/bochs/2.7/share/bochs/BIOS-bochs-latest
vgaromimage: file=file=/usr/local/Cellar/bochs/2.7/share/bochs/VGABIOS-lgpl-latest
# boot: a 指定了启动设备的顺序,a 表示首选启动设备为第一个软盘驱动器  floppya 
floppya: 1_44=floppy.img, status=inserted
boot: a
log: bochsout.txt
# 静默鼠标
mouse: enabled=0
# 设置显示库 需要根据实际情况安装
display_library: sdl2, options="gui_debug"# romimage  vgaromimage 搜索实际的目录地址
sudo find / -name "BIOS-bochs-latest" 2>/dev/null

执行镜像

bochs -f bochsrc.bxrc
# 运行时根据提示 continue 运行程序  输入继续执行命令 弹出屏幕会打印hello
1. Restore factory default configuration
2. Read options from...
3. Edit options
4. Save options to...
5. Restore the Bochs state from...
6. Begin simulation
7. Quit nowPlease choose one: [6] 6 # 输入6
Please choose one: [6]
00000000000i[      ] lt_dlhandle is 0x600001d34000
00000000000i[PLUGIN] loaded plugin libbx_sdl2_gui.so
00000000000i[      ] installing sdl2 module as the Bochs GUI
00000000000i[SDL2  ] maximum host resolution: x=2560 y=1600
00000000000i[      ] using log file bochsout.txt
Next at t=0
(0) [0x0000fffffff0] f000:fff0 (unk. ctxt): jmpf 0xf000:e05b          ; ea5be000f0
<bochs:1> c # 输入c continue
<bochs:1> r # 显示寄存器 
rax: 00000000_00000000
rbx: 00000000_00000000
rcx: 00000000_00000000
rdx: 00000000_00000000
rsp: 00000000_00000000
rbp: 00000000_00000000
rsi: 00000000_00000000
rdi: 00000000_00000000
r8 : 00000000_00000000
r9 : 00000000_00000000
r10: 00000000_00000000
r11: 00000000_00000000
r12: 00000000_00000000
r13: 00000000_00000000
r14: 00000000_00000000
r15: 00000000_00000000
rip: 00000000_0000fff0
eflags 0x00000002: id vip vif ac vm rf nt IOPL=0 of df if tf sf zf af pf cf
<bochs:2> s # 执行下一步 step / n next 同理
Next at t=1
(0) [0x0000000fe05b] f000:e05b (unk. ctxt): xor ax, ax                ; 31c0
<bochs:4> u /20 # 显示接下去20行汇编代码 以及其内存地址
00000000000fe05b: (                    ): xor ax, ax                ; 31c0
00000000000fe05d: (                    ): out 0x0d, al              ; e60d
00000000000fe05f: (                    ): out 0xda, al              ; e6da
00000000000fe061: (                    ): mov al, 0xc0              ; b0c0
00000000000fe063: (                    ): out 0xd6, al              ; e6d6
00000000000fe065: (                    ): mov al, 0x00              ; b000
00000000000fe067: (                    ): out 0xd4, al              ; e6d4
00000000000fe069: (                    ): mov al, 0x0f              ; b00f
00000000000fe06b: (                    ): out 0x70, al              ; e670
00000000000fe06d: (                    ): in al, 0x71               ; e471
00000000000fe06f: (                    ): mov bl, al                ; 88c3
00000000000fe071: (                    ): mov al, 0x0f              ; b00f
00000000000fe073: (                    ): out 0x70, al              ; e670
00000000000fe075: (                    ): mov al, 0x00              ; b000
00000000000fe077: (                    ): out 0x71, al              ; e671
00000000000fe079: (                    ): mov al, bl                ; 88d8
00000000000fe07b: (                    ): cmp al, 0x00              ; 3c00
00000000000fe07d: (                    ): jz .+36  (0x0000e0a3)     ; 7424
00000000000fe07f: (                    ): cmp al, 0x0d              ; 3c0d
00000000000fe081: (                    ): jnb .+32  (0x0000e0a3)    ; 7320
<bochs:8> b 0x00000000000fe063 #设置断点
<bochs:9> c # 继续执行 直到断点
(0) Breakpoint 1, 0x00000000000fe063 in ?? ()
Next at t=5
(0) [0x0000000fe063] f000:e063 (unk. ctxt): out 0xd6, al              ; e6d6
<bochs:10> u # 下一行指令 输出 al 内容
00000000000fe063: (                    ): out 0xd6, al              ; e6d6
<bochs:11> r  
rax: 00000000_000000c0
...
<bochs:n> c # 执行完

整个调试的过程就是,写好代码,反复执行上述的流程,编译打包如虚拟软盘,bochs运行镜像,运行主引导扇区0x7c00处的512字节的代码

bochs内的命令

$ bochs 
> sreg 看段寄存器内容
> r 显示寄存器内容
> s 单步执行 step 并显示下一条指令
> b 设置break断点,到指定内存地址
> b 0x7c00
> c 持续执行 知道断点
> xp /512xb 0x7c00 从0x7c00处开始显示512xb字节数的内容
> xp /16xb 0xb8000 显示显示器内容 注意找到正确的内存地址值
> next/n 

汇编代码样例

访问显卡输出字符

在内存地址B8000 ~ BFFFF 隐射到显存 32kb,即把ASCII的二进制数输出到该段内存,即可在屏幕上打印字符

打印65535在屏幕上

boot.asm

start:mov ax, 65535 ;ffffmov dx, 0mov bx, 10 ; adiv bx  ; AX=商(6553),DX=余数(5)add dl,0x30 ; 将数字转成数字字符 5->3->5->5->6mov cx, 0  ;将数据段(Data Segment)的基址设置为零,以便使用偏移地址直接访问内存mov ds,cx mov [0x7c00+buffer], dl ; 寄存器数据存入 通过偏移地址计算的内存地址 ds[0]+ [0x7c00+buffer];查看内存 ds:0x7c8b 处的值xor dx, dx div bx ; AX=商(00000000_0000028f),DX=余数(3)add dl, 0x30 ; 0x30 +0x05 =0x33mov [0x7c00+buffer+1], dl ;  0x7c8cxor dx, dxdiv bx add dl, 0x30 ; 0x30 +0x05 =0x35mov [0x7c00+buffer+2], dl ;0x7c8dxor dx, dxdiv bxadd dl, 0x30mov [0x7c00+buffer+3], dlxor dx, dxdiv bxadd dl, 0x30mov [0x7c00+buffer+4], dl; 使用附加段寄存器mov cx,0xb800mov es, cx ;传送段地址mov al, [0x7c00+buffer+4]mov [es:0x00], al ;es:段超越前缀mov byte [es:0x01], 0x2f mov al, [0x7c00+buffer+3]mov [es:0x02], al mov byte [es:0x03], 0x2f mov al, [0x7c00+buffer+2]mov [es:0x04], al mov byte [es:0x05], 0x2f mov al, [0x7c00+buffer+1]mov [es:0x06], al mov byte [es:0x07], 0x2f mov al, [0x7c00+buffer]mov [es:0x08], al mov byte [es:0x09], 0x2f    
again:jmp again
buffer:db 0,0,0,0,0 ;开辟5字节空间
current:times 510-(current-start) db 0    dw 0xaa55

编译操作以及调试步骤

nasm -f bin -o boot.bin boot.asmdd if=/dev/zero of=boot.img bs=1024 count=1440
dd if=boot.bin of=boot.img conv=notruncvim  bootsrc.bxrc
megs: 32
romimage: file=/usr/local/Cellar/bochs/2.7/share/bochs/BIOS-bochs-latest
vgaromimage: file=/usr/local/Cellar/bochs/2.7/share/bochs/VGABIOS-lgpl-latest
floppya: 1_44=boot.img, status=inserted
boot: a
log: bochsout.txt
mouse: enabled=0
display_library: sdl2, options="gui_debug"bochs -f bootsrc.bxrc
$ bochs -f bootsrc.bxrc
<bochs:1> b 0x7c00 # 下断点
<bochs:4> c
(0) Breakpoint 1, 0x0000000000007c00 in ?? ()
Next at t=14034555
(0) [0x000000007c00] 0000:7c00 (unk. ctxt): mov ax, 0xffff            ; b8ffff
<bochs:3> n
Next at t=14034556
(0) [0x000000007c03] 0000:7c03 (unk. ctxt): mov dx, 0x0000            ; ba0000
<bochs:4> r # 查看寄存器
rax: 00000000_0000ffff
rbx: 00000000_00000000
rcx: 00000000_00090000
rdx: 00000000_00000000
rsp: 00000000_0000ffd6
rbp: 00000000_00000000
rsi: 00000000_000e0000
rdi: 00000000_0000ffac
r8 : 00000000_00000000
r9 : 00000000_00000000
r10: 00000000_00000000
r11: 00000000_00000000
r12: 00000000_00000000
r13: 00000000_00000000
r14: 00000000_00000000
r15: 00000000_00000000
rip: 00000000_00007c03
eflags 0x00000082: id vip vif ac vm rf nt IOPL=0 of df if tf SF zf af pf cf
<bochs:5> u /16 #查看写入的代码
0000000000007c00: (                    ): mov ax, 0xffff            ; b8ffff
0000000000007c03: (                    ): mov dx, 0x0000            ; ba0000
0000000000007c06: (                    ): mov bx, 0x000a            ; bb0a00
0000000000007c09: (                    ): div ax, bx                ; f7f3
0000000000007c0b: (                    ): add dl, 0x30              ; 80c230
0000000000007c0e: (                    ): mov cx, 0x0000            ; b90000
0000000000007c11: (                    ): mov ds, cx                ; 8ed9
0000000000007c13: (                    ): mov byte ptr ds:0x7c8b, dl ; 88168b7c
0000000000007c17: (                    ): xor dx, dx                ; 31d2
0000000000007c19: (                    ): div ax, bx                ; f7f3
0000000000007c1b: (                    ): add dl, 0x30              ; 80c230
0000000000007c1e: (                    ): mov byte ptr ds:0x7c8c, dl ; 88168c7c
0000000000007c22: (                    ): xor dx, dx                ; 31d2
0000000000007c24: (                    ): div ax, bx                ; f7f3
0000000000007c26: (                    ): add dl, 0x30              ; 80c230
0000000000007c29: (                    ): mov byte ptr ds:0x7c8d, dl ; 88168d7c
<bochs:6> n
Next at t=14034556
(0) [0x000000007c03] 0000:7c03 (unk. ctxt): mov dx, 0x0000            ; ba0000
# .... 除数除完后查看内存数据
<bochs:17> xp /512xb 0x7c00 # 65535 已经存入依次位置
0x0000000000007c88 <bogus+     136>:	0x2f	0xeb	0xfe	0x35	0x33	0x35	0x35	0x36
<bochs:38> u /16
0000000000007c43: (                    ): mov cx, 0xb800            ; b900b8
0000000000007c46: (                    ): mov es, cx                ; 8ec1
0000000000007c48: (                    ): mov al, byte ptr ds:0x7c8f ; a08f7c
0000000000007c4b: (                    ): mov byte ptr es:0x0000, al ; 26a20000
0000000000007c4f: (                    ): mov byte ptr es:0x0001, 0x2f ; 26c60601002f
0000000000007c55: (                    ): mov al, byte ptr ds:0x7c8e ; a08e7c
0000000000007c58: (                    ): mov byte ptr es:0x0002, al ; 26a20200
0000000000007c5c: (                    ): mov byte ptr es:0x0003, 0x2f ; 26c60603002f
0000000000007c62: (                    ): mov al, byte ptr ds:0x7c8d ; a08d7c
0000000000007c65: (                    ): mov byte ptr es:0x0004, al ; 26a20400
0000000000007c69: (                    ): mov byte ptr es:0x0005, 0x2f ; 26c60605002f
0000000000007c6f: (                    ): mov al, byte ptr ds:0x7c8c ; a08c7c
0000000000007c72: (                    ): mov byte ptr es:0x0006, al ; 26a20600
0000000000007c76: (                    ): mov byte ptr es:0x0007, 0x2f ; 26c60607002f
0000000000007c7c: (                    ): mov al, byte ptr ds:0x7c8b ; a08b7c
0000000000007c7f: (                    ): mov byte ptr es:0x0008, al ; 26a20800
<bochs:46> sreg # 查看段寄存器
es:0xb800, dh=0x0000930b, dl=0x8000ffff, valid=1Data segment, base=0x000b8000, limit=0x0000ffff, Read/Write, Accessed
cs:0x0000, dh=0x00009300, dl=0x0000ffff, valid=1Data segment, base=0x00000000, limit=0x0000ffff, Read/Write, Accessed
ss:0x0000, dh=0x00009300, dl=0x0000ffff, valid=7Data segment, base=0x00000000, limit=0x0000ffff, Read/Write, Accessed
ds:0x0000, dh=0x00009300, dl=0x0000ffff, valid=7Data segment, base=0x00000000, limit=0x0000ffff, Read/Write, Accessed
fs:0x0000, dh=0x00009300, dl=0x0000ffff, valid=1Data segment, base=0x00000000, limit=0x0000ffff, Read/Write, Accessed
gs:0x0000, dh=0x00009300, dl=0x0000ffff, valid=1Data segment, base=0x00000000, limit=0x0000ffff, Read/Write, Accessed
ldtr:0x0000, dh=0x00008200, dl=0x0000ffff, valid=1
tr:0x0000, dh=0x00008b00, dl=0x0000ffff, valid=1
gdtr:base=0x00000000000f9ad7, limit=0x30
idtr:base=0x0000000000000000, limit=0x3ff
# 挨个查看输出到屏幕的字符和内存对应的关系
<bochs:9> xp /16xb 0x000b8000
[bochs]: # 6
0x00000000000b8000 <bogus+       0>:	0x36	0x2f	0x6f	0x0b	0x63	0x0b	0x68	0x0b
0x00000000000b8008 <bogus+       8>:	0x73	0x0b	0x20	0x0b	0x56	0x0b	0x47	0x0b
...
<bochs:22> n
Next at t=14034599
(0) [0x000000007c89] 0000:7c89 (unk. ctxt): jmp .-2  (0x00007c89)     ; ebfe
<bochs:23> xp /16xb 0x000b8000
[bochs]:
0x00000000000b8000 <bogus+       0>:	0x36	0x2f	0x35	0x2f	0x35	0x2f	0x33	0x2f
0x00000000000b8008 <bogus+       8>:	0x35	0x2f	0x20	0x0b	0x56	0x0b	0x47	0x0b

全部调试完毕之后 显示如下
在这里插入图片描述

计算1+2+3…+100 结果并打印

编写代码,通过栈指令,和上一段代码的基础实现

   ;代码清单7-1;文件名:c07_mbr.asm;文件说明:硬盘主引导扇区代码;创建日期:2011-4-13 18:02jmp near startmessage db '1+2+3+...+100='start:mov ax,0x7c0           ;设置数据段的段基地址 mov ds,axmov ax,0xb800          ;设置附加段基址到显示缓冲区mov es,ax;以下显示字符串 mov si,message       ; 把message的地址传入si -> source index    mov di,0	; destination index 偏移从0开始mov cx,start-message ; @g处的loop代码循环的次数 ->  message的字符数@g:mov al,[si]			;因为这是硬盘主引导扇区代码,因此被加载到0x7c00,[si]=[ds:si],就是相对于代码段开头的相对偏移,这个相对偏移就是标签message的值 ->此时: ds=0x0000mov [es:di],alinc di					;di用做显存段地址的相对偏移,字符内容信息放在低一个字节mov byte [es:di],0x07 ; 放字符颜色inc di					;字符显示信息放在高一个字节inc si					;si用作寻址字符串相对偏移,每加载完一个字符 ++1loop @g;以下计算1到100的和 xor ax,ax				;清空ax寄存器,存放结果mov cx,1@f:add ax,cxinc cx					;cx做累加器cmp cx,100jle @f					;小于等于时跳转;以下计算累加和的每个数位 xor cx,cx              ;设置堆栈段的段基地址mov ss,cx							; SS栈段寄存器  Stack Segment Register 此时 cx:0mov sp,cx				;堆栈段指针和段基址都在0x0000处,堆栈段从高地址向低地址生长 ;注意: 0x0000-2=0xfffd => 一减就回到以0x0000为段基地址+0xffff偏移 能表示的最大地址处mov bx,10xor cx,cx@d:inc cx			;压栈中用cx记录一共压入栈元素个数,以便之后出栈时能及时停止popxor dx,dx		;被除数[dx:ax]div bx			;除数bx 16位除法是 AX / BX ,结果存放: 商在AL,余数在寄存器AH; cpu现在64位=> 余数存在dx中or dl,0x30		;余数在dx中,但是余数最多到9,因此在dl中就够了,加0x30得到ASCII码push dx		;dx中只有dl有意义,但是压栈的单位必须是字(两个字节)cmp ax,0		; 是否计算完 商为0jne @d			;为0后循环跳出时,结果5050每一位被放在栈中;以下显示各个数位 @a:pop dx			;出栈,栈顶元素是千位,百位,十位,个位 pop 栈顶数据到dx寄存器中mov [es:di],dl ;寄存器dx中的数据 数字的ASCII inc dimov byte [es:di],0x07 ; + 颜色款色值inc diloop @ajmp near $  ; 反复跳回当前行 卡住times 510-($-$$) db 0 		;		$    当前汇编指令地址
;		$$  当前汇编段地址
db 0x55,0xaa 
dw 0xaa55

重复上面的调试步骤,成功如下
在这里插入图片描述

参考资料

  • 书籍《x86汇编语言-从实模式到保护模式》

    http://www.lizhongc.com/index.php/157.html

  • 配套代码清单 https://blog.csdn.net/qq_40345544/article/details/101698213

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/17851.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

通过gulp+rollup从零到一搭建前端组件库

核心要点 通过 webpack 搭建运行环境通过 gulp 执行编译流程通过 rollup 编译组件代码编写 组件测试 组件打包 编译组件上传 npm 1、通过 webpack 搭建运行环境 这里主要是创建一个可以运行的测试的组件的环境&#xff0c;全局安装vue-cli脚手架&#xff0c;并初始化项目 v…

Nuxt重构的填坑之路

我的个人网站是用vuecli写的&#xff0c;SEO不忍直视。于是用Nuxt重构了代码&#xff0c;过程中踩了无数坑&#xff0c;记录如下 一&#xff1a;body样式不生效 正常的body样式设置不能生效&#xff0c;需要在nuxt.config.js中配置 1、设置bodyAttrs的class属性&#xff0c;该…

【ProNoC】Chap.1 ProNoC生成2x2的mesh型的4核片上网络系统;实现NoC的RTL设计

【ProNoC】Chap.1 ProNoC生成2x2的mesh型的4核片上网络系统&#xff1b;实现NoC的RTL设计 0. NoC多核片上网络生成器ProNoCProNoC的功能实现 1. 生成一个叫做Mor1kx SoC的单个Tile&#xff08;包含NI网络接口&#xff09;1.1 打开ProNoC用于生成Tile的GUI界面1.2 为Tile添加时钟…

【AI绘图学习笔记】transformer

台大李宏毅21年机器学习课程 self-attention和transformer 文章目录 Seq2seq实现原理EncoderDecoderAutoregressive自回归解码器Non-Autoregressive非自回归解码器Corss-attention 总结TrainingtrickCopy MechanismGuided AttentionBeam Search强化学习&#xff08;Reinforceme…

MATLAB转C

1、先写好一个 函数调用。点击应用程序----MATLAB coder 打开一个对话框&#xff0c;确定C语言代码的工程名。 2、添加函数文件 3、添加文件后&#xff0c;单击变量&#xff0c;选择变量类型和矩阵大小。注意&#xff0c;如果选择的不是double型的数据类型&#xff0c;MATLAB…

Qt功能优化:Qt语音助手

Qt功能优化:Qt语音助手 文章目录 Qt功能优化:Qt语音助手一、效果图二、使用步骤1. .pro部分2. .h部分3. .cpp部分总结一、效果图 点击界面右上方类似于耳机的按钮,即可召唤出语音助手,来为您讲解我们的项目。如下图所示: 二、使用步骤 1. .pro部分 代码如下: QT …

【Chisel学习】设计n位超前进位加法器生成器(Carry-Lookahead Adder Generator)

Chisel学习——设计n位超前进位加法器生成器&#xff08;Carry-Lookahead Adder Generator) 文章目录 Chisel学习——设计n位超前进位加法器生成器&#xff08;Carry-Lookahead Adder Generator)一&#xff0c;项目简介二&#xff0c;理论基础2.1 Chisel2.1 硬件生成器&#xf…

OpenAI GPT-3模型详解

OpenAI GPT-3模型详解 针对文本生成和代码生成这两大类场景&#xff0c;OpenAPI分别提供了GPT-3和Codex模型&#xff0c; 模型描述GPT-3一组能够理解和生成自然语言的模型Codex一组可以理解和生成代码的模型&#xff0c;包括将自然语言转换为代码 本文将为大家详细介绍这两个…

Vue3通透教程【十七】Vite构建TS版本Vue项目

文章目录 &#x1f31f; 写在前面&#x1f31f; 创建TS版本的Vue3项目&#x1f31f; 插件安装&#x1f31f; 写在最后 &#x1f31f; 写在前面 专栏介绍&#xff1a; 凉哥作为 Vue 的忠实 粉丝输出过大量的 Vue 文章&#xff0c;应粉丝要求开始更新 Vue3 的相关技术文章&#…

用 ChatGPT 重构工作流程

如果你第一次听说 ChatGPT&#xff0c;那你要反思一下自己的信息获取渠道是不是出了问题&#xff0c;作为 AI 时代最强代表&#xff0c;你一定要亲自去体验一下&#xff0c;而不是道听途说。 公司需要降本增效&#xff0c;个体也一样&#xff0c;在工作中畅快应用 AI 来帮助自己…

Qt:可视化UI设计

1、创建项目&修改组件的对象名字和显示文本内容 创建一个 Widget Application 项目类 QDialog&#xff0c;在创建窗体时选择基类 QDialog&#xff0c;生成的类命名为 QWDialog&#xff0c;并选择生成窗体。 在界面设计时&#xff0c;对需要访问的组件修改其objectName&am…

【Qt设计开发】GUI界面设计开发

文章目录 一、Qt简介和下载安装二、Qt入门2.1 创建第一个项目2.2 快捷键和命名规范2.3 Qt项目和VS2022项目相互转换 三、Qt基础3.1 Qt对象树和窗口坐标系概念3.2 QPushButton3.3 信号和槽(signals and slots)3.3.1 pushbutton关闭窗口3.3.2 自定义信号和槽 3.4 Lambda表达式3.5…

【饭谈】ChatGpt如果让软件ui都消失的话,那ui自动化测试该何去何从?

“未来的软件长什么样&#xff1f;” 一位妹子产品经理问我&#xff1a;“你说说未来的软件ui是什么样的&#xff1f;听到这个问题我先是诧异了一下&#xff0c;随即陷入了沉思。” 我看着眼前的产品经理&#xff0c;她是一位比较年轻干练的女强人类型&#xff0c;1.65的身材…

chatgpt赋能python:Python如何设计UI:最佳实践和关键洞察

Python如何设计UI&#xff1a;最佳实践和关键洞察 作为一种支持多种编程范式和用途的高级语言&#xff0c;Python已经成为了许多技术创造者和创业者的首选工具之一。但是&#xff0c;Python最初并不是为了动态用户界面&#xff08;Dynamic User Interface&#xff0c;简称UI&a…

基于Qt的ui图形化界面进行的界面设计

qt初学者往往会发现这样的一个问题——无论是我买的相关的书&#xff0c;还是网上博客的内容&#xff0c;基本全都是利用纯代码的形式来进行界面设计的。而初学者对各种控件的代码实现并不熟悉&#xff0c;往往在这里耗费大量时间。故本篇文章介绍了通过ui图形化界面进行设计的…

职场神器:只需三分钟,AI工具让我变成插画师

绘画技能 一般来说&#xff0c;搞技术的&#xff0c;写文章的&#xff0c;在绘画的这棵技能树上的加点往往都是零。 而且绘画和音乐这些技能往往是需要一定天赋的&#xff0c;它不像写代码和开挖机&#xff0c;后两者往往经过培训以后人人都能学会&#xff0c;而前两者没有一…

设计师与 ChatGPT 应该如何共处?

ChatGPT 的火爆&#xff0c;导致众多设计师开始忧心忡忡&#xff01; ChatGPT那么厉害&#xff0c;是不是设计师要被取代了&#xff1f;&#xff1f;? ChatGPT以及很多 AI 生成插画和图片的工具和软件&#xff0c;不仅为我们带来了惊喜&#xff0c;也让我们感受到了不少担忧!…

美国人真的开始害怕AI了

ChatGPT 发布半年后&#xff0c;人类终于意识到&#xff0c;世界已经彻底改变了。 这变化&#xff0c;比以往任何时候都更迅猛&#xff0c;更让人措手不及。 劳动者&#xff0c;学者&#xff0c;技术专家&#xff0c;NGO&#xff0c;政府&#xff0c;人们不得不作出应对。 这是…

三星引入ChatGPT半个月泄密3次;MidJourney V5相机镜头完整参数列表;万字长文,拆解投身大模型3个本质问题 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; &#x1f916; 『三星引入 ChatGPT 半个月泄密三次』数据安全是个大问题啊&#xff01; 据韩国媒体报道&#xff0c;三星电子 (Samsung Electronics)…

2021高考成绩查询理综各科得分,2021河南高考总分及各科分数 满分分数是多少

河南高考试卷总分为750分&#xff0c;其中语文科目满分150分&#xff1b;数学科目满分150分&#xff1b;英语科目满分150分&#xff1b;文综和理综各自均为300分。 2021河南高考各科及满分分数设置考试科目顺序满分分数高考总分 语文150分750分 文数/理数150分 文综/理综300分 …