Assembly 使用MOVZX在汇编中使用寄存器8位添加整数20、30、50和160

Assembly 使用MOVZX在汇编中使用寄存器8位添加整数20、30、50和160,assembly,x86,masm,irvine32,Assembly,X86,Masm,Irvine32,我对如何使用8位寄存器AL求整数和感到相当困惑?任何暗示都很好。多谢各位 TITLE Add (AddSub.asm) ; This program adds and subtracts 32-bit integers. ;Problem 1 Add 20, 30, 50,160 al hint move ax,0 to start ; Last update: 2/1/02 TITLE Add (AddSub.asm) INCLU

我对如何使用8位寄存器AL求整数和感到相当困惑?任何暗示都很好。多谢各位

TITLE Add              (AddSub.asm)

; This program adds and subtracts 32-bit integers.
;Problem 1 Add 20, 30, 50,160  al  hint move ax,0 to start
; Last update: 2/1/02

TITLE Add               (AddSub.asm)

INCLUDE Irvine32.inc

.code
main PROC

    mov al,20d      
    add al,30d      
    add al,50d      
    add al,160d 
    call DumpRegs

    call writedec 
    exit
main ENDP
END main

当您向
AL
添加一个数字并且出现溢出时,您得到的是
AL
中结果的低位8位,并且设置进位标志。如果您将进位标志加上AL寄存器视为9位量,那么它就是您要查找的总和。(9位的数量足以代表260位。)

指令“ADC”代表“带进位添加”,因此,如果您已经将
AH
设置为零,(也许是带
MOVZX
),您可以执行
ADC AH,0
,这将本质上将进位标志添加到
AH
,然后
AX
将包含您的结果


好了,这不仅仅是一个提示,它实际上就是解决方案。

ax
ah
al
组成

movzx
是带有“零扩展”的
mov
,可用于将较短的值复制到较大的目标中

movzx-ah,0
是不合法的,它正在将8b常量移动到8b寄存器中,没有任何扩展(
mov-ah,0
就足够了)

movzx ax,字节20
将零扩展8位常量20,并将其存储到16位
ax
寄存器中

这相当于
mov-al,20-mov-ah,0
mov-ax,WORD 20
(或几千种其他变体。如何将字节值20加载到
al
,将零加载到
ah
,常见的变体之一是使用
xor-ah,ah

初始化整个
ax
后,您可以将
add al,#i
更改为16b variant
add ax,#i
,或者从两个8b add指令中编写相同的内容,作为
add al,#i
(当结果溢出8b时,设置的CF=Carry标志)
adc ah,0
(将CF添加到ah)

试着将这一点应用到迈克的回答中,如果你仍然迷路,那就买一些好书/教程/讲座


你怎么能问这样的问题:“那么唯一可能的寄存器是AX和EAX?”?这意味着您没有阅读(或理解)任何关于x86汇编程序的内容。但是你已经在试着写代码了?首先深入研究一些讲座,只需几周时间就可以将一些好书或讲座笔记重读几遍,然后一切都会变得更有意义。目前,如果不仔细阅读课堂上的内容,就很难回答您的问题。

提示:260>256。你不能这么做。我知道,但有人告诉我,有一种方法可以使用MOVZX来做到这一点?谢谢。如果你不使用AL,而是AX,你可以得到260。最坏的情况,啊:AL(相同的寄存器以不同的方式查看)。八位运算,然后零扩展,这是行不通的。啊,我明白了。“移动ax,0开始”是什么意思?那么唯一可能的寄存器是AX和EAX?谢谢。我很抱歉,但是代码是这样的:TITLE Add(AddSub.asm)包括Irvine32.inc.代码main PROC mov al,20d Add al,30d Add al,50d adc al,160d mov al,0FFh Add al,1;CF=1,AL=00 call DumpRegs call writedec exit main ENDP END main非常感谢您的帮助,我是组装新手,非常熟悉。请原谅我。谢谢,嗯,没有。
mov-al,0FFh-add-al,1
没有意义。您只需要
adc ah,0
,前提是
ah
在添加之前已经为零。再读一遍我的答案。答案是:movzx-ah,0 mov-al,20d-add-al,30d-add-al,50d-add-al,160d-ADC-ah,0谢谢你的帮助。这或多或少是个问题,除了你需要
movzx-ah
而不是
movzx-ax,20.
或者你只需要
mov-ah,0
xor-ah,ah
所有这些都将清除
ah
。但你为什么要问?你就不能试试吗?