我需要拆解命令8E C0,你能帮帮我吗?
我已经做到了这个:
第一个字节8E = 10001110b它是mov sr,reg/mem
但我不知道如何处理第二个字节11000000
是否有之间的速度差mov bx,ax,并mov bh,ah在16位MS-DOS应用程序的8086架构?
一个简单的问题,但我不知道答案.
原因是什么:
push wParam
pop char
Run Code Online (Sandbox Code Playgroud)
其中wParam,定义为WPARAM类型,char定义为WPARAM类型.
为什么我不能简单
mov char, wParam
Run Code Online (Sandbox Code Playgroud)
我有一种感觉它与地址有关,但我无法证明这一点.当我尝试使用该mov语句时,MASM吐出一个非描述性错误.
我有一个适用于Mac OS X的程序集hello world程序,如下所示:
global _main
section .text
_main:
mov rax, 0x2000004
mov rdi, 1
lea rsi, [rel msg]
mov rdx, msg.len
syscall
mov rax, 0x2000001
mov rdi, 0
syscall
section .data
msg: db "Hello, World!", 10
.len: equ $ - msg
Run Code Online (Sandbox Code Playgroud)
我想知道这条线lea rsi, [rel msg]。为什么NASM强迫我这样做?据我了解,它msg只是指向可执行文件中某些数据的指针,这样做mov rsi, msg会将地址放入rsi。但是,如果我将替换为lea rsi, [rel msg],则NASM会引发此错误(注意:我使用的是命令nasm -f macho64 hello.asm):
hello.asm:9: fatal: No section for index 2 offset 0 found
Run Code Online (Sandbox Code Playgroud)
为什么会这样?有什么特别之处lea是mov …
我想将mov视频转换为mp4。当前,我通过以下调用通过bash使用ffmpeg进行管理:
ffmpeg -i input.mov -f mp4 -vcodec mpeg2video -acodec mp3 output.mp4
Run Code Online (Sandbox Code Playgroud)
是的,这行得通,但是质量很糟糕。我的50Mb压缩为一个方便的2.3 Mb文件。我尝试了仅更改容器的变体:
ffmpeg -i input.mov -f mp4 -vcodec copy -acodec mp3 output.mp4
Run Code Online (Sandbox Code Playgroud)
是的,也可以,但是文件仍然很大,因为我不压缩视频。所以我的50Mb保持50Mb。
是否有一种设置,可以在不完全缺乏质量的情况下进行轻微或逐步压缩?我的目标是输出大约10-20 Mb的文件。
我试过的
ffmpeg -i input.mov -f mp4 -vcodec -qscale:v 4 -acodec mp3 output.mp4
给我错误信息:
警告:库配置不匹配[...]未知编码器'-qscale:v'
使用的版本:ffmpeg版本2.8.11-0ubuntu0.16.04.1
假设我有一串ascii字符,例如"652 + 346*779 =",我想将一些字符从这个变量移到另一个变量......
缓冲区是字符串(在本例中为"652 + 346*779 =")lengthofnum是有问题的数字的长度(在这种情况下,346的长度为3)A_ascii是我正在尝试传输字符串的变量" 346" .
我有一个根本不起作用的循环,我无法弄清楚我应该使用什么寻址模式.emu8086讨厌到目前为止我尝试过的所有内容,并且使用MOV指令给出了关于语法的错误
mov cx,lengthofnum
dumploop1:
mov bx, offset buffer
;dump the number from buffer into A_ascii
mov A_ascii[cx],[bx]+cx
loop dumploop1:
Run Code Online (Sandbox Code Playgroud)
我收到以下错误代码:
(672) wrong parameters: MOV A_ascii[cx],[bx]+cx
(672) probably it's an undefined var: A_ascii[cx]
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用ASM完成以下操作:
mov [00A30020], [ebx+50]
所以,我想要00A30020 mov的值ebx+50,但编译器说这是一个无效的声明.
我在课堂上了解到,将16位寄存器移到8位寄存器并不是一个有效的指令.例如,此命令无效:
mov al,bx
Run Code Online (Sandbox Code Playgroud)
但是有这样的指示:
mov bx,al
Run Code Online (Sandbox Code Playgroud)
或者2个寄存器的大小必须相等?如下所示:
mov al,bl
mov bx,ax
Run Code Online (Sandbox Code Playgroud) 我目前正在从英特尔x86大会的Art中学习x86 .在它讨论不同指令类和操作码如何工作的部分中,它表示一个字节操作码被编码为iiirrmmm,其中三个is表示指令类,rr表示4个主寄存器,并且mmm可以是表示可选2字节存储器的许多值操作数的形式AX,[AX],[AX+XXXX],等.例如,101对应于[XXXX+BX],100对应于[BX]等,还提到在第一所采取在寄存器访问一个值的时间是零时钟周期,因为它是在芯片上实现.
但是,在解释指令完全工作所花费的时间时,为了弄清楚CPU计算内存操作数地址所花费的时间,它说:

它不会分别是1和0周期,因为本书在开始时明确提到采用零时钟周期来访问寄存器中的值?怎么说用1个循环来获取值BX呢?
我遇到一个问题,我无法理解该指令MOV BX,CS的操作码,例如第一个字节是 10001100,其中前 6 位表示操作码,然后方向 1 位跟随 W。所以这是我的疑问为什么在操作码中它是 100011 而不是 100010,在 W 单元中为什么有 0 而不是 1,比如出于什么目的,或者有一些我应该小心的条件。
如果有人能给我详细的答案,我将不胜感激。
当我尝试使用不止一种方法来解决时,我无法得到上图中所示的解决方案,并且我观看了很多视频,但没有找到可以澄清我的疑问的答案。