我在试卷中遇到了这个问题.它说,哪种给定的寻址模式更快?为什么?
现在根据我的寄存器寻址模式应该更快,因为寄存器是计算机中最快的存储位置.这是正确答案吗?
请帮忙.谢谢
在我们系统的编程课程中,我们正在学习汇编语言.在大多数示例程序中,我们的教授.在课堂上表现出来; 他正在使用:
XOR CX, CX
Run Code Online (Sandbox Code Playgroud)
代替
MOV CX, 0
Run Code Online (Sandbox Code Playgroud)
要么
OR AX, AX
JNE SOME_LABEL
Run Code Online (Sandbox Code Playgroud)
代替
CMP AX, 0
JNE SOME_LABEL
Run Code Online (Sandbox Code Playgroud)
要么
AND AL, 0FH ; To convert input ASCII value to numeral
; The value in AL has already been checked to lie b/w '0' and '9'
Run Code Online (Sandbox Code Playgroud)
代替
SUB AL, '0'
Run Code Online (Sandbox Code Playgroud)
我的问题如下,使用AND/ OR或XOR代替备用(易于理解/读取)方法时是否有某种更好的性能?
由于这些课程通常在理论讲座时间向我们展示,因此大多数课程无法用口头方式对其进行评估.为什么花40分钟讲解这些琐碎的陈述?
我试图给出一位数字,并知道奇偶校验是奇数还是偶数,例如,给出9并打印出奇数.
这就是我所拥有的:
assume cs:cseg,ds:dseg,ss:sseg
cseg segment
start:
mov ax, dseg
mov ds, ax
mov ah, 01h ; Here, im adding a number
int 21h
jp even
jnp odd
even:
mov ah,09
lea dx,par
int 21h
jmp exit
odd:
mov ah,09
lea dx,odd1
int 21h
jmp salir
salir:
mov ax,4C00h
int 21h
cseg ends
dseg segment byte
even Db 'Even number$'
odd11 Db 'Odd number$'
dseg ends
sseg segment stack
db 100h dup(?)
sseg ends
end start
Run Code Online (Sandbox Code Playgroud)
谢谢!抱歉我的英语不好.
我正在将程序从EMU8086环境转换为NASM。组装NASM时出现以下错误:
system \ kernel.asm:14:错误:操作码和操作数的无效组合
system \ kernel.asm:20:错误:操作码和操作数的无效组合
system \ kernel.asm:28:错误:操作码和操作数的无效组合
我的代码是:
jmp start
;==============================
;Draws a horiz and vert line
;==============================
startaddr dw 0a000h ;start of video memory
colour db 1
;==============================
start:
mov ah,00
mov al,19
int 10h ;switch to 320x200 mode
;=============================
horiz:
mov es, startaddr ;put segment address in es *** 1st ERROR HERE!
mov di, 32000 ;row 101 (320 * 100)
add di, 75 ;column 76
mov al,colour
mov cx, 160 ;loop …Run Code Online (Sandbox Code Playgroud) 我想编写一个DOS程序(我的第一个程序),我有点没有经验。
对于该程序,我需要超过64 KB的(传统)内存。如何获得额外的内存?理想情况下,我想为程序增加两个64k的内存块。我可以开始将数据写入地址空间中的某个地方还是需要请求额外的内存吗?
在Z80,8080,8085和8086处理器的标志寄存器中,第1,3,5位的目的是什么,它们被记录为"保留"或"未定义"?
我需要找到一个可以从用户那里接收超过 1 位数字的中断。 ;代码
mov [0],0
mov si,0
lop:
mov ah,1
int 21h
cmp al,'q'
je finishedInput
xor ah,ah
add [word ptr si], ax
jmp lop
finishedInput:
Run Code Online (Sandbox Code Playgroud)
我已经尝试做一个无限循环,每次都使用
mov ah,1
int 21h
Run Code Online (Sandbox Code Playgroud)
组合。当用户按下“q”时,无限循环停止。然而,我几乎确信我已经看到了一个代码,它用中断来做同样的事情。
我想停止使用这个块并使用可以更好地工作的短中断
我试图理解一个程序来获取箭头键。这是代码:
int getkeys( )
{
union REGS i,o;
while(!kbhit( ));
i.h.ah=0;
int86(22,&i,&o);
return(o.h.ah);
}
Run Code Online (Sandbox Code Playgroud)
有人可以解释我这个代码。这是为了获得箭头键,但我没有得到这个代码。
在将旧的 Turbo Pascal 单位转换为现代 Object Pascal 时,我遇到了以下问题:
function Less (var a, b; Relation : POINTER) : boolean;
inline($5B/$59/$0E/$E8/$00/$00/$58/$05/$08/$00/$50/$51/$53/$CB);
Run Code Online (Sandbox Code Playgroud)
代码应该调用 an external function {$F+} function VariableLess(var a, b : Index) : boolean; {$F-},收集结果并将其传递给调用函数。该函数用于为无类型数据提供二叉树的单元中
procedure InsVarBBTree(var B: BBTree; var E; S: word; A: pointer; var ok: boolean);
{ puts variable E of size S into tree B. The order relation address is A. }
Run Code Online (Sandbox Code Playgroud)
因此,单元本身不能提供比较功能,即定义有效载荷的单元的工作。
使用在线反汇编器,我发现这对应于:
{$ASMMODE intel}
function Less (var a, b; Relation : POINTER) : boolean; assembler; …Run Code Online (Sandbox Code Playgroud) MUL CL CL 是 BYTE 大小,它等于 AX = AL * CL
MUL BX BX 是 WORD 大小,它等于 DX:AX = AX * BX
MUL EBX EBX 是 DWORD 大小,它等于 EDX:EAX = EAX * EBX
我想知道为什么 8 位大小的MUL指令给出的结果是 inAX而不是 in DL:AL?
是因为对于 16 位 MUL,结果可以是EAX,对于 32 位 MUL 结果可以是RAX,但是对于 64 位mul rcx,不会有足够宽的单个寄存器来保存结果吗?